Git Revert "revert is not possible because you have unmerged files"

Math_reald picture Math_reald · Feb 23, 2016 · Viewed 16.5k times · Source

I did a simple example to text some GIT functions. Just one text file in the repository:

1

added and commited the change

then changed the txt. file to:

1
2

added and commited the change

Git log gives the following result:

commit 00e59212a6...
..
second commit

commit 7c319d587....
..
first commit

at that point I want to go back to the first commit (but I dont want to use "reset --hard". I tried:

git revert 7c319d587

but i got the following error message:

revert is not possible because you have unmerged files
hint: Fix them up in the work tree, and the use "git add/rm
hint: as appropriate to mark resolution and make a commit

I am new to GIT - before I used SVN, there you can handle such things very simple so I am wondering if this simple things need a few steps in GIT?

Thank you very much for your help.

Answer

JustMe picture JustMe · Feb 23, 2016

Well, I have tried what You think You did, by doing exactly what You wrote

cd /tmp
mkdir so35588521
cd so35588521
git init
# Initialized empty Git repository in /tmp/so35588521/.git/
touch 1
echo "1" > 1
git add .
git commit -m "first"
# [master (root-commit) 173f431] first
#  1 file changed, 0 insertions(+), 0 deletions(-)
# create mode 100644 1
touch 2
touch 3
git add .
git commit -m "second"
# [master a9fdcc9] second
#  2 files changed, 0 insertions(+), 0 deletions(-)
#  create mode 100644 2
#  create mode 100644 3
git log
# commit a9fdcc9338c9b3de25c211580a35ab63d1d57c2e
# Author: Me and my email
# Date:   Tue Feb 23 22:46:50 2016 +0100
git revert a9fd
# [master dd5a86e] Revert "second"
# 2 files changed, 0 insertions(+), 0 deletions(-)
# delete mode 100644 2
# delete mode 100644 3

as You can see - all went well. Thus, I thought, AHA! She/he must have done something else, and neglected to mention it on SO. Oh well, I'll figure out what she/he did using my crystal ball anyway. What's the point of it laying around useless.

So, merge, git said. Then, let's make a branch and try to merge it with our master branch.

git checkout -b a_branch
# Switched to a new branch 'a_branch'
echo "2" > 1
git status
# On branch a_branch ...
git add .
git commit -m "third"
# [a_branch 96d3a7a] third
#  1 file changed, 1 insertion(+), 1 deletion(-)
git checkout master
# Switched to branch 'master'
echo "3" > 1
git add .
git commit -m "fourth"
# [master 7f72eec] fourth
#  1 file changed, 2 insertions(+), 1 deletion(-)
#### Now we have first commit, and second, and revert second, and two commits: third on **a_branch** branch and fourth on **master**. 
git merge a_branch
# Auto-merging 1
# CONFLICT (content): Merge conflict in 1
# Automatic merge failed; fix conflicts and then commit the result.
# *Oh DANG* whyy? Git stop, don't do that it hurts, revert!
git revert last_commit_id_from_git_log
# error: revert is not possible because you have unmerged files.
# hint: Fix them up in the work tree, and then use 'git add/rm <file>'
# hint: as appropriate to mark resolution and make a commit.
# fatal: revert failed
# *Git nope!*

Now, that was just me guessing, and bringing a little bit of humor to SO, I hope. If this is NOT what You did, could You please tell us exact steps You did? Since I can't replicate error You are having, and thus I feel unfulfilled not being able to hellp.

EDIT:

Since OP insists that definitely did not make a branch...

rm *
rm -rf .git
git init
echo -e "line one\n" > 1
git add .
git ci -m "first"
echo -e "line two\n" >> 1
git ci -a -m "second"
git log
# commit 23d710610d98c1046844870557208f335e76a933
# Author: ME <me@home>
# Date:   Tue Feb 23 23:31:28 2016 +0100
#
#     second
# 
# commit 22873fb5fbf06d80a1779fe6740060c660d68714
# Author: ME <me@home>
# Date:   Tue Feb 23 23:30:47 2016 +0100
#
#    first

git revert "first"
# fatal: bad revision 'first'  # but OK i assume You used id, so,
git revert 22873fb5fbf06d80
# error: could not revert 22873fb... first
# hint: after resolving the conflicts, mark the corrected paths
# hint: with 'git add <paths>' or 'git rm <paths>'
# hint: and commit the result with 'git commit'

Ahaaa, now i got it! And that...is bizzaare.

Ok, I checked and actually You are right, on my git --version 2.6.3 I could replicate this behavior. Actually, I think You went into quite corner case here. What happened is, that after Your second commit, git stored changes You made to file test.txt and kept those changes. Now You told him(it?) to git revert first_commit_id which actually created file test.txt. I can't tell for sure but this seems like a small bug for me.

However! If You, in second commit - add file, for example test2.txt (so You would have two files versioned in git repository), then revert works.