Отменить слияние после нажатия


80

Шаги, которые я выполнил:

У меня две ветки: branch1 и branch2,

$git branch --Initial state
$branch1

$git checkout branch2
$git pull origin branch1 --Step1

Я разрешаю конфликты и

$git commit -m "Merge resolved"

тогда

$git checkout branch1
$git merge branch2
$git push origin branch1

Теперь я понял, что, находясь на шаге 1, автоматическое слияние удалило некоторый код, и код изменения был выдвинут, теперь я хочу вернуться в исходное состояние, чтобы отменить любые изменения. Ищу немедленную помощь?


Git revert делает не то, что вы хотите?
Фредерик Чунг

1
он дает сообщение как: fatal: Commit b4a758b36a5bde9311061fe7b56e4f47859de052 - это слияние, но опция -m не указана. @FrederickCheung
Bijendra

Ознакомьтесь с руководством по опции -m. kernel.org/pub/software/scm/git/docs/git-revert.html Вскоре вы можете использовать -m 1 или -m 2. Это выбирает, к какой из двух родительских ревизий вы хотите вернуться.
Илья Иванов

дааа, я использовал git revert -m 1 SHA, теперь все изменения происходят как изменения, которые должны быть зафиксированы в моем локальном
хранилище

Был ошибка в Vim , который выходил его во время операции Revert, я побежал GIT конфигурации --global core.editor / USR / BIN / Vim , и это фиксируется вопрос , а затем Revert успешно побежал , чтобы исправить issue.Thanx
Bijendra

Ответы:


95

Вы можете отменить слияние, следуя официальному руководству , однако это оставляет Git ошибочным убеждением, что объединенные коммиты все еще находятся в целевой ветке.

В основном вам необходимо:

git revert -m 1 (Commit id of the merge commit)

26
С файлом 1. Это означает firstродительский коммит слияния. Но если один (гипотетически) «случайно» слил мастер с веткой, затем мастер с быстрой переадресацией перешел к объединенному коммиту - нужно использовать -m 2для отмены слияния на мастере.
Krzysztof Jabłoński

1
Будьте осторожны с этим 1. Это испортило мой репозиторий, частично отменив слияние, тогда как я хотел полностью отменить слияние. В итоге я вернул откат!
Прагматичный компьютерщик,

1
@JavadSadeqzadeh или вы испортили свой репозиторий, скопировав из SO, не проверив полностью, что делает ответ
Джоэл

33

Попробуйте использовать, git reflog <branch>чтобы узнать, где была ваша ветка до слияния, и git reset --hard <commit number>восстановить старую ревизию.

Reflog покажет вам более старые состояния ветки, так что вы можете вернуть его в любой набор изменений, который вам нравится.

Убедитесь, что вы находитесь в правильной ветке, когда используете git reset

Вы можете изменить историю удаленного репозитория git push -f, однако это не рекомендуется, поскольку кто-то уже может загрузить изменения, внесенные вами.


1
Я отправил код в удаленную ветку, как это вернет код оттуда ..
Биджендра

3
если вы уже нажали, вы НЕ хотите переписывать местную историю, как описал Илья
ms-tg

2
Извините, я пропустил эту вещь ... Иногда вы можете использовать git push -f для перезаписи удаленной истории. Это зависит от конфигурации вашего удаленного репозитория и других членов команды (если они не убьют вас за этот принудительный толчок).
Илья Иванов

8

Первый вариант - это использование git revert.

git revert -m 1 [sha-commit-before-merge]

git revertБудет откатить изменения , но сохранит историю. Поэтому вы не сможете продолжить работу в той же ветке, так как вы больше не можете видеть фактическую разницу между объединенной ветвью и вашей функциональной веткой. Используйте следующий способ, чтобы удалить историю. Делайте это очень осторожно, если и только если вы в данный момент единственный, кто вносит изменения в ветку.

git reset --hard [sha-commit-before-merge]
git push [origin] [branch] --force

1

В моем случае я объединил свою ветку (скажем: my-branch) с другой функциональной веткой (feature-branch), но не с master. Итак, история моей ветки была такой:

my-branch (before merge)

---master----m1----m2----m3---m4

После слияния его с другим, у feature-branchкоторого были коммиты f1, f2поверх мастера, он стал таким:

my-branch (after merge)

---master----m1----m2----f1----f2----m3---m4----mergecommit

Это могло произойти из-за того, что во время работы над моей веткой я выполнил слияние из master после 2 коммитов, или одна из 2 веток могла быть не в актуальном состоянии с master. Таким образом, в этом случае git revert -m 1он не работал, так как он оставил их f1и f2зафиксировал между ними.

Решение было простым, и оно будет работать в обычных сценариях, когда у нас нет промежуточных коммитов:

git rebase -i HEAD~6

Вместо 6 используйте соответствующее число в зависимости от того, сколько прошлых коммитов вы хотите изменить. Теперь редактор Vim открыт, просто отметьте нежелательные коммиты такими dropже и выйдите, используя :wq журнал проверки:

git log --oneline 

принудительный толчок

git push -f

Теперь удаленная ветка должна быть в предыдущем состоянии.

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