由于本地更改,git签出失败,但随后将干净地应用隐藏

由于本地更改,git签出失败,但随后将干净地应用隐藏,git,git-stash,git-checkout,Git,Git Stash,Git Checkout,我经常尝试签出一个新的远程分支(从中创建一个本地分支,但这可能与我的问题无关),git失败并出现以下错误 错误:您对以下文件的本地更改将被签出覆盖: 请在切换分支之前提交或隐藏更改 现在,当我看到这一点时,人们可能天真地认为,如果一个人隐藏更改,签出新的分支,然后应用隐藏的更改,那么就会发生冲突,但事实几乎从来都不是这样。所发生的是,隐藏的更改可以干净地应用,并且在签出新分支之前,我没有丢失任何东西。为什么git给出了这个看似误导的错误如果我可以在签出前隐藏,并在最后干净地应用隐藏,为什么不在引

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

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

现在,当我看到这一点时,人们可能天真地认为,如果一个人隐藏更改,签出新的分支,然后应用隐藏的更改,那么就会发生冲突,但事实几乎从来都不是这样。所发生的是,隐藏的更改可以干净地应用,并且在签出新分支之前,我没有丢失任何东西。为什么git给出了这个看似误导的错误如果我可以在签出前隐藏,并在最后干净地应用隐藏,为什么不在引擎盖下进行
git checkout
呢?

编辑:
更清楚地说,我不是在问为什么签出失败,或者为什么有时候签出工作区脏了会成功,我明白这一切。我的问题是,在这种情况下,有一个行动过程是100%无数据丢失的(或者是否有一些我看不到的数据可能丢失的情况??),那么git为什么不这么做呢


如果我对git新手说,文件
foo
第100行中的一个modif会与文件
foo
第2行中的另一个modif冲突,这对他们来说是有意义的,他们会接受事实,而不是抱怨,并且很容易解决冲突。但是因为git是一个很好的工具,它做得很聪明,甚至不会因为一个它可以修复而没有任何腐败风险的非问题而困扰你。为什么在这个场景中,
git checkout
的原理不一样

git checkout命令会在某些修改过的文件必须清除并由checkout操作替换时发出抱怨(并且不会切换分支)

这意味着工作树版本与
HEAD
版本之间存在差异(以便修改文件),而
HEAD
版本与目标提交之间存在差异(以便必须替换文件)

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


[Edit to add,from comment]并不是说
git checkout
不能进行合并,只是默认情况下不会。使用
git checkout-m
告诉
git checkout
使用合并代码。

可能是因为签出不是合并。Git认为你不想合并,并很好心地指出这一点。我不想合并。我希望将这些本地更改保留为本地更改,除非签出了其他分支。你不能合并未提交的内容你对应用存储的讨论让我相信不是这样的。您可能需要稍微修改一下您的问题。由于您希望切换并保留本地更改,因此您的过程似乎是正确的。但其他人可能有不同的目标。所以,我认为git向您提供建议是正确的,但让程序应用于您……我想了这么多,但我的问题更多,为什么git阻止(至少看起来)无害的操作。我知道如果隐藏冲突不可能自动解决,但是如果没有数据丢失,git为什么不以编程方式执行必要的步骤呢?他并没有阻止它。他根本不知道如何处理您的本地更改,而您正在切换到另一个分支…@torek最后一段中的示例正好代表了我的问题。如果您在合并时遵循相同的逻辑,git会拒绝这样的合并,因为它更改了相同的文件,但它不会拒绝,它知道由于更改在不同的行上,所以它可以在不丢失任何内容的情况下进行合并。为什么退房的情况不一样呢?没有任何损失data@SebastiaanMannem就像我在你的其他评论中提到的,如果是不知道如何处理本地更改的问题,那么带有脏工作区的git签出总是会失败,但事实并非如此:
git checkout-b b1;触摸我的文件;git checkout-b2
工作正常这只是一个设计决策:
git checkout
不进行合并
git-checkout
可以进行合并,而
git-checkout-m
可以进行合并,所以如果需要的话,可以添加
-m