如何获得这两个git提交之间的交叉?

如何获得这两个git提交之间的交叉?,git,Git,我试图在git中查看同一提交的两个版本之间的差异。基本上是一种差异的差异。据我所知,这就是所谓的“阻隔”。我已经阅读了一些关于如何创建git补丁的交叉口的教程,但是我还没有能够在我的特定情况下使用这些方法 这就是设置。我有两个分支,每个分支的提交略有不同: * 29e734f - (origin/feature_branch, new_commits) New commit 3 (69 minutes ago) <Ajedi32> * b22ebea - New commit 2 (

我试图在git中查看同一提交的两个版本之间的差异。基本上是一种差异的差异。据我所知,这就是所谓的“阻隔”。我已经阅读了一些关于如何创建git补丁的交叉口的教程,但是我还没有能够在我的特定情况下使用这些方法

这就是设置。我有两个分支,每个分支的提交略有不同:

* 29e734f - (origin/feature_branch, new_commits) New commit 3 (69 minutes ago) <Ajedi32>
* b22ebea - New commit 2 (89 minutes ago) <Ajedi32>
* 09d42c2 - New commit 1 (2 hours ago) <Ajedi32>
| * 467e08f - (old_commits) Old commit 3 (4 weeks ago) <Ajedi32>
| * f2bf1cb - Old commit 2 (4 weeks ago) <Ajedi32>
| * 34a2187 - Old commit 1 (4 weeks ago) <Ajedi32>
|/  
*   1b05a4a - (origin/base, base) Base commit (5 weeks ago) <Ajedi32>
我真的不知道那是什么意思,所以我现在有点困了。我该怎么办


注意:我不是在这里查找git diff old\u commits new\u commits。我不希望在输出中包含对提交1和2的修订。

也许这会给您一些您想要的东西。但如果提交1-2-3非常依赖,它将失败

$ git checkout 'old commit 2'
$ git cherry-pick -n 'new commit 3'
$ git diff 'old commit 3'

$ git checkout 'new commit 2'
$ git cherry-pick -n 'old commit 3'
$ git diff 'new commit 3'

也许是这样的:

git log -p -1 new_commits > patch.new
git log -p -1 old_commits > patch.old
diff patch.old patch.new
# move to the parent of NC3 - entering detached HEAD state
git checkout NC3~1
# merge-rebase the single patch <Old-commit-3> onto here
git cherry-pick OC3
# show the diff or reverse diff (or diff in gitk GUI)
git diff -R NC3
# back to feature_branch
git checkout feature_branch
或者对于简洁的单行程序(在
bash
中):


diff如果两次提交之间几乎没有差异,则比较删除的行和添加的行(即仅以+或-)是有效的。它消除了以@开头的大块边界或提交消息体引入的噪声,这些噪声并不重要:

diff -u --ignore-matching-lines '^[^+-]' \
    <(git show 1d9e4ac) <(git show 7b8e5c9)
diff-u——忽略匹配行“^[^+-]”\
规则[i]->mask.ruleset==规则集){
++返回true;
++     }
++    }
++
++返回false;
++  }
++
+  /**
+*返回“type”类型的编号最低的规则集`
+   *

Git 2.19引入了一个新命令,该命令可执行以下操作:

git range diff-比较两个提交范围(例如,分支的两个版本)

将自动将
旧提交
分支中的提交与
新提交
分支中的提交进行匹配,并显示每个提交之间差异的摘要

或者,如果您只想从这些分支中的最后一次提交中获得更改,您可以运行:

git range-diff old_commits~..old_commits new_commits~..new_commits

有关范围差异的更多信息,请参阅。

您的两个补丁上的GNU中断失败,因为它们没有直接的公共基/父

虽然
git range diff
会产生一个外部diff(通常很难读取;对于以前提交中已使用/合并的更改不了解/不一致;不是适用的补丁格式),但通过将一个提交的副本合并到另一个提交的父级上,可以获得一个有效的可读性很好的交叉(最好更新)提交。有几种方法

在您的示例中,比较
并不重要,因为它们已经有了一个直接公共父级

diff NC1 OC1
远离共同基础,根据您的实际问题,我们得到如下示例:

git log -p -1 new_commits > patch.new
git log -p -1 old_commits > patch.old
diff patch.old patch.new
# move to the parent of NC3 - entering detached HEAD state
git checkout NC3~1
# merge-rebase the single patch <Old-commit-3> onto here
git cherry-pick OC3
# show the diff or reverse diff (or diff in gitk GUI)
git diff -R NC3
# back to feature_branch
git checkout feature_branch
#移动到NC3的父级-进入分离头部状态
git校验NC3~1
#合并将单个补丁重新设置到此处
git cherry pick OC3
#显示差异或反向差异(或GitkGUI中的差异)
git diff-R NC3
#返回要素库分支
git签出功能\u分支
当然,合并冲突可能会出现在这里——由于缺少真正的直接公共父级,这(必然)会暴露出与某种“虚拟公共基础”的交叉不兼容的更改


可以创建一个(临时)标记或分支来保存此重新基准的比较提交(或提交范围)-例如,用于与其他用户讨论和工作。否则,临时的未引用悬挂提交很快就会被自动回收。

哦,这取决于OP想问的可能与之相关。出于好奇,这些差异对你有什么好处?@Shahbaz你的意思是它有什么用处?我使用它是为了让审查我的代码的人更容易看到我根据以前的审查所做的更改。是tu之一吗我遵循的是保守党。在页面顶部附近有一个很好的解释,解释了为什么interdiffs是有用的。@Shahbaz,或者你是在问如果我通过
diff
命令运行diff的内容会发生什么?在这种情况下,我不确定,但我怀疑它是否会很好。@mnagel从最初的问题:“注意:我不是在这里寻找
git diff old_commits new_commits
。我不希望提交1和2的修订包含在输出中。”因此,如果“old commit 1”和“new commit 1”之间有一些细微的区别",我不希望包含这些更改。我正在区分修补程序,而不是repo的状态。用于一行程序的bash语法是使用
git log
而不是
git show
,即类似于
diff@doak Good point的东西-似乎输出是相同的,至少在
git的版本上是如此我目前正在使用…可能是这样,也可能不是这样,不过…@talberg,我很确定这是真的,因为至少10年了,至少在接下来的20年里也是如此;)来自
man git show
:“对于提交,它显示日志消息和文本差异。”这一行代码实际上似乎与posix兼容
git range-diff old_commits~..old_commits new_commits~..new_commits
diff NC1 OC1
# move to the parent of NC3 - entering detached HEAD state
git checkout NC3~1
# merge-rebase the single patch <Old-commit-3> onto here
git cherry-pick OC3
# show the diff or reverse diff (or diff in gitk GUI)
git diff -R NC3
# back to feature_branch
git checkout feature_branch