为什么`git checkout -m`不合并就成功了?

时间:2019-01-15 20:15:42

标签: git

Git Pocket Guide

  

Git在切换分支时会忽略未跟踪的文件,除非   文件存在于目标分支中;然后它会中止,即使版本   在工作树和目标分支中是相同的。您可以   使用--merge选项可以解决此问题,而不必删除   取消跟踪的文件,只是让Git过一会儿将其还原。的   在这种情况下,合并操作将结果保存在同一文件中。

在分支master上,我有一个跟踪文件hellofile

$ git branch 
  feature2
* master
$ cat hellofile 
hello
$ git status
On branch master
nothing to commit, working tree clean

在分支feature2上,它没有文件hellofile,我创建了它,但未跟踪它

$ git checkout feature2
$ ls
common  reader  README  writer
$ echo "world" > hellofile

然后我尝试检出master。可以理解,git checkout将失败,但是-m成功。但是,为什么git checkout -m不合并就成功了? (我希望文件hellofile有明显的冲突)

$ git checkout master
error: The following untracked working tree files would be overwritten by checkout:
    hellofile
Please move or remove them before you switch branches.
Aborting
$ git branch
* feature2
  master

$ git checkout -m master
error: Dirty index: cannot merge (dirty: f2f hellofile)
Switched to branch 'master'
$ cat hellofile 
hello

1 个答案:

答案 0 :(得分:3)

这里的问题是hellofile中没有跟踪feature2,而master中却存在-mgit checkout --ours是为两个分支设计的,它们对跟踪的文件进行了一些更改。现在,此更改可能会也可能不会进行,但会在我们的工作树中进行跟踪。相反,我希望如果两个分支都添加并提交了该文件的某个版本是有意义的,那么我们将存在标准冲突。

如果两个分支中的文件均未至少跟踪 ,则3向合并似乎可以解决$ echo "world" > hellofile $ git checkout -m master 冲突,更多内容请参见讨论部分。 。

也就是说,在您的示例中,

hellofile

您实际上(不是实际上)说要忽略当前工作目录的未跟踪文件中的更改。但是,如果您一直在两个分支上跟踪$ `echo "world" > hellofile" $ `git add hellofile` 并进行了修改,

<<<<<<< master
hello
=======
world
>>>>>>> local

您会遇到一个看起来更像这样的冲突:

int j = 0;
int i1 = j*5+ ++j;
System.out.println("j =" + j);
System.out.println("i1 =" + i1);

我要假设这就是你要的;它已正确标记为合并冲突。但是,您所做的更改未提交到两个分支机构。


讨论

The documentation并不是说这是故意的,但是您的问题显然是行为。我认为这可能是他们的疏忽/错误。

  

“但是,使用此选项,将完成当前分支,您的索引文件和新分支之间的三向合并,并且您将位于新分支上。”

在阅读了这篇文章:Can I use git diff on untracked files?之后,我将假定合并方案中实际发生的事情是工作目录文件在索引中实际上没有有效的Blob,因此可以将其视为合并,因此所有目的和目的都被“忽略”。

编辑:这是一个刚刚提出的问题,带有类似的难题:Why does git checkout <<file>> not work when the same file is in index?