0

使用git,我想检查来自特定提交的哪些差异(如果有)已应用于(以及在何处)应用于特定分支。

cherry-pick当您选择提交并且仅应用尚未应用于该分支的差异时,会执行此操作(“where”部分除外)。例如,如果我将两个文件更改提交到一个主题分支,我手动将其中一个相同的文件更改应用到 master,当我挑选具有从主题到 master 的两个文件差异的提交时,它只应用未应用的差异。为了证明这一点,从一个空文件夹运行以下命令并查看最终的差异输出:

git init
echo file 1 > file1.txt
git add .
git commit -m "Initial commit"
git branch topic
echo file 1.1 > file1.txt
git add .
git commit -m "Change file1.txt on master"
git checkout topic
echo file 1.1 > file1.txt
echo file 2 > file2.txt
git add .
git commit -m "Change file1.txt and add file2.txt on topic"
git tag to-cherrypick
git checkout master
git cherry-pick --no-commit to-cherrypick
git diff --cached

差异输出是:

diff --git a/file2.txt b/file2.txt
new file mode 100644
index 0000000..6bb4b1d
--- /dev/null
+++ b/file2.txt
@@ -0,0 +1 @@
+file 2

表明即使精心挑选的提交有两个文件更改,它检测到第一个已被应用。

所以我的问题是:git 是否有一个暴露的管道(或介于管道和瓷器之间的某个位置)命令,它将查看提交中的大块并检查另一个分支中的每个大块,显示应用每个大块的提交?

如果该命令不存在,有什么途径可以找到它?我已经在考虑编写一个脚本/程序来将提交分解成它的块,在每个上运行 patch-id 或类似的东西,然后从共同祖先开始循环遍历另一个分支并对每个提交执行相同的操作,并且比较帅哥。如果它已经暴露,我想避免写它——我知道它存在,因为cherry-pick 这样做(除了显示“位置”)。

更新: git cherry会做一些我正在寻找的东西。它会告诉我一个分支中的哪些提交具有一个或多个尚未应用于另一个分支的差异块。它不会告诉您在哪里应用了这些差异大块,或者提交是否有应用的大块和其他未应用的块。

4

1 回答 1

0

如评论:

使用相对简单的脚本可以得到最好的结果是分离出每个差异块(实现add -preset -p执行此操作的 perl 代码),运行它git patch-id(Git 中的多个内部位置执行此操作,包括git rerere),并将补丁 ID 保存在某处以便你可以比较它们。

首先:没有任何 Git 命令的“perl”版本。
一切都用 C 重写了。

例如,作为Git 2.25(2019 年第四季度)git add -p的一部分重写了 inc C (提交 f6aa7ec

其次,如果您正在使用git patch-id,请确保使用 Git 2.36 (Q2 2022)。

与 " git apply" ( man )不同," git patch-id" ( man )不处理包含在前映像或后映像中只有 1 行的块的补丁,这已使用 Git 2.36(2022 年第二季度)进行了更正。

请参阅Jerry Zhang ( ) 的提交 757e75c提交 56fa5ac(2022 年 2 月 1 日(由Junio C Hamano 合并 -- --d077db1 提交中,2022 年 2 月 17 日)jerry-skydio
gitster

patch-id: 修复scan_hunk_header1 行之前/之后的差异

签字人:Jerry Zhang

通常差异将包含格式为“ @@ -2,2 +2,15 @@ code”的大块标题。
但是,当只有 1 行更改时,统一差异格式允许在行数之前或之后省略第二个逗号分隔值。

@@ -2 +2,18 @@ code这可以产生看起来像“ ”或“ ”的大块头@@ -2,2 +2 @@ code
结果,scan_hunk_header错误地将行号返回为 line count,这会导致补丁的其余部分出现不可预测的解析错误,包括为单个提交提供多行输出。

通过在没有逗号时将行数显式设置为 1 来修复,并添加测试。

apply.c包含相同的逻辑,但它是正确的。
一个有价值的未来项目可能是统一这两个差异解析器,以便它们都从修复中受益。

于 2022-02-20T10:49:51.080 回答