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

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

  • 我有两个分支:master和XBranch
  • 两者中都有一个文件src/a.txt。它的内容是“旧内容”
  • 在XBranch中,我使用mvgit rmgit add将src/a.txt重命名为src/b.txt。
  • 在主目录中,将文件重命名为a.txt。在提交期间我做了git rm src/a.txt,但是忘了做git add src/b.txt在母版中,我这样做:git rm src/a.txtgit commit
  • 在主版本中,我将文件b.txt的内容编辑为“New Content
  • 在主站中,我执行git add src/b.txtgit commit
  • 在主站中,我这样做:git merge XBranch

  • 文件src/b.txt发生冲突,这是完全可以理解的。
    但是内容是“Old Content”。为什么?

    为什么不这样:
    <<<<<<< HEAD
    New Content
    =======
    Old content
    >>>>>>> XBranch
    

    命令 list :
    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
    

    最佳答案

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

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

  • 解决冲突时,实际上是选择一个文件或
    其他(文件中没有一行)。因此,结果中的“旧内容”
    文件。

    OP在注释中添加:



    这次,两棵树(分支masterXBranch中的case2目录)
    引用一个新文件a.txt:其内容被 merge ,但有冲突
    解析度。以前,a.txt之间存在冲突
    (重命名为b.txt)和新的 b.txt :这两个文件不能存在于
    在同一分支中,必须做出选择(选择文件,而不选择文件内容)。



    这意味着:
  • 而不是将XBranch(a.txt重命名为b.txt) merge 到master提交
    与第6步中的新b.txt(树冲突),
  • 您将 merge XBranch(将a.txt重命名为b.txt)与新的master merge
    第4步(a.txt也重命名为b.txt):相同的树内容,但不同
    blob内容
    :行冲突。


  • 话虽如此,OP仍然认为必须存在一个错误:
  • git mailing-list question
  • GitHub support question


  • 注意:Git 2.18(2018年第二季度)使用 merge 递归更改了冲突检测报告。
    参见commit 6e7e027Elijah Newren ( newren )(2018年4月19日)。



    当二进制文件被修改并在历史记录的两侧重命名到不同的位置时,两个文件都将被写入工作树,但是两个文件的内容均来自“ours”。

    Git 2.27(2020年第2季度)已对此进行了更正,以使来自每一侧的路径都具有其原始内容。

    参见commit 95983daElijah Newren ( newren )(2020年5月13日)。
    (由Junio C Hamano -- gitster --commit abbd1d9中 merge ,2020年5月20日)

    关于git - git重命名/删除困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3100032/

    10-13 07:44
    查看更多