正如在这个问题中问到的,我也想知道如何解决一个冲突的git stash pop而不添加所有的修改提交(就像“git stash pop”没有冲突一样)。

我目前的方法非常不酷,因为我是这样做的:

git stash pop  # -> CONFLICT
git stash drop
# [resolve conflict]
# [add conflict files]
git reset HEAD # <all files that are in commit-mode>

如何繁殖:

mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status

2016-06-27:在示例中添加了一个名为“third”的新文件,以显示像来自scy的解决方案这样的变通方法只适用于空的HEAD,但不能解决最初的问题,即HEAD没有相同的内容,例如git隐藏弹出而没有冲突。


当前回答

根据git的隐藏问题,在修复冲突后,git add <file>是正确的操作过程。

在阅读了这条评论之后,我才明白更改会自动添加到索引中(通过设计)。这就是为什么git add <file>完成了冲突解决过程。

其他回答

回答那些遇到git隐藏问题的人-你没有干净地应用

如果你用git stash -u创建了一个存储库呢?那么这个问题的大部分答案都是无效的!因为只要你遵循了排名最高的答案(这个:https://stackoverflow.com/a/27382210/816017)给出的建议——即使用git stash drop(我的建议:不要这样做),你的非暂存文件就会消失。

这是一个冗长的介绍,要说以下几点:

如果你在做git stash pop时遇到了Merge冲突的问题,并且你已经使用了git stash -u,那么摆脱这种情况的一种方法是:

git stash branch my-stash-branch Do whatever you need to fix the diff. Hard diffs: Manually copy the offending files to a non-git folder, and then do git restore myfile, then apply the changes manually Easy diffs: If the conflict is just in some throwaway file like Cargo.lock or yarn.lock just git restore Cargo.lock. Do git stash -u again git checkout my-actual-branch git stash pop which should apply cleanly now, otherwise rinse & repeat Remove the my-stash-branch once you are confident your changes have been applied correctly.

简而言之:用粗体字写着“不要追随其他答案……”的答案并不适合所有人!尤其是当你使用git stash -u时。您的更改可能会丢失!

脚注:

如果你挖掘git fsck,可能会发现git stash drop丢失的非暂存文件-如果我没有弄错的话,它们不在reflog中。

假设您有这样的场景,您将您的更改隐藏起来以便从原点进行拉取。可能是因为您的本地更改在某些设置文件中只是debug: true。现在你拉了,有人在那里引入了一个新场景,造成了冲突。

Git状态显示:

# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      src/js/globals.tpl.js
no changes added to commit (use "git add" and/or "git commit -a")

好的。我决定按照Git的建议去做:我解决了冲突并承诺:

vim src/js/globals.tpl.js
# type type type …
git commit -a -m WIP   # (short for "work in progress")

现在我的工作副本处于我想要的状态,但是我创建了一个我不想拥有的提交。如何在不修改工作副本的情况下摆脱该提交?等等,有一个流行的命令!

git reset HEAD^

我的工作副本没有更改,但是WIP提交已经消失了。这正是我想要的!(注意,我在这里没有使用-软,因为如果你的存储中有自动合并的文件,它们是自动分期的,因此你最终会在重置后再次分期这些文件。)

但是还有一件事:git stash pop的手册页提醒我们“应用状态可能会因冲突而失败;在这种情况下,它不会从收藏列表中删除。你需要手动解决冲突,然后手动调用git stash drop。”这正是我们现在所做的:

git stash drop

和完成。

git checkout stash -- .

为我工作。

注意:这可能是危险的,因为它不会尝试将隐藏文件中的更改合并到工作副本中,而是用隐藏文件覆盖它。因此,您可以丢失未提交的更改。

我发现最快的方法是解决冲突,然后执行git add -u,然后执行git reset HEAD,这甚至不涉及提交。

没有问题。一个简单的git重置HEAD是你要找的,因为它会让你的文件被修改,就像一个不冲突的git隐藏弹出。

唯一的问题是你的冲突文件仍然会有冲突标签,git将不再报告它们与“both_modified”标志冲突,这是有用的。

为了防止这种情况,在运行git reset HEAD之前,只需解决冲突(编辑并修复冲突文件),就可以了…

在这个过程结束时,你的stash将保留在队列中,所以只需做一个git stash drop来清除它。

这件事刚刚发生在我身上,我在谷歌上搜索了这个问题,所以解决方案已经经过了测试。

我想这已经够干净了…