Как отменить мерзавец слияния с конфликтами


785

Я на ветке mybranch1. mybranch2от, mybranch1и изменения были внесены в mybranch2.

Затем, пока mybranch1я включен, git merge --no-commit mybranch2 это показывает, что при слиянии возникли конфликты.

Теперь я хочу отменить все ( mergeкоманду), чтобы mybranch1вернуться к тому, что было раньше. Я понятия не имею, как мне поступить об этом.


Ответы:


1356

Последний Git:

git merge --abort

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

До версии 1.7.4:

git reset --merge

Это более старый синтаксис, но он делает то же самое, что и выше.

До версии 1.6.2:

git reset --hard

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


1
Но для более старых версий git это способ использования
Anshul

7
Иногда вам все еще нужно использовать git reset --mergeдаже в более свежих версиях. У меня была git merge --abortошибка (без изменений), где он git reset --mergeуспешно (и делает правильно) в git 2.2.1.
Теодор Мердок

Я обнаружил, что мне нужно сделать это git merge --abort, git reset --mergeкогда у меня возникнут конфликты с автоматическим всплытием из моего тайника.
Шеф-повар фараона

1
обычно git merge --abortработает для меня, однако я оказался в ситуации, когда я выписался в отключенном состоянии HEAD, и один из моих файлов имел «оба измененных» состояния. Я хотел отбросить все и вернуться в ветку, я должен был git reset --hard, git merge --abortсказал мне, что не было слияния, чтобы прервать (MERGE_HEAD отсутствует).
Яно

Иногда git merge --abortне может вернуть ваше предыдущее состояние, и в этом случае «старый синтаксис» git reset --hardделает свое дело .
Кевин Стюарт

130

На самом деле, стоит отметить, что git merge --abortэто эквивалентно только тому, git reset --mergeчто MERGE_HEADприсутствует. Это можно прочитать в справке git для команды слияния.

git merge --abort # is equivalent to git reset --merge when MERGE_HEAD is present.

После неудачного слияния, когда его нет MERGE_HEAD, неудачное слияние можно отменить, git reset --mergeно не обязательно с помощью git merge --abort, поэтому они не только имеют старый и новый синтаксис для одной и той же вещи .

Лично я нахожу git reset --mergeгораздо более полезным в повседневной работе.


2
Спасибо, эта информация была очень полезной. У меня было слияние, которое началось с git stash applyнеправильной ветви, и git merge --abortничего не сделало (нет MERGE_HEAD), пока git reset --mergeсделал трюк.
геомастер

4
Я видел около 10 человек, которые говорили, что git merge --abortэто новая команда, git reset --mergeи я столкнулся с той же проблемой, что и @geomaster, это было очень полезно, спасибо!
Том

106

Предполагая, что вы используете последнюю версию Git,

git merge --abort

Хорошо, это не работает с 1.7.0.7 :(. Нужно использовать reset --hard с ним
Anshul

5

Есть две вещи, которые вы можете сделать сначала отменить слияние по команде

git merge --abort

или

вы можете временно перейти в предыдущее состояние коммита

git checkout 0d1d7fc32 

0

Sourcetree

Если вы не зафиксировали свое слияние, просто дважды щелкните по другой ветке (= checkout), и когда sourcetree спросит вас об отмене всех изменений, тогда согласитесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.