Why do I get conflicts when I do git revert?

Viewed 17066

I use Git, and I know that:

git revert <hash-code>

is used to create a new commit that will be identical to the past commit in the hash-code.

For example, I have the following commits:

1f74a0e second commit
e72d8b8 first commit  

I wanted to revert the first commit, so I used:

git revert 1f74a0e

Still, I got the following error:

error: could not revert 1f74a0e... first commit hint: after resolving the conflicts, mark the corrected paths hint: with 'git add ' or 'git rm ' hint: and commit the result with 'git commit'

As for the conflicts, I type:

$ git diff --name-only --diff-filter=U
file.txt

When I open file.txt I see no signs for conflicts.

Of course there will be conflicts. I expect git to take the "first commit" and copy it on top of the second commit. How can I do it?

3 Answers

I am complementing @Edward's answer. First of all, the revert command requires "your working tree to be clean (no modifications from the HEAD commit)" (see documentation here). The revert command will revert the changes of a given commit, and it will compare your current state with the PARENT of that commit whose changes you are reverting. If current state and that PARENT conflict, git will indicate that. If not, you will get not conflict.

Here is an example based on @Edward's:

Suppose you have three commits that modify a file:

commit1:

One
Two

commit2

One
2       # < we introduced this changed in commit 2

commit3

One
2
three   # < we introduced this change in commit 3

If you revert changes introduced by commit 2 from the current state (commit 3, assuming clear three, i.e, no modifications from the HEAD commit), git will

  1. remove the modification introduced by that commit 2, changing 2 back to two
  2. keep the line three introduced in commit 3. No conflict will occur because the current state (commit 3) does not conflict with parent (commit 1) of the commit whose changing we are reverting (commit 2)

Now, suppose you have a different situation:

commit1:

One
Two
three

commit2

One
2       # < we introduced this changed in commit 2
three

commit3

One
2
3   # < we introduced this change in commit 3

If you revert changes introduced by commit 2 from the current state (commit 3, assuming clear three, i.e, no modifications from the HEAD commit), git will

  1. remove the modification introduced by that commit 2, changing 2 back to two`
  2. Compare the line introduced in commit 3 with the parent of commit 2 and indicate conflict: the line three changed to 3 and conflicts with parent (commit 1) of the commit whose changing we are reverting (commit 2)
Related