Git隐藏错误:Git隐藏弹出并最终与合并冲突

我做了一个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
133235 次浏览

参见男人git合并 (如何解决冲突):

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

  • 决定不合并。唯一需要清理的是将索引文件重置为HEAD提交到反向2。并清理2所做的工作树更改。和3。Git-reset -hard可以用于此。

  • 解决冲突。Git会在工作树中标记冲突。编辑文件并将其添加到索引中。使用git commit来完成交易。

真正的融合下面(看2。和3。指):

当不清楚如何调和这些变化时,会发生以下情况:

  1. HEAD指针保持不变。

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

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

  4. < p >…

所以:如果你想从你的工作树中删除隐藏更改,使用git reset --hard;如果你只想清理索引并将冲突留在你的工作树中手工合并,则使用git reset

男人,少不更事 (选项,弹出)下,你可以读到:

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

我也有过类似的经历。我还不想暂存文件,所以我用git add添加了它们,然后只做了git reset。这基本上只是添加,然后取消我的更改,但清除未合并的路径。

请注意,Git 2.5(2015年第二季度)将来的Git可能会试图使这种情况不可能发生。

参见提交ed178ef by 杰夫•王 (peff), 22 Apr 2015 (由滨野Junio Cgitster—在提交05 c3967中合并,2015年5月19日)

注意:这种情况已被逆转。见下文

stash:需要一个干净的索引来应用/pop

问题

如果你在索引中有分段内容,并运行"stash apply/pop",我们可能会遇到冲突,并将新的条目放入索引中 在这一点上恢复到原始状态是很困难的,因为像“git reset -keep”这样的工具会破坏任何stage

换句话说:

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

解决方案

我们可以通过在有阶段性变化时拒绝应用来使其更安全。

这意味着如果之前有合并,因为在修改文件上应用了一个stash(添加但未提交),现在它们将不再是任何合并,因为stash apply/pop将立即停止:

Cannot apply stash: Your index contains uncommitted changes.

强制您提交更改意味着,在合并的情况下,您可以使用git reset --hard轻松地恢复初始状态(在git stash apply/pop之前)。


参见提交1937610(2015年6月15日)和提交ed178ef(2015年4月22日)by 杰夫·金(peff) (由Junio C Hamano—gitster提交bfb539b中合并,2015年6月24日)

该提交是为了提高应用的安全性 一个隐藏,因为应用程序进程可能创建 索引项冲突,之后很难恢复

不幸的是,这损害了一些围绕“git stash -k”的常见工作流,例如:

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提交”,那么这个 只是工作。但是,如果这些步骤是预提交的一部分 钩子,你没有那个机会(你必须恢复。 原始状态,无论测试是否通过或 失败)。< / p >

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

在此之后,你可以git reset将所有的更改从索引转移到工作目录,因为很明显,如果发生冲突,对非冲突文件的更改将保留在索引中。

你可能还想在之后运行git stash drop [<stash name>],以摆脱隐藏,因为在发生冲突时git stash pop不会删除它。

git restore --staged  name-of-file-that-has--merge-conflict