git stash blunder:git存储stream行和结束与合并冲突

我做了一个git stash pop并最终与合并冲突。 我从文件系统中删除了这些文件,并执行了如下所示的git checkout ,但它认为这些文件仍然未被合并。 然后我尝试更换文件,并再次做一个git checkout和相同的结果。 我事件试图用-f标志强制它。 任何帮助,将不胜感激!

 chirag-patels-macbook-pro:haloror patelc75$ git status app/views/layouts/_choose_patient.html.erb: needs merge app/views/layouts/_links.html.erb: needs merge # On branch prod-temp # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: db/schema.rb # # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # unmerged: app/views/layouts/_choose_patient.html.erb # unmerged: app/views/layouts/_links.html.erb chirag-patels-macbook-pro:haloror patelc75$ git checkout app/views/layouts/_choose_patient.html.erb error: path 'app/views/layouts/_choose_patient.html.erb' is unmerged chirag-patels-macbook-pro:haloror patelc75$ git checkout -f app/views/layouts/_choose_patient.html.erb warning: path 'app/views/layouts/_choose_patient.html.erb' is unmerged 

看到人git合并 ( 如何解决冲突 ):

看到冲突之后,你可以做两件事:

  • 决定不合并。 您需要的唯一清理工作是将索引文件重置为HEAD提交以反转2.并清除由2.和3所做的工作树更改。 git-reset –hard可以用于这个。

  • 解决冲突。 Git将标记工作树中的冲突。 编辑文件到形状和git将它们添加到索引。 使用git commit来完成交易。

并在真正的合并 (看什么2.和3.是指):

如果不清楚如何协调这些变化,则会发生以下情况:

  1. HEAD指针保持不变。

  2. MERGE_HEAD ref被设置为指向另一个分支头。

  3. 干净地合并的path在索引文件和工作树中都被更新。

所以:使用git reset --hard如果你想从你的工作树中删除隐藏的变化,或者如果你想清理索引并且让​​你的工作树中的冲突保持手工合并的话,可以使用git reset

在man git stash ( OPTIONS,pop )下你可以阅读:

应用状态可能会因冲突而失败; 在这种情况下,它不会从存储列表中删除。 您需要手动解决冲突,然后手动调用git stash drop。

我有一个类似的事情发生在我身上。 我不想将文件git add所以我添加了git add ,然后只是做了git reset 。 这基本上只是添加,然后取消了我的更改,但清除未合并的path。

如果像我一样,你通常想要用被隐藏文件的内容覆盖工作目录的内容,而你仍然会发生冲突,那么你想要使用git checkout --theirs -- .来解决冲突git checkout --theirs -- . 从根。

在这之后,你可以通过git reset来将索引的所有更改都带到工作目录,因为在发生冲突的情况下,非冲突文件的更改会保留在索引中。

之后您可能还想运行git stash drop [<stash name>]来摆脱隐藏,因为git stash pop在冲突情况下不会删除它。

注意 Git 2.5(Q2 2015) 未来的Git可能会尝试使这种情况变得不可能。

见Jeff King ( peff )于2015年4月22日提交的ed178ef 。
(由Junio C gitster合并 – gitster – 在提交05c3967 ,2015年5月19日)

注意: 这已被恢复。 见下文

stash :需要一个干净的索引来申请/stream行

问题

如果您已经在索引中放置了内容并运行“ stash apply/pop ”,我们可能会发生冲突并将新条目添加到索引中。
恢复到原来的状态是困难的,因为像“git reset –keep”这样的工具将吹走任何舞台上的东西

换一种说法:

git stash pop/apply ”忘记确保不仅工作树是干净的,而且索引是干净的。
后者是非常重要的,因为存储应用程序可能会发生冲突,并且该索引将用于解决冲突。

当有变化的时候,我们可以通过拒绝申请来做到这一点。

这意味着,如果因为在修改过的文件上应用了一个隐藏(已添加但未提交)之前进行了合并,现在它们将不会进行任何合并,因为隐藏应用/ pop将立即停止:

 Cannot apply stash: Your index contains uncommitted changes. 

强制你提交更改意味着,在合并的情况下,你可以很容易地恢复初始状态(在git stash apply/pop )用git reset --hard


参见提交1937610 (2015年6月15日),并由Jeff King( peff ) 提交ed178ef (2015年4月22日) 。
(由Junio C gitster合并- gitster – 提交bfb539b ,2015年6月24日)

该提交是为了提高应用存储的安全性,因为应用程序可能会创build冲突的索引条目,之后很难恢复原来的索引状态。

不幸的是,这会伤害“ git stash -k ”的一些常见的工作stream程,例如:

 git add -p ;# (1) stage set of proposed changes git stash -k ;# (2) get rid of everything else make test ;# (3) make sure proposal is reasonable git stash apply ;# (4) restore original working tree 

如果你在步骤(3)和(4)之间进行“git commit”,那么这只是起作用。 但是,如果这些步骤是预提交钩子的一部分,那么就没有这个机会(无论testing通过还是失败,都必须恢复原始状态)。