git重命名/删除混淆

时间:2010-06-23 08:25:13

标签: git git-merge

我对某个特定的git行为感到困惑:

以下是步骤和情况(稍后还会给出命令列表):

  1. 我有两个分支:master和XBranch
  2. 两者都有一个文件src / a.txt。它的内容是“旧内容”
  3. 在XBranch中,我使用:mvgit rmgit add将src / a.txt重命名为src / b.txt。
  4. 在master中重命名文件a.txt。在提交期间,我做了git rm src/a.txt但忘了做git add src/b.txt 掌握我做的事:git rm src/a.txtgit commit

  5. 在master中,我将文件b.txt的内容编辑为“New Content

  6. 在掌握中,我会git add src/b.txtgit commit
  7. 掌握我做的事:git merge XBranch
  8. 文件src / b.txt冲突,这是完全可以理解的。 但内容为“Old Content”。为什么呢?

    为什么是这样的:

    <<<<<<< HEAD
    New Content
    =======
    Old content
    >>>>>>> XBranch
    

    命令列表:

    sabya@SABYA-PC d:/merge_temp/test/case2
    $ mkdir source
    
    sabya@SABYA-PC d:/merge_temp/test/case2
    $ git init
    Initialized empty Git repository in d:/merge_temp/test/case2/.git/
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ mkdir src
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ vi src/a.txt
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ cat src/a.txt
    Old Content
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ git add src/
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ git commit
    [master (root-commit) 148500e] added src/a.txt
     1 files changed, 1 insertions(+), 0 deletions(-)
     create mode 100644 src/a.txt
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ git branch XBranch
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ git checkout XBranch
    Switched to branch 'XBranch'
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
    $ mv src/a.txt src/b.txt
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
    $ git rm src/a.txt
    rm 'src/a.txt'
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
    $ git add src/b.txt
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
    $ git commit
    [XBranch b3ff8fa] changed a.txt to b.txt in XBranch
     1 files changed, 0 insertions(+), 0 deletions(-)
     rename src/{a.txt => b.txt} (100%)
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
    $ git checkout master
    Switched to branch 'master'
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ mv src/a.txt src/b.txt
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ git rm src/a.txt
    rm 'src/a.txt'
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ git commit
    [master bfeaecb] removed src/a.txt
     1 files changed, 0 insertions(+), 1 deletions(-)
     delete mode 100644 src/a.txt
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ vi src/b.txt
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ cat src/b.txt
    New Content
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ git add src/b.txt
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ git commit
    [master 2361d5e] changed content of b.txt
     1 files changed, 1 insertions(+), 0 deletions(-)
     create mode 100644 src/b.txt
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master)
    $ git merge XBranch
    CONFLICT (rename/delete): Rename src/a.txt->src/b.txt in XBranch and deleted in HEAD
    Automatic merge failed; fix conflicts and then commit the result.
    
    sabya@SABYA-PC d:/merge_temp/test/case2 (master|MERGING)
    $ cat src/b.txt
    Old Content
    

1 个答案:

答案 0 :(得分:6)

存在冲突,但与文件内容无关。这是关于 内容。

  • 在一个树中,case2目录(在主目录中)有一个文件b.txt
  • 在同一目录中(在XBranch中),有一个重命名的文件a.txt => b.txt

当您解决冲突时,您实际上选择了一个文件或 其他(文件中不是一行)。因此产生了“旧内容” 文件。


OP在评论中添加:

  

但那么它在逻辑上与以下情况有何不同:

     
      
  1. 我在a.txt中添加了一个带有“旧内容”的文件master并提交。
  2.   
  3. 我在a.txt中添加了一个文件XBranch和“新内容”并提交。
  4.   
  5. 我将XBranch合并到master。   这次它显示该文件中的两个内容!
  6.   

这一次,两个树(分支masterXBranch中的case2目录) 引用 new 文件a.txt:其内容与冲突合并 解析度。之前,a.txt之间存在冲突 (重命名为b.txt)和 b.txt :这两个文件都不能存在于 同一个分支,必须选择(文件,而不是文件内容)。

  

在我的问题的第4步中,如果我在一个单词中执行“git rm”和“git add”   提交,它按我的预期工作!我现在不明白。   如何预测文件何时包含两个内容?   当它只有XBranch的内容时,它什么时候才会有。{1}}   内容master

这意味着:

  • 而不是将XBrancha.txt重命名为b.txt)合并到master提交 使用步骤6中的新b.txt(树的冲突),
  • 您要将XBrancha.txt重命名为b.txt)与来自新的主人合并 第4步(a.txt 也将重命名为b.txt):相同的树内容,但不同 blob内容:线条冲突。

话虽如此,OP仍然认为必定存在错误:


注意:Git 2.18(2018年第二季度)使用合并递归更改冲突检测报告 请commit 6e7e027查看Elijah Newren (newren)(2018年4月19日)。

  

merge-recursive:避免来自dir重命名

的虚假重命名/重命名冲突      

如果历史记录一侧的文件已重命名,并且仅在该文件上进行了修改   另一方面,然后将目录重命名应用于修改的一方给我们   rename/rename(1to2)冲突   我们只应将目录重命名应用于表示添加或重命名的对。

     

进行此更改意味着目录重命名测试用例   以前报告为rename/delete冲突的现在将报告为a   modify/delete冲突