How to Undo Git Stash Pop Conflicts
- Git Stash Pop Merge Conflicts - The Problem
- Undo Git Stash Pop With Conflicts - Abort the Bad Merges to Return to a Clean State
- Undo Git Stash Pop by Resolving The Bad Conflicts
You can undo git stash pop
with merge conflicts with the solutions in this article. We show you how to abort the bad stash pop operation and return to a clean state.
But we also demonstrate a method to resolve the conflicts and undo git stash pop
with new good merges.
Git Stash Pop Merge Conflicts - The Problem
It is common in a fast-paced developer’s workflow to stash the current state and jump to other features as new ideas come up.
When we finish our work on the new feature, we apply the stashed changes with the git stash pop
command. But sometimes, this back and forth workflow results in merge conflicts.
You may want to do one of two things in such a situation.
- Either abort the bad merges and return to the previous clean state.
- You may want to edit the files/directories locally or pull from a remote repository to resolve the merge conflicts. You can then merge the correct changes with fresh commits.
Let us see both the solutions.
Undo Git Stash Pop With Conflicts - Abort the Bad Merges to Return to a Clean State
You should use any of the following commands if you want to remove the changes in the bad stash pop operation. These methods will abort all the changes that caused the merge conflict and return to the previous healthy state.
git reset --merge
First, let’s look at the setup. We have a master
branch with a few files, like so:
We then fork a new_branch
local branch from it. We modify a few files in this branch and commit those changes.
We now make a few changes in file1.txt
and file2.txt
. We then stash
these changes.
git stash -u -m "Modify file1 and file2 in new_branch"
The git stash
takes a few options here. The -u
flag lets us stash the untracked changes.
The -m
flag carries the same meaning - it lets us add a semantic message to our stash.
We now make some changes in the same file1.txt
and file2.txt
in our master
branch. These files have different versions in our master
and new_branch
.
If we want to apply the stash in the master
branch, these different versions of file1
and file2
will cause conflicts.
If we now check our repository, we find weird files in it because of the bad merge attempt.
We can use the reset
command with some options to git undo failed stash pop.
git reset --merge
The git reset
has recently learned the --merge
option. The --merge
option is like the default --mixed
option, but it only applies to the files affected by the merge operation.
We see the result of this command is to git undo bad stash pop in our case.
git checkout -f
We can see the same result above using the git checkout
command by passing the -f
flag.
git checkout -f
Without any argument to it, the git checkout
command takes the default HEAD
argument. Our last commit was good without the bad stash pop merge conflicts, and so this command wipes the slate clean.
The -f
flag is for the --force
option. It helps by ignoring unmerged commits and untracked files to ensure a healthy repository state.
The above two methods are best to undo git stash pop with conflicts if you only want to wipe them clean.
But if you want to resolve the commits with fresh good merges, you need to use the methods below.
Undo Git Stash Pop by Resolving The Bad Conflicts
You need to edit your files and directories nicely in sync in all the branches to resolve conflicts.
You could do this locally with a few commands or pull it in from your remote repository. We will look at both solutions.
Resolve Conflicts to Git Undo Failed Stash Pop - For Local Branches
We have the same setup as above. But this time, we will resolve the conflicts between our main
and new_branch
and reapply our stash to get the desired result.
We first remove the changes in our files that cause the stash pop conflicts. The change we made in file1
and file2
in our master
after the fork caused the problem.
We reset
our master
to the commit before the commit with the bad changes to our file1
and file2
.
git reset <good_commit_hash>
git checkout HEAD .
We also roll back our working area with the checkout
command. Note the trailing dot .
, which selects all the files to ensure all conflicts resolve.
You could also use:
git reset HEAD file1.txt file2.txt
Because in our case, we know the two relevant files are file1.txt
and file2.txt
.
In this form, the git checkout
command sets the working area to align with HEAD
, the last good commit without conflicts.
We now see the commit is gone from our master
branch.
We now apply our stashed changes successfully.
git stash pop
Git Undo Bad Stash Pop - Resolve Conflicts By Pulling From Remote Repository
If your workflow is set up such that the remote repository has the least healthy state, you can resolve the bad stash conflicts by pulling in from the remote.
Let’s first set up a concrete use case for this solution.
We see our local remote is behind our remote main by 1 commit. Suppose we now create a new local branch tracking the remote master and stash some changes.
git fetch --all
git switch -c new_branch_tracking_remote_master origin/master
We stash some changes on this branch.
git stash -m "Change file5.txt in local branch"
Now we realize we want these changes on a new local branch. We fork a new local branch
from our local master
.
git checkout master
git branch local_branch_2
We see this branch is behind by 1 commit, and it does not have the file5.txt
file. If we now pop our stash, it leads to bad merge conflicts.
To resolve conflicts, in this case, we pull the remote master into our local master. We first need to fetch the remote repository.
git fetch --all
We then merge our local master
with the remote master
.
git merge origin/master
We now see our local master
is in sync with the remote master by pulling the latest changes. You can also see it has the crucial file5.txt
in it.
We will now rebase
our local branch, local_branch_2
, on the updated local master
.
First, checkout
the local branch.
git checkout local_branch_2
Now, rebase
it on the local master.
git rebase master
This makes our local_branch_2
healthy and ready to receive the stashed changes.
We now apply our stashed changes.
git stash pop
We see this time the stashed changes apply successfully.
We have resolved the conflicts and successfully merged the stashed changes.
Resources:
- https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
- https://www.theserverside.com/video/How-to-easily-merge-and-resolve-git-stash-pop-conflicts
- https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
- https://newbedev.com/git-stash-blunder-git-stash-pop-and-ended-up-with-merge-conflicts
- https://stackoverflow.com/questions/4778882/how-to-launch-and-edit-a-file-from-git-using-notepad