Undo IntelliJ Smart Checkout

13,098

Solution 1

Here's at least a partial answer that works if you had a merge conflict during the stash pop. As mentioned in my question, stash is used by the Smart Checkout feature to stash your local changes, and then to apply them to the new branch after it is checked out.

The way IntelliJ does this is by using stash in the branch you're presently in, and then using stash pop in the branch you're switching to.

When the changes are stashed, they get put onto a stack of stashed changes, at the top. Then, when stash pop runs, those changes are popped off the stack and applied.

At least, in most cases, that's what happens. If there's a merge conflict, however, IntelliJ informs you of such and the stash is kept. You can see the stack of stashes by running:

git stash list

If the stash you want is still listed, what you can do is simply checkout the branch you were originally on. Reset it, then do stash apply, which is like stash pop, but doesn't remove the stash from the list. So:

git checkout $original-branch
git reset HARD
git stash apply

Then, if all is well, you can remove the stash with:

git stash drop

Since this answer is pretty rough and only covers one situation, I'm marking it as a community wiki. Improvements very much welcome.

Solution 2

As the merge failed because of conflicts, the stash isn't removed from the stack, preserving the uncommitted changes. In this case, the git stash list command should show the stash.

First force checkout the original branch. This ignores the merge conflicts.

git checkout -f $original-branch

Then reset the working directory to remove any changes made by the attempted merge.

git reset --hard HEAD

After that, apply the stashed changes. This doesn't remove the stash from the stack.

git stash apply

Confirm that you have all the needed changes and then remove the stash.

git stash drop
Share:
13,098

Related videos on Youtube

mlissner
Author by

mlissner

Lead developer and founder of Free Law Project.

Updated on September 15, 2022

Comments

  • mlissner
    mlissner over 1 year

    IntelliJ has a feature that's very cool in theory, called Smart Checkout. This feature kicks in when you're changing branches and you have files in the current branch that you've modified but haven't committed.

    Instead of forcing you to commit, stash or shelve your changes, it stashes them for you, switches branches, then runs stash pop in the new branch.

    I guess this is what you'd want sometimes, but I ran this when switching to the wrong branch.

    So, now my master branch is all full of changes that belong in another branch, some files are reporting merge conflicts, and I have all kinds of pain.

    What I want to accomplish is:

    1. Cleanly remove the changes from the master branch.
    2. Move them back to the branch where I was working.

    Is there a way to do this?

    • mlissner
      mlissner over 8 years
      By the way, losing these changes is pretty anguishing....several day's work. I'd love to get them back.
    • ThiefMaster
      ThiefMaster over 8 years
      this kind of magic is exactly why i prefer using IDE VCS integration only for read operations and always add, stash, commit, etc on the command line. anyway, you can recover stashed changes (there are many questions related to it here on SO, e.g. stackoverflow.com/questions/89332/…) easily using git utilities.
    • vaughan
      vaughan about 6 years
      I had the same issue. I expected that this feature would stash the changes, and switch to new branch. Then when I go back to old branch, it would remember what it stashed.
  • Noumenon
    Noumenon about 4 years
    I just wanted to return to my old branch, but the merge conflicts wouldn't let me. Force checkout was the key.