我对某个特定的git行为感到困惑:
以下是步骤和情况(稍后还会给出命令列表):
mv
,git rm
,git add
将src / a.txt重命名为src / b.txt。在master中重命名文件a.txt。在提交期间,我做了git rm src/a.txt
但忘了做git add src/b.txt
掌握我做的事:git rm src/a.txt
和git commit
在master中,我将文件b.txt的内容编辑为“New Content
git add src/b.txt
和git commit
git merge XBranch
文件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
答案 0 :(得分:6)
存在冲突,但与文件内容无关。这是关于 树 内容。
case2
目录(在主目录中)有一个新文件b.txt
a.txt => b.txt
当您解决冲突时,您实际上选择了一个文件或 其他(文件中不是一行)。因此产生了“旧内容” 文件。
OP在评论中添加:
但那么它在逻辑上与以下情况有何不同:
- 我在
a.txt
中添加了一个带有“旧内容”的文件master
并提交。- 我在
a.txt
中添加了一个文件XBranch
和“新内容”并提交。- 我将
醇>XBranch
合并到master
。 这次它显示该文件中的两个内容!
这一次,两个树(分支master
和XBranch
中的case2目录)
引用 new 文件a.txt
:其内容与冲突合并
解析度。之前,a.txt
之间存在冲突
(重命名为为b.txt
)和新 b.txt :这两个文件都不能存在于
同一个分支,必须选择(文件,而不是文件内容)。
在我的问题的第4步中,如果我在一个单词中执行“
git rm
”和“git add
” 提交,它按我的预期工作!我现在不明白。 如何预测文件何时包含两个内容? 当它只有XBranch
的内容时,它什么时候才会有。{1}} 内容master
?
这意味着:
XBranch
(a.txt
重命名为b.txt
)合并到master
提交
使用步骤6中的新b.txt
(树的冲突),XBranch
(a.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
冲突的现在将报告为amodify/delete
冲突。