Say the other guy created bar on top of foo, but you created baz in the meantime and then merged, giving a history of
$ git lola
* 2582152 (HEAD, master) Merge branch 'otherguy'
|\
| * c7256de (otherguy) bar
* | b7e7176 baz
|/
* 9968f79 foo
Note: git lola is a non-standard but useful alias.
No dice with git revert
:
$ git revert HEAD
fatal: Commit 2582152... is a merge but no -m option was given.
Charles Bailey gave an excellent answer as usual. Using git revert
as in
$ git revert --no-edit -m 1 HEAD
[master e900aad] Revert "Merge branch 'otherguy'"
0 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 bar
effectively deletes bar
and produces a history of
$ git lola
* e900aad (HEAD, master) Revert "Merge branch 'otherguy'"
* 2582152 Merge branch 'otherguy'
|\
| * c7256de (otherguy) bar
* | b7e7176 baz
|/
* 9968f79 foo
But I suspect you want to throw away the merge commit:
$ git reset --hard HEAD^
HEAD is now at b7e7176 baz
$ git lola
* b7e7176 (HEAD, master) baz
| * c7256de (otherguy) bar
|/
* 9968f79 foo
As documented in the git rev-parse
manual
<rev>^
, e.g. HEAD^, v1.5.1^0
A suffix ^
to a revision parameter means the first parent of that commit object. ^<n>
means the n-th parent (i.e. <rev>^
is equivalent to <rev>^1
). As a special rule, <rev>^0
means the commit itself and is used when <rev>
is the object name of a tag object that refers to a commit object.
so before invoking git reset
, HEAD^
(or HEAD^1
) was b7e7176 and HEAD^2
was c7256de, i.e., respectively the first and second parents of the merge commit.
Be careful with git reset --hard
because it can destroy work.