要解决合并冲突,如何查看其他分支正在进行哪些更改?

时间:2013-08-15 18:58:01

标签: git

我使用git pull --rebase从存储库中提取了最新代码。我的本地提交与其中一个远程提交冲突。有问题的文件中有合并标记,所以我可以将我的版本与他们的版本进行比较,但我真正想知道的是另一个版本试图做出什么改变?我想将另一个变化与我们共同的祖先区别开来。我该怎么做?

3 个答案:

答案 0 :(得分:2)

你做了一个pull -rebase,所以你已经在你的本地分支(HEAD)上进行了“他们的”提交。在冲突发生之前,您可能已经应用了一些提交。因此,您可以按提交检查所有更改:

git log -p file

您可以通过添加共同祖先的修订范围来进一步缩小范围:

git log -p common..HEAD file

如果pull -rebase已经在冲突发生之前已经应用了2次提交(你在日志中看到它们是最后一次提交)并且希望看到对他们的共同祖先的“他们的”更改:

git log -p common..HEAD^^ file

答案 1 :(得分:1)

(编辑:唉,我的图表和说明都有破损,让我们解决它:)

此命令将显示他们更改的所有,您可能希望将更改隔离到这些提交中的特定提交或提交和/或文件集,但请考虑:

$ git diff $(git merge-base master origin/master) origin/master

(假设你在分支master)。这告诉git将共同的祖先提交与“他们的”头部提交进行比较。

这是一个关于正在发生的事情的粗略草图。假设您开始使用从A(您克隆的repo)获得的提交BCorigin。您提交了DE,他们提出了FG。你现在正处于冲突的变革中。 (我假设此处D的更改已成功重新定位,提交了提交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会找到提交C,这是rebase的共同点。

同时origin/master名称提交G。所以:

git diff <name-of-commit-C> origin/master

在两次提交FG中向您展示他们所做的一切(将G的内容与C的内容进行比较)。当然,您也可以使用git log查找单个提交,或使用origin/master~1等名称命名。您还可以git show origin/master查看最近的更改Ggit show origin/master~1以显示更改F

最后,如果您一旦解决了冲突并git rebase --continue并且它到达终点,git会将分支标签(master)移动到HEAD点的位置,并设置HEAD引用回master,而不是“超脱”。或者,如果您使用git rebase --abort,它将放弃新链,只需恢复旧master(之后您可以重新rebase。)

(顺便提一下,这是gitk等图形工具派上用场的一种情况。在冲突的rebase上提出gitk --allgitk HEAD master origin/master,通常很容易看出冲突的位置提交是。)

对于非常艰难的合并案例,有git-imerge,我还没有使用过(但是),但看起来非常好。

答案 2 :(得分:1)

在变基之前,请运行:

git config merge.conflictstyle diff3

the git-config man page中所述。这会导致git包含最新的共同祖先文本以及每个冲突的更改。