git rebase“被我们删除”和“被他们删除”

时间:2014-12-11 10:10:09

标签: git git-rebase

假设我在上重新定位实验分支,并且文件中存在冲突。当然,两个分支都删除了文件。因此,当我解决冲突时,在git status我看到deleted by usdeleted by them。它非常令人困惑。有什么办法可以理解他们的意思吗?谁他们谁是我们

或者在重新定位时有另一种方法可以知道哪个文件被哪个分支删除了?喜欢打印分支名称吗?

2 个答案:

答案 0 :(得分:47)

参考文档

  

请注意,rebase合并的工作原理是重播每个提交   <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

AFAIK没有用官方工具明确显示分支的特定名称的开关。除非我错了,否则这只是你需要学习以解决最初困惑的事情之一。

值得赞扬的是,如果你仔细想想它确实很有意义。

更多迂腐分析

手册页的文本有点含糊不清,因为只有在使用--merge选项时才能将其解释为相关。第二次提及--strategy中的行为会加剧这种情况:“注意我们和他们的反转,如上面针对-m选项所述。”

但是,我认为这与使用--merge时git-rebase的行为形成鲜明对比;相反,我认为它与git-rebase与git-merge的行为形成鲜明对比。 MERGE STRATEGIES部分显然是从git-merge手册页中删除的,因此很容易想象作者在使用rebase时需要强调交换,因为在该部分中没有提到。对我来说,下面的句子证实了这种解释:“[...] git rebase使用给定的策略[...] 重放分支顶部工作分支的每个提交。< / p>

虽然我们现在明白合并策略应该对双方没有影响(只有git-merge与git-rebase的选择应该),但我会注意到默认策略隐含的--merge无论如何(使默认行为完全不含糊不清)。

答案 1 :(得分:18)

以下是关于类似问题的SzG's answer的副本:

  

合并时,us指的是您要合并的分支,如   与them相对,即要合并的分支。

     

rebase 时,us引用上游分支,them是   你正在走动的分支。在a的情况下,这有点违反直觉   变基

     

原因是git使用相同的合并引擎进行rebase,就是这样   实际上是把你的东西挑选到上游分支。 us =   into,them = from。