git-checkout 的非确定性行为

Non-deterministic behavior of git-checkout

我试图理解 git 的这种行为。它与提交的文件删除和保存有关。

假设我最近在一个名为 fork1 的分支中工作。我通过 "git checkout fork1" 到达那里。然后我删除了一个名为 first.bsh 的文件。 (不是 git rm,只是 rm)。如果我这样做 "git checkout fork1",它会产生一条消息:

Already on 'fork1'
D       first.bsh

注意到文件丢失了。尽管已结帐,但仍未恢复。

然后我做 "checkout master" 然后 "checkout fork1"。至此,文件被恢复。命令的顺序似乎会影响 "checkout fork1" 的作用。这是令人惊讶的,而且看起来不像是理想的行为。在一种情况下,这是 "respecting" 我的删除,但在另一种情况下则不是。这是什么逻辑?

当您使用 git checkout 更改活动提交时:git 将尝试协调您的本地更改与差异 "old HEAD <-> new HEAD"。

如果您的本地修改说 "file first.bsh is deleted",并且 master 上不存在文件 first.bshgit 会说 "hey ! we're good !" 并努力移动您的活动致力于掌握。

行为的区别在于改变活动提交——"keep pending changes"策略是一种启发式的并且可能是有损的——和保持原样。


最安全的做法是在切换之前提交您的工作或 运行 git stash