我对特定的git行为感到困惑:
以下是步骤和情况(稍后还会提供命令列表):
mv
,git rm
,git add
将src/a.txt重命名为src/b.txt。 git rm src/a.txt
,但是忘了做git add src/b.txt
在母版中,我这样做:git rm src/a.txt
和git commit
New Content
git add src/b.txt
和git 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
a.txt => b.txt
解决冲突时,实际上是选择一个文件或
其他(文件中没有一行)。因此,结果中的“旧内容”
文件。
OP在注释中添加:
这次,两棵树(分支
master
和XBranch
中的case2目录)引用一个新文件
a.txt
:其内容被 merge ,但有冲突解析度。以前,
a.txt
之间存在冲突(重命名为
b.txt
)和新的 b.txt :这两个文件不能存在于在同一分支中,必须做出选择(选择文件,而不选择文件内容)。
这意味着:
XBranch
(a.txt
重命名为b.txt
) merge 到master
提交与第6步中的新
b.txt
(树冲突),XBranch
(将a.txt
重命名为b.txt
)与新的master merge 第4步(
a.txt
也重命名为b.txt
):相同的树内容,但不同blob内容:行冲突。
话虽如此,OP仍然认为必须存在一个错误:
注意:Git 2.18(2018年第二季度)使用 merge 递归更改了冲突检测报告。
参见commit 6e7e027的Elijah Newren (
newren
)(2018年4月19日)。当二进制文件被修改并在历史记录的两侧重命名到不同的位置时,两个文件都将被写入工作树,但是两个文件的内容均来自“
ours
”。Git 2.27(2020年第2季度)已对此进行了更正,以使来自每一侧的路径都具有其原始内容。
参见commit 95983da的Elijah Newren (
newren
)(2020年5月13日)。(由Junio C Hamano --
gitster
--在commit abbd1d9中 merge ,2020年5月20日)关于git - git重命名/删除困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3100032/