As asked in this question, I also want to know how to resolve a conflicting
git stash pop without adding all modifications to a commit (just like "git stash pop" without a conflict does).
My current approach is very uncool because I do it this way:
git stash pop # -> CONFLICT git stash drop # [resolve conflict] # [add conflict files] git reset HEAD # <all files that are in commit-mode>
How to reproduce:
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: Added a new file called 'third' to the example to show that workarounds like the solution from scy only work for empty HEADs but don't fix the initial problem that the HEAD doesn't have the same content like for a
git stash pop without a conflict.
This question is tagged with
~ Asked on 2011-10-13 08:46:55
Well, you can follow them :). But I don't think that doing a commit and then resetting the branch to remove that commit and similar workarounds suggested in other answers are the clean way to solve this issue.
The following solution seems to be much cleaner to me and it's also suggested by the Git itself — try to execute
git status in the repository with a conflict:
Unmerged paths: (use "git reset HEAD <file>..." to unstage) (use "git add <file>..." to mark resolution)
So let's do what Git suggests (without doing any useless commits):
git resetto mark conflict(s) as resolved and unstage the changes. You can execute it without any parameters and Git will remove everything from the index. You don't have to execute
git stash drop, because Git doesn't do that on conflict.
Translated to the command-line:
$ git stash pop # ...resolve conflict(s) $ git reset $ git stash drop
There are two ways of marking conflicts as resolved:
git add and
git reset. While
git reset marks the conflicts as resolved and removes files from the index,
git add also marks the conflicts as resolved, but keeps files in the index.
Adding files to the index after a conflict is resolved is on purpose. This way you can differentiate the changes from the previous stash and changes you made after the conflict was resolved. If you don't like it, you can always use
git reset to remove everything from the index.
I highly recommend using any of 3-way merge tools for resolving conflicts, e.g. KDiff3, Meld, etc., instead of doing it manually. It usually solves all or majority of conflicts automatically itself. It's huge time-saver!
~ Answered on 2014-12-09 15:09:13
Suppose you have this scenario where you stash your changes in order to pull from origin. Possibly because your local changes are just
debug: true in some settings file. Now you pull and someone has introduced a new setting there, creating a conflict.
git status says:
# 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")
Okay. I decided to go with what Git suggested: I resolved the conflict and committed:
vim src/js/globals.tpl.js # type type type … git commit -a -m WIP # (short for "work in progress")
Now my working copy is in the state I want, but I have created a commit that I don't want to have. How do I get rid of that commit without modifying my working copy? Wait, there's a popular command for that!
git reset HEAD^
My working copy has not been changed, but the WIP commit is gone. That's exactly what I wanted! (Note that I'm not using
--soft here, because if there are auto-merged files in your stash, they are auto-staged and thus you'd end up with these files being staged again after
But there's one more thing left: The man page for
git stash pop reminds us that "Applying the state can fail with conflicts; in this case, it is not removed from the stash list. You need to resolve the conflicts by hand and call
git stash drop manually afterwards." So that's exactly what we do now:
git stash drop
~ Answered on 2013-08-13 15:14:44