git rebase "deleted by us" and "deleted by them"

71
假设我正在将 experiment 分支转移到 master 分支,但在文件中出现了冲突。当然,两个分支中都有文件被删除。因此,在解决冲突时,git status 中会显示 deleted by usdeleted by them,这非常令人困惑。有没有办法理解它们的含义?谁是 them,谁是us呢?
或者,在转移过程中,是否有其他方法可以知道哪个文件被哪个分支删除了?比如打印分支名称?
2个回答

65

参考文档

请注意,变基合并通过在 <upstream> 分支的顶部重新播放工作分支上的每个提交来完成。因此,当发生合并冲突时,我们报告的一方是迄今为止经过变基的系列,从 <upstream> 开始,而他们的一方是工作分支。换句话说,两边颠倒了。

https://git-scm.com/docs/git-rebase/2.17.0(最新:https://git-scm.com/docs/git-rebase

因此,“被我们删除”的文件是那些在您正在对其进行变基的分支上已删除的文件(即最终分支),而“被他们删除”的文件是在您正在变基的分支上已删除的文件(即将被删除的那个分支)。

演示

$ ls
a
$ git log --oneline --graph --decorate --all
* d055cdd (HEAD -> y) Write baz in a-file
| * 487dc8c (x) Write bar in a-file
|/  
* 3fa0da5 (master) Write foo in a-file
$ git rebase x
First, rewinding head to replay your work on top of it...
Applying: Write baz in a-file
Using index info to reconstruct a base tree...
M   a
Falling back to patching base and 3-way merge...
Auto-merging a
CONFLICT (content): Merge conflict in a
error: Failed to merge in the changes.
Patch failed at 0001 Write baz in a-file
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
$ cat a
<<<<<<< HEAD
bar
=======
baz
>>>>>>> Write baz in a-file
$ git checkout --ours a
$ cat a
bar
$ git checkout --theirs a
$ cat a
baz
据我所知,官方工具没有显示分支名称的特定开关。除非我错了,否则这只是你需要学习和克服初始困惑的事情之一。
值得赞扬的是,如果你仔细思考,这确实是有道理的。
更严谨的分析
手册页面的文本有些含糊不清,因为它可能仅在使用--merge选项时相关。第二次提到此行为是通过--strategy: "请注意,对于-m选项,"ours"和"theirs"的反转如上所述."。这加剧了混淆。然而,我认为这不是将git-rebase在使用--merge时与不使用时的行为进行对比,而是将git-rebase与git-merge的行为进行对比。MERGE STRATEGIES部分显然是从git-merge手册页面复制的,因此可以想象作者觉得需要强调使用rebase时的交换,因为该部分没有提到。对我来说,下一句话确认了这种解释:"[...] git rebase replays each commit from the working branch on top of the branch using the given strategy [...]"。虽然我们现在明白了合并策略对两侧没有影响(只有选择git-merge与git-rebase的影响),但我要注意到默认策略隐含了--merge(使默认行为完全不含歧义)。

77
他们的观点很有道理,这句话原本应该是“归功于我们”,而不是“他们”。 :-) - Jon Burgess
13
说实话,如果他们仔细思考,这个观点是很有道理的。 - kkm
13
如果你好好想一想,它的确很有道理。但在将由你本人创建的分支进行变基时,它并不是那么合理。其中的“them=me”是指我自己。 - Cheeso
4
关键的洞察是rebase(变基)就像是检出上游分支,然后将当前分支的每个提交挑选到它上面。这样看来,工作分支(我们的)就是上游分支,而另一个分支(我们从中挑选)则是“外来”的分支(他们的)。一旦变基完成,git会在新分支上重置HEAD并检出它。这是一个非常机械化/程序化的理解,但我坚持认为,“值得称赞的是,如果他们思考一下,它确实很有道理”;)。 - tne
1
@sampablokuper 引用中的措辞肯定不如它应该清晰,但我在参考文档中找不到另一个引用。我尝试了对文本的更严谨解释,希望能更有说服力地确认无论是否使用“--merge”,引用都是相关的。默认情况下会隐含使用--merge,但如果您想更充分地确信而使用非默认策略来测试rebase冲突解决,则可以自由进行测试。如果您能找到更好的措辞,欢迎为refdocs提交一个小补丁,我会支持你的。 - tne
显示剩余2条评论

27
以下是类似问题的SzG的回答副本:

当进行合并操作时,us指代你要合并到的分支,而不是要合并的分支 them

当进行变基操作时,us指代上游分支,them则为你正在移动的分支。这在变基的情况下有点不直观。

原因是git在变基时使用相同的合并引擎,实际上是将你的内容挑选出来放入上游分支中。 us=进入,them=来自。


1
另外:https://dev59.com/K3A75IYBdhLWcg3w4tV7#3052118 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接