2010-06-23 60 views
6

有关于特定混帐行为的一个困惑我:git的重命名/删除混乱

下面是步骤和情况(命令的列表也被后面给出):

  1. 我有两个分支:主人和XBranch
  2. 他们都有一个文件src/a.txt。它的内容是“旧内容”
  3. 在XBranch中,我使用:mv,将src/
  4. 在master中重命名文件a.txt。在提交我没有git rm src/a.txt却忘了做git add src/b.txt 在主我做的:git rm src/a.txtgit commit

  5. 在主,我编辑的文件b.txt的内容,以“New Content

  6. 在主我做git add src/b.txtgit commit
  7. 在主我做的: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 

回答

6

有冲突,但不是关于文件内容。它是关于 内容。

  • 在一棵树,在case2目录(主机),有一个文件b.txt
  • 在同一目录下(在XBranch),有一个改名为文件a.txt => b.txt

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


的OP加在评论:

但再怎么在逻辑上是由以下情况有所不同:

  1. 我添加一个文件a.txtmaster与“老内容”并提交它。
  2. XBranch添加文件a.txt与“新内容”并提交。
  3. 我合并XBranchmaster。 这一次它显示了该文件中的两个内容!

这一次,无论是树木 参考文件a.txt(分支机构masterXBranch的情况2目录):它的内容得到合并,冲突 分辨率。之前,有一个a.txt更名为b.txt)之间的冲突b.txt:这两个文件不能在 同一分支存在,选择(的文件,而不是文件内容)有被制造。

在我的问题的第4步,如果我做“git rm”,并在一个单一的 “git add”承诺,因为我希望它的作品!我现在不明白这一点。 如何预测文件何时会包含这两个内容? 当它只会有XBranch的内容和它的时候将刚才的 内容的master

这意味着:

  • ,而不是合并XBrancha.txt更名为b.txt),以master提交 从第6步(树的冲突)的新b.txt
  • 你会合并XBrancha.txt更名为b.txt)与来自新 步骤4(a.txt主也更名b.txt):同一棵树上的内容,但不同的 BLOB内容:线的冲突。

话虽这么说,在OP仍然认为必须有一个错误:

+0

但随后逻辑上是如何从以下情况不同: 1.我用“旧内容”在主文件中添加一个文件a.txt并提交它。 2.我在XBranch中用“New Content”添加一个文件a.txt并提交它。 3.我将XBranch合并到master中。 这一次它显示了该文件中的两个内容! – Sabya 2010-06-23 12:28:30

+0

@Sabya:这次,树(分支'master'和'XBranch'中的case2'目录)引用* new *文件'a.txt':其内容通过冲突解决方式合并。之前,** a.txt **(重命名为“b.txt”)和** ** b.txt **之间存在冲突**:两个文件不能存在于同一分支中, (文件,而不是文件内容)必须被制作。 – VonC 2010-06-23 12:34:14

+0

在我的问题的第4步中,如果我在一次提交中执行“git rm”和“git add”,它将按我的预期工作! 我现在不明白。我该如何预测文件何时会同时存在两个内容?何时才会拥有XBranch的内容,何时才会拥有主人的内容? – Sabya 2010-06-24 04:39:51