由于本地更改,git checkout 失败,但之后 stash 应用干净

Hil*_*kus 2 git git-stash git-checkout

我经常尝试签出一个新的远程分支(以从中创建一个本地分支,但这可能与我的问题无关)并且 git 失败并出现以下错误

错误:您对以下文件的本地更改将被检出覆盖:
请在切换分支之前提交您的更改或隐藏它们。

现在,当我看到这一点时,人们可能会天真地期望如果一个人隐藏更改,签出新分支,然后应用隐藏的更改,那么就会发生冲突,但几乎从来没有这种情况。发生的情况是,隐藏的更改应用得很干净,而且我在检出新分支之前不会丢失任何东西。为什么 git 会给出这个看似误导性的错误?如果我可以在结账之前将其藏起来并在最后干净地应用藏匿处,为什么不在git checkout引擎盖下这样做呢?

编辑:
为了更清楚,我不是在问为什么结帐失败,或者为什么有时使用脏工作区的结帐会成功,我理解这一切。我的问题是,在这种情况下,有一个 100% 无数据丢失的行动方案(或者是否存在一些我看不到数据可能丢失的极端情况??)那么为什么 git 不这样做?

如果我对 git 的新手说文件foo第 100 行上的一个 modif会与文件foo第 2 行上的另一个 modif 冲突,那么对他们来说,接受它是事实,而不是抱怨,并且很容易解决冲突。但是因为 git 是一个不错的工具,所以它做的很聪明,甚至不会用它可以解决的非问题来打扰您,而没有任何损坏的风险。为什么在这种情况下与git checkout?

tor*_*rek 7

git checkout如果某些修改过的文件必须被清除并由 checkout 操作替换,则该命令会抱怨(并且不会切换分支)。

这意味着工作树版本和HEAD版本之间存在差异(因此文件被修改)以及HEAD版本和目标提交之间的差异(因此必须替换文件)。

并不意味着工作树版本之间的差异HEAD以任何方式与目标的版本冲突承诺,只是目标不同承诺从HEAD提交和HEAD提交从工作树版本不同。例如,假设工作树版本的README35 行中的第 17 行将“颜色”的拼写更改为“颜色”,并且HEAD版本与目标版本的差异在文件末尾添加了注释(添加了第 36 行)。在这种情况下,应用拼写更改也很简单,但git checkout不会这样做,它只会拒绝检查目标提交。

[编辑添加,来自评论]并不是git checkout不能进行合并,只是默认情况下不会。使用git checkout -m告诉git checkout使用合并代码。