情况图片:您从远程存储库获取并运行带有一些未暂存文件的远程源的git合并。
git merge如何处理未停止的文件?
答案 0 :(得分:3)
假设您在工作目录中有example.md
非暂存文件,并尝试合并已跟踪origin/remote1
的{{1}} :
尝试合并时,您将收到以下错误:
example.md
即使文件内容相同,也会发生这种情况。
TLDR: error: The following untracked working tree files would be overwritten by merge:
example.md
Please move or remove them before you merge.
Aborting
阻止您合并,如果工作目录中当前未跟踪的文件 >被合并覆盖。
git merge
将仅阻止合并,如果远程对您在本地修改的文件没有更改,则合并将完成<强>没有任何问题。
答案 1 :(得分:2)
这一切都放在一边; AnimiVulpis' answer没问题。换句话说,这应该是一个评论,但它太大了,不适合作为评论。 : - )
您需要更仔细地定义“非暂存文件”的含义。
在Git中,始终有三件重要的事情要记在脑海中:
哪个提交是当前提交,即现在HEAD
中的内容是什么?通常HEAD
包含分支的名称,分支名称本身包含提交的哈希ID。然后该哈希ID是当前提交。
目前索引中有什么内容?索引(也称为临时区域或有时是缓存)包含将进入 next 提交的内容。如果您现在进行新的提交,现在索引中的任何内容都将成为该新提交的内容。
现在工作树中有什么内容?工作树是最容易看到的东西,因为它包含您的计算机具有的正常形式的所有文件。所有你需要做的就是看,它们就在那里。
索引有点难以看清,因为Git主要通过将其与当前提交和工作树进行比较来向您展示。但通常,最初,它包含与当前提交相同的所有文件,采用特殊的面向Git的格式,使Git快速。但是,在git add
文件之后,该文件的索引版本将从工作树版本中复制出来。现在它匹配工作树文件而不是HEAD
文件。这就是大多数文档和人们调用暂存文件的原因:将它从工作树复制到索引中。
工作树中的某些文件可能根本不在索引和/或当前提交中。在某些情况下,这是您想要的:您希望工作树保存已编译的代码,或者文档中的PDF输出,或者其他任何内容,但您不希望代码获得提交。
工作树中但未在索引中的文件未跟踪。由于它未被跟踪,因此它不会在下一次提交中。但是git status
会抱怨它:“嘿,这个文件没有跟踪!你忘记了这个文件吗?最好添加这个文件,对吗?嗯?现在跟踪这个文件吧?Pester!Pester!Pester!”要让Git关闭此未跟踪文件,您可以将其列在.gitignore
文件中。然后Git知道未跟踪文件并不意味着抱怨。这是.gitignore
的大部分内容。特别是,如果跟踪 文件,则将其添加到.gitignore
完全没有效果。它仅适用于未跟踪的文件。一旦文件在索引中,你就会陷入困境:你必须明确删除它才能把它带走。
由于未跟踪的文件不在索引中,因此有些人也将此称为“未分级”。这就是为什么在谈论“非暂存文件”时必须小心的原因:有些人认为未跟踪的文件也是“未分级”的文件。
无论如何,git merge
本身有点复杂。有时它实际上是合并的,有时它会像Git所说的那样进行快进,这根本就不是合并。当Git执行快进而不是合并时,根据HEAD
,索引和工作树中的不同,允许更多的事情。当Git进行真正的合并时,Git需要使用索引来执行此操作,并且允许更少的特殊情况。