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.是指):
如果不清楚如何协调这些变化,则会发生以下情况:
HEAD指针保持不变。
MERGE_HEAD ref被设置为指向另一个分支头。
干净地合并的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通过还是失败,都必须恢复原始状态)。