[Git] I ran into a merge conflict. How can I abort the merge?
If your git version is >= 1.6.1, you can use
git reset --merge.
Also, as @Michael Johnson mentions, if your git version is >= 1.7.4, you can also use
git merge --abort.
As always, make sure you have no uncommitted changes before you start a merge.
From the git merge man page
git merge --abort is equivalent to
git reset --merge when
MERGE_HEAD is present.
MERGE_HEAD is present when a merge is in progress.
Also, regarding uncommitted changes when starting a merge:
If you have changes you don't want to commit before starting a merge, just
git stash them before the merge and
git stash pop after finishing the merge or aborting it.
git pull and had a merge conflict. I know that the other version of the file is good and that mine is bad so all my changes should be abandoned. How do I do this?
unmerged: _widget.html.erb You are in the middle of a conflicted merge.
In this particular use case, you don't really want to abort the merge, just resolve the conflict in a particular way.
There is no particular need to reset and perform a merge with a different strategy, either. The conflicts have been correctly highlighted by git and the requirement to accept the other sides changes is only for this one file.
For an unmerged file in a conflict git makes available the common base, local and remote versions of the file in the index. (This is where they are read from for use in a 3-way diff tool by
git mergetool.) You can use
git show to view them.
# common base: git show :1:_widget.html.erb # 'ours' git show :2:_widget.html.erb # 'theirs' git show :3:_widget.html.erb
The simplest way to resolve the conflict to use the remote version verbatim is:
git show :3:_widget.html.erb >_widget.html.erb git add _widget.html.erb
Or, with git >= 1.6.1:
git checkout --theirs _widget.html.erb
I found the following worked for me (revert a single file to pre-merge state):
git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*
Since comments suggest that
git reset --merge is an alias for
git merge --abort, it is worth noticing that
git merge --abort is only equivalent to
git reset --merge given that a
MERGE_HEAD is present. This can be read in the git help for merge command.
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
After a failed merge, when there is no
MERGE_HEAD, the failed merge can be undone with
git reset --merge but not necessarily with
git merge --abort, so they are not only old and new syntax for the same thing.
Personally I find
git reset --merge much more powerful for scenarios similar to the described one, and failed merges in general.
An alternative, which preserves the state of the working copy is:
git stash git merge --abort git stash pop
I generally advise against this, because it is effectively like merging in Subversion as it throws away the branch relationships in the following commit.