1

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

4

3 回答 3

2

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

git log -p file

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

git log -p common..HEAD file

当 pull --rebase 在冲突发生之前已经应用了 2 个提交时(您将它们视为日志中的最后一次提交)并希望仅看到针对共同祖先的“他们的”更改:

git log -p common..HEAD^^ file
于 2013-08-15T19:08:26.067 回答
1

(编辑:啊,我有一个损坏的图表和描述,让我们修复它:)

此命令将显示它们更改的所有内容,您可能希望将更改隔离到特定提交或这些提交中的一组提交和/或文件,但请考虑执行以下操作:

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

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

这是正在发生的事情的粗略草图。假设您从 commits 开始ABCorigin(您克隆的 repo)获得。你提交了D并且E他们提交了Fand 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

向您展示他们所做的一切,包括提交FG(比较 的内容 和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 --allgitk HEAD master origin/master在一个冲突的 rebase 上,通常很容易看出冲突的提交在哪里。)

对于非常棘手的合并案例,有git-imerge,我还没有使用过,但看起来非常好。

于 2013-08-15T19:15:57.083 回答
1

在变基之前,运行:

git config merge.conflictstyle diff3

git-config 手册页中所述。这会导致 git 包含最近的共同祖先的文本以及每个冲突的更改。

于 2013-08-15T21:27:33.660 回答