我从存储库中提取了最新的代码git pull --rebase
。我的本地提交与远程提交之一发生冲突。有问题的文件中有合并标记,所以我可以将我的版本与他们的版本进行比较,但我真正想知道的是另一个版本试图做出什么改变?我想将另一个变化与我们共同的祖先进行比较。我怎么做?
3 回答
您已经完成了 pull --rebase,因此您已经在本地分支 (HEAD) 上有了“他们的”提交。在冲突发生之前,您可能已经应用了一些提交。因此,您可以通过提交检查所有更改:
git log -p file
您可以通过添加共同祖先的修订范围来进一步缩小范围:
git log -p common..HEAD file
当 pull --rebase 在冲突发生之前已经应用了 2 个提交时(您将它们视为日志中的最后一次提交)并希望仅看到针对共同祖先的“他们的”更改:
git log -p common..HEAD^^ file
(编辑:啊,我有一个损坏的图表和描述,让我们修复它:)
此命令将显示它们更改的所有内容,您可能希望将更改隔离到特定提交或这些提交中的一组提交和/或文件,但请考虑执行以下操作:
$ git diff $(git merge-base master origin/master) origin/master
(假设你在分支上master
)。这告诉 git 将共同祖先提交与“他们的”头部提交进行比较。
这是正在发生的事情的粗略草图。假设您从 commits 开始A
,B
并C
从origin
(您克隆的 repo)获得。你提交了D
并且E
他们提交了F
and G
。你现在正处于一个冲突的变基中。(我假设这里的更改D
已成功重新设置,给出 commit D'
,问题出在E
。)这+i,w
意味着索引和/或工作目录中有尚未提交的内容 - 那是有冲突的提交,你需要解决。
D - E <-- master
/
A - B - C D' +i,w <-- HEAD (detached)
\ /
F - G <-- origin/master
在这种情况下,git merge-base master origin/master
找到 commit C
,即变基的共同点。
同时origin/master
名称提交G
。所以:
git diff <name-of-commit-C> origin/master
向您展示他们所做的一切,包括提交F
和G
(比较 的内容 和G
的内容C
)。当然,您也可以使用git log
来查找单个提交,或者使用origin/master~1
. 你也可以git show origin/master
看看他们最近的变化G
,并git show origin/master~1
展示他们的变化F
。
最终,如果一旦你解决了冲突并且git rebase --continue
它到达了终点,git 会将分支标签 ( master
) 移动到 whereHEAD
点,并设置HEAD
为重新引用master
,而不是“分离”。或者,如果您使用git rebase --abort
它,它将放弃新链并仅恢复您的旧链master
(您可以稍后重新rebase
)。
(顺便说一句,这是一种图形工具gitk
派上用场的情况。调出gitk --all
或gitk HEAD master origin/master
在一个冲突的 rebase 上,通常很容易看出冲突的提交在哪里。)
对于非常棘手的合并案例,有git-imerge,我还没有使用过,但看起来非常好。