202

我做了一个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
4

5 回答 5

221

请参阅man git merge如何解决冲突):

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

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

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

TRUE MERGE下(查看 2. 和 3. 指的是什么):

当如何协调更改不明显时,会发生以下情况:

  1. HEAD 指针保持不变。

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

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

  4. ...

所以:git reset --hard如果您想从工作树中删除存储更改,或者git reset如果您只想清理索引并将工作树中的冲突保留为手动合并,请使用。

man git stash ( OPTIONS, pop ) 下,您还可以阅读:

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

于 2010-05-15T16:56:23.923 回答
45

我也有类似的事情发生在我身上。我还不想暂存文件,所以我添加了它们,git add然后就做了git reset. 这基本上只是添加然后取消了我的更改,但清除了未合并的路径。

于 2012-05-04T17:10:31.530 回答
14

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

之后,您可以git reset将索引中的所有更改带到工作目录,因为显然在发生冲突的情况下,对非冲突文件的更改会保留在索引中。

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

于 2015-10-13T17:26:11.633 回答
2

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

请参阅Jeff King ( )的ed178ef 提交, 2015 年 4 月 22 日。 (由Junio C Hamano 合并——提交 05c3967中,2015 年 5 月 19 日)peff
gitster

注意:这已被还原。见下文

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

问题

如果您已在索引中暂存内容并运行“ stash apply/pop”,我们可能会遇到冲突并将新条目放入索引中。
那时很难恢复到原来的状态,因为像“git reset --keep”这样的工具会吹走任何暂存的东西

换句话说:

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

解决方案

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

这意味着如果之前因为对修改的文件(添加但未提交)应用存储而进行了合并,现在它们将不会是任何合并,因为存储应用/弹出将立即停止:

Cannot apply stash: Your index contains uncommitted changes.

强制您提交更改意味着,在合并的情况下,您可以git stash apply/pop使用git reset --hard.


请参阅提交 1937610(2015 年 6 月 15 日)和提交 ed178ef(2015 年 4 月 22 日)由Jeff King ( 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 commit”,那么这很有效。但是,如果这些步骤是预提交挂钩的一部分,那么您就没有这个机会(无论测试通过还是失败,您都必须恢复原始状态)。

于 2015-05-21T13:44:42.467 回答
1
git restore --staged  name-of-file-that-has--merge-conflict
于 2021-09-10T17:09:17.710 回答