Вопрос: Отменить слияние Git, которое еще не было нажато


В моей главной ветке я сделал git merge some-other-branchлокально, но никогда не подталкивал изменения к хозяину происхождения. Я не собирался сливаться, поэтому я бы хотел его отменить. При выполнении git statusпосле моего слияния я получил это сообщение:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

Основываясь на некоторых инструкции, которые я нашел , Я попробовал запустить

git revert HEAD -m 1

но теперь я получаю это сообщение с git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

Я не хочу, чтобы мой филиал был впереди любого количества коммитов. Как мне вернуться к этому моменту?


3015


источник


Ответы:


С git reflogпроверьте, какая фиксация одна до слияния (git reflog будет лучшим вариантом, чем git log). Затем вы можете сбросить его, используя:

git reset --hard commit_sha

Есть и другой способ

git reset --hard HEAD~1

вернет вам 1 фиксацию.

Имейте в виду, что любые измененные и незафиксированные / неустановленные файлы будут сбрасываться в их неизмененное состояние , Чтобы они не сбрасывали изменения или не видели --mergeвариант ниже.


Как @Velmont предложил ниже в своем ответе, в этом прямом случае, используя:

git reset --hard ORIG_HEAD

может привести к лучшим результатам, поскольку это должно сохранить ваши изменения. ORIG_HEADбудет указывать на фиксацию непосредственно до того, как произойдет слияние, поэтому вам не нужно самостоятельно ее искать.


Еще один совет - использовать --mergeвместо --hardпоскольку он не перезагружает файлы без необходимости:

--merge

Сбрасывает индекс и обновляет файлы в рабочем дереве, которые отличаются между <commit> и HEAD, но сохраняет те, которые отличаются между индексом и рабочим деревом (т. Е. Которые имеют изменения, которые не были добавлены).


3294



Предполагая, что ваш местный мастер не был впереди источника / мастера, вы должны быть в состоянии сделать

git reset --hard origin/master

Тогда ваш местный masterветвь должна выглядеть идентично origin/master,


1278



Видеть глава 4 в книге Git а также оригинальное сообщение Линуса Торвальдса ,

Отменить слияние который уже был нажат :

git revert -m 1 commit_hash

Обязательно верните возврат, если вы снова берете ветку, как сказал Линус.


1072



It is strange that the simplest command was missing. Most answers work, but undoing the merge you just did, this is the easy and safe way:

git reset --merge ORIG_HEAD

The ref ORIG_HEAD will point to the original commit from before the merge.

(The --merge option has nothing to do with the merge. It's just like git reset --hard ORIG_HEAD, but safer since it doesn't touch uncommitted changes.)


813



With newer Git versions, if you have not committed the merge yet and you have a merge conflict, you can simply do:

git merge --abort

From man git merge:

[This] can only be run after the merge has resulted in conflicts. git merge --abort will abort the merge process and try to reconstruct the pre-merge state.


297



You should reset to the previous commit. This should work:

git reset --hard HEAD^

Or even HEAD^^ to revert that revert commit. You can always give a full SHA reference if you're not sure how many steps back you should take.

In case when you have problems and your master branch didn't have any local changes, you can reset to origin/master.


102



Lately, I've been using git reflog to help with this. This mostly only works if the merge JUST happened, and it was on your machine.

git reflog might return something like:

fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting

The first line indicates that a merge occurred. The 2nd line is the time before my merge. I simply git reset --hard 43b6032 to force this branch to track from before the merge, and carry-on.


78



With modern Git, you can:

git merge --abort

Older syntax:

git reset --merge

Old-school:

git reset --hard

But actually, it is worth noticing that git merge --abort is only equivalent to git reset --merge given that 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 and useful in everyday work, so that's the one I always use.


39



Okay, the answers other people here gave me were close, but it didn't work. Here's what I did.

Doing this...

git reset --hard HEAD^
git status

...gave me the following status.

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

I then had to type in the same git reset command several more times. Each time I did that, the message changed by one as you can see below.

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

At this point, I saw the status message changed, so I tried doing a git pull, and that seemed to work:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

So long story short, my commands came down to this:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull

32



You could use git reflog to find the previous checkout. Sometimes that's a good state you want to return back to.

Concretely,

$ git reflog
$ git reset --hard HEAD@{0}

21



If you didn't commit it yet, you can only use

$ git checkout -f

It will undo the merge (and everything that you did).


12



You can use only two commands to revert a merge or restart by a specific commit:

  1. git reset --hard commitHash (you should use the commit that you want to restart, eg. 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (Sending the new local master branch to origin/master)

Good luck and go ahead!


10