繁体   English   中英

为什么`git checkout -m`没有合并成功?

[英]Why does `git checkout -m` succeed without merge?

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

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

如果至少不在两个分支中都跟踪该文件,则3-way合并似乎可以通过git checkout --ours解决冲突- git checkout --ours ...更多内容请参见讨论部分。

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

$ echo "world" > hellofile
$ git checkout -m master

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

$ `echo "world" > hellofile"
$ `git add hellofile`

您会发现看起来更像这样的冲突:

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

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


讨论

文档没有说这是故意的,但是您的问题显然是行为。 我认为这可能是他们的疏忽/错误。 他们似乎的意思是

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

看完这篇文章后: 我可以在未跟踪的文件上使用git diff吗? ,我将假设合并方案中实际发生的事情是工作目录文件实际上在索引中没有有效的Blob,因此无法将其视为要合并的东西,因此无论出于何种目的和目的,“ ”。

编辑:这是一个刚刚提出的问题,具有类似的难题: 为什么当同一文件在索引中时git checkout << file >>不起作用?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM