有关于特定混帐行为的一个困惑我:git的重命名/删除混乱
下面是步骤和情况(命令的列表也被后面给出):
- 我有两个分支:主人和XBranch
- 他们都有一个文件src/a.txt。它的内容是“旧内容”
- 在XBranch中,我使用:
mv
,将src/ 在master中重命名文件a.txt。在提交我没有
git rm src/a.txt
却忘了做git add src/b.txt
在主我做的:git rm src/a.txt
和git commit
在主,我编辑的文件b.txt的内容,以“
New Content
- 在主我做
git add src/b.txt
和git commit
- 在主我做的:
git merge XBranch
文件src/b.txt冲突,这是完全未derstandable。 但内容是“Old Content
”。为什么?
为什么不是这样的:
<<<<<<< HEAD
New Content
=======
Old content
>>>>>>> XBranch
命令列表:
[email protected] d:/merge_temp/test/case2
$ mkdir source
[email protected] d:/merge_temp/test/case2
$ git init
Initialized empty Git repository in d:/merge_temp/test/case2/.git/
[email protected] d:/merge_temp/test/case2 (master)
$ mkdir src
[email protected] d:/merge_temp/test/case2 (master)
$ vi src/a.txt
[email protected] d:/merge_temp/test/case2 (master)
$ cat src/a.txt
Old Content
[email protected] d:/merge_temp/test/case2 (master)
$ git add src/
[email protected] 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
[email protected] d:/merge_temp/test/case2 (master)
$ git branch XBranch
[email protected] d:/merge_temp/test/case2 (master)
$ git checkout XBranch
Switched to branch 'XBranch'
[email protected] d:/merge_temp/test/case2 (XBranch)
$ mv src/a.txt src/b.txt
[email protected] d:/merge_temp/test/case2 (XBranch)
$ git rm src/a.txt
rm 'src/a.txt'
[email protected] d:/merge_temp/test/case2 (XBranch)
$ git add src/b.txt
[email protected] 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%)
[email protected] d:/merge_temp/test/case2 (XBranch)
$ git checkout master
Switched to branch 'master'
[email protected] d:/merge_temp/test/case2 (master)
$ mv src/a.txt src/b.txt
[email protected] d:/merge_temp/test/case2 (master)
$ git rm src/a.txt
rm 'src/a.txt'
[email protected] 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
[email protected] d:/merge_temp/test/case2 (master)
$ vi src/b.txt
[email protected] d:/merge_temp/test/case2 (master)
$ cat src/b.txt
New Content
[email protected] d:/merge_temp/test/case2 (master)
$ git add src/b.txt
[email protected] 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
[email protected] 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.
[email protected] d:/merge_temp/test/case2 (master|MERGING)
$ cat src/b.txt
Old Content
但随后逻辑上是如何从以下情况不同: 1.我用“旧内容”在主文件中添加一个文件a.txt并提交它。 2.我在XBranch中用“New Content”添加一个文件a.txt并提交它。 3.我将XBranch合并到master中。 这一次它显示了该文件中的两个内容! – Sabya 2010-06-23 12:28:30
@Sabya:这次,树(分支'master'和'XBranch'中的case2'目录)引用* new *文件'a.txt':其内容通过冲突解决方式合并。之前,** a.txt **(重命名为“b.txt”)和** ** b.txt **之间存在冲突**:两个文件不能存在于同一分支中, (文件,而不是文件内容)必须被制作。 – VonC 2010-06-23 12:34:14
在我的问题的第4步中,如果我在一次提交中执行“git rm”和“git add”,它将按我的预期工作! 我现在不明白。我该如何预测文件何时会同时存在两个内容?何时才会拥有XBranch的内容,何时才会拥有主人的内容? – Sabya 2010-06-24 04:39:51