Git checkout工作原理的解释

4
我正在使用Git默认的bash,我创建了一个主分支(非裸分支),并从中创建了一个分支(我们称其为新功能分支)。
我正在尝试分支操作,并测试git checkout命令。据我所知,checkout命令允许在不同分支之间切换。也就是说,checkout命令不允许在工作目录处于脏状态(即未暂存的编辑)时切换到另一个分支。
现在,我在我的主分支和功能分支中都有名为index.html的文件。这两个分支中的文件内容完全相同。现在我做了一些事情,让我感到困惑。
我正在我的功能分支上(当前这两个文件现在具有完全相同的内容),如果我编辑index.html的内容,比如标题标签,并且我没有将其暂存,如果我发出命令git checkout master,则Git允许我切换到主分支。更有趣的是,如果我在主分支内部发出git status命令,则我在功能分支上进行的未暂存更改会复制到主分支上。这不是破坏性的吗?
让我更加困惑的是,在两个分支上的2个文件在某个时间内,它们的内容不相同时,如果我在功能分支内部并编辑index.html文件的内容,比如标题标签,现在,如果我发出git checkout master命令,则它不允许我进行切换,因为它检测到我的工作树或目录处于脏状态。
总之,根据这些事件,我注意到如果2个文件具有相同的内容,如果您在一个分支上修改了该文件的内容,并检出到另一个分支,Git允许您进行切换,并将您所做的未暂存更改带到目标分支。
但是,如果两个不同分支上的2个文件具有不同的内容,如果您在一个分支上进行编辑并发出checkout命令以切换到另一个分支,则Git不允许您进行切换,因为出于某种原因它检测到工作树处于脏状态。
我的理解是正确的还是错误的?此外,我需要一点解释,说明我的理解是正确还是错误。

1
我为你大写了句子并纠正了拼写。"Coz"虽然是一个时髦的错拼和缩写,但在技术上并不是一个真正的单词。 - user456814
1
@Cupcake,我尊重地建议JPlus2自行决定所需的正式程度和正确性。您过了十分钟后“纠正”文本让我感觉有点粗鲁,并且,坦白说,有些傲慢。 (是的,我知道我可能会面临类似的指责:P)在评论中解释说他/她更有可能被认真对待,从而有更好的机会得到一个好答案,并建议他/她在编辑问题时考虑这一点,这将更加合适,我的看法。 干杯。 - Edward
SLaks的回答是正确的,但如果你把Git看作是让你在意识到自己在错误的分支上之前就开始的更改“带到”正确的分支上,那么使用“git checkout”命令可能会有所帮助。个人认为,如果这是一个不同的命令(例如git oops-forgot-to-switch-branch-earlier-do-it-now-if-safe),那么这将会更少令人困惑。但它确实是非常安全的,只是一开始让你感到有点惊讶它能够让你这样做。 - torek
1
@Edward,我尊重地不同意您的观点。这些问题不仅为原帖作者提供服务,也为互联网上的其他人提供服务。因此,正确的英语是必需的。在Stack Overflow上,您不拥有自己的内容,社区拥有它,任何人都有权编辑内容以帮助改进它。 - user456814
@Cupcake 抱歉,我也是刚开始使用Stack Overflow。谢谢你的提醒。torek,感谢您的答案,对我很有帮助。 - Jplus2
1个回答

4
未暂存的更改根本不属于git。
git checkout对任何不在git中的文件(无论是未暂存的更改还是被git忽略的文件)都没有影响。
为了防止数据丢失,如果需要更改具有未暂存更改的文件,git checkout将会出现错误提示信息。
换句话说,如果您有两个不同版本的文件分支,并且您编辑了该文件,然后尝试切换到另一个分支,则会出现错误,因为它会拒绝用另一个分支的版本替换您的未暂存更改。

还应该提一下,结账并不是“破坏性”的,因为未暂存的代码尚未在任何分支上提交。一旦你理解了这一点,它就是明显的,但OP担心特性分支会破坏他的主分支,实际上并没有发生这样的事情。 - slebetman
我完全明白你的意思,slebetman。我担心我的功能分支会破坏我的主分支。感谢您的回复。@Slasks,感谢您的答案,我现在有点明白你的意思了,最后一个问题是,如果我的feature和master分支上的index.html文件内容相同,并且我在feature分支上编辑了index.html并切换到master分支,为什么git允许这样做?这是我最困惑的事情,对此给您带来的麻烦表示歉意。 - Jplus2
@Jplus2: 因为它们是相同的,所以切换分支对该文件没有影响。因此,Git 忽略您的未暂存更改。特别是,在您执行 git commit 之前,您的更改不属于任何一个分支。 - SLaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接