【问题标题】:git checkout fails due to local changes but stash applies cleanly afterwardsgit checkout 由于本地更改而失败,但 stash 之后干净地应用
【发布时间】:2016-02-01 20:46:42
【问题描述】:

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

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

现在,当我看到这一点时,可能会天真地期望,如果一个人隐藏更改,签出新分支,然后应用隐藏的更改,那么就会发生冲突,但几乎从来没有发生过这种情况。发生的情况是隐藏的更改干净地应用,并且在我签出新分支之前我没有丢失任何东西。为什么 git 会给出这个看似误导性的错误? 如果我可以在结账前隐藏并在最后干净地应用隐藏,为什么 git checkout 不只是在后台执行此操作?

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

如果我对刚接触 git 的人说,文件 foo 第 100 行上的一个 modif 会与文件 foo 第 2 行上的另一个 modif 冲突,这对他们来说是有意义的,接受它是事实,而不是抱怨和很容易解决冲突。但是因为 git 是一个很好的工具,它做的很聪明,甚至不会因为它可以修复而没有任何损坏风险的非问题来打扰你。为什么在这种情况下与git checkout 的理念不同?

【问题讨论】:

  • 可能是因为结帐不是合并。 Git 不认为你想要合并,并且非常友好地指出这一点。
  • 想要合并。我想将这些本地更改保留为本地更改,除非签出不同的分支。您无法合并未提交的内容
  • 你对应用存储的讨论让我不相信。您可能需要稍微修改一下您的问题。
  • 因为您想切换并保留本地更改,您的程序似乎是正确的方法。但其他人可能有不同的目标。所以,我认为 git 给你的建议是正确的,但是让程序适用于你......

标签: git git-stash git-checkout


【解决方案1】:

git checkout 命令会抱怨(并且不会切换分支)是否必须清除某些已修改的文件并由签出操作替换。

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

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

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

【讨论】:

  • 我想了这么多,但我的问题更多,为什么 git 会阻止一个(至少看起来)无害的动作。我知道如果存储冲突是不可能进行自动解决的,但是如果没有数据丢失,为什么 git 不以编程方式执行必要的步骤?
  • 他没有阻止它。当您切换到不同的分支时,他根本不知道如何处理您的本地更改...
  • @torek 您在最后一段中的示例完全代表了我的问题。如果你在合并中遵循相同的逻辑,git 会拒绝执行这样的合并,因为它更改了同一个文件,但它不会拒绝,它知道由于更改在不同的行上,它可以在不丢失任何东西的情况下进行合并。为什么它对结帐不做同样的事情?没有数据丢失
  • @SebastiaanMannem 就像我在您的其他评论中提到的那样,如果这是不知道如何处理本地更改的问题,那么带有脏工作区的 git checkout 将总是失败,但事实并非如此:git checkout -b b1; touch myfile; git checkout -b b2 工作得很好
  • 这只是一个设计决定:git checkout 不进行合并。 git checkout 可以进行合并,git checkout -m可以进行合并,所以如果需要,请添加 -m
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2014-10-03
相关资源
最近更新 更多