Как отменить коммит слияния, который уже передан в удаленную ветку? - PullRequest
740 голосов
/ 18 августа 2011

git revert <commit_hash> один не будет работать.-m должно быть указано, и я довольно смущен этим.

Кто-нибудь испытывал это раньше?

Ответы [ 13 ]

883 голосов
/ 18 августа 2011

Опция -m указывает родительский номер .Это потому, что коммит слияния имеет более одного родителя, и Git не знает автоматически, какой родитель был главной линией, и какой родитель был ветвью, которую вы хотите удалить.

Когда вы просматриваете коммит слияния ввывод git log, вы увидите его родителей, перечисленных в строке, которая начинается с Merge:

commit 8f937c683929b08379097828c8a04350b9b8e183
Merge: 8989ee0 7c6b236
Author: Ben James <ben@example.com>
Date:   Wed Aug 17 22:49:41 2011 +0100

Merge branch 'gh-pages'

Conflicts:
    README

В этой ситуации git revert 8f937c6 -m 1 даст вам дерево, как было в 8989ee0 и git revert -m 2 восстановит дерево, как это было в 7c6b236.

Чтобы лучше понять родительские идентификаторы, вы можете запустить:

git log 8989ee0 

и

git log 7c6b236
299 голосов
/ 04 июля 2015

Вот полный пример в надежде, что это кому-нибудь поможет:

git revert -m 1 <commit-hash> 
git commit -m "Reverting the last commit which messed the repo."
git push -u origin master

Где <commit-hash> - это хэш коммита слияния, который вы хотите отменить, и как указано в объяснении этот ответ , -m 1 означает, что вы хотите вернуться к дереву первого родителя до слияния.

Строка git commit ... по существу фиксирует ваши изменения, в то время как третья строкаделает ваши изменения общедоступными, отправляя их в удаленную ветвь.

146 голосов
/ 18 августа 2011

Бен рассказал вам, как отменить коммит слияния, но это очень важно вы понимаете, что при этом "объявляется, что вы никогда не захотите изменений дерева, внесенных слиянием. В результате позжеслияния принесут только изменения дерева, внесенные коммитами, которые не являются предками ранее отмененного слияния. Это может или не может быть тем, что вы хотите. " (man-страница git-merge) .

Сообщение о статье / списке рассылки , связанное со страницей руководства, подробно описывает механизмы и возможные аспекты.Просто убедитесь, что вы понимаете, что если вы отмените коммит слияния, вы не сможете просто слить ветку позже и ожидать, что те же изменения вернутся.

66 голосов
/ 26 января 2017

Вы можете выполнить эти шаги, чтобы отменить неправильные коммиты или вернуть удаленную ветвь обратно в правильный HEAD / состояние.

  1. извлечение удаленного филиала в локальный репозиторий.
    git checkout development
  2. скопировать хеш коммита (т.е. идентификатор коммита непосредственно перед неправильным коммитом) из журнала git git log -n5

    вывод:

    commit 7cd42475d6f95f5896b6f02e902efab0b70e8038 «Слить ветку« Неправильно зафиксировать »в« развитие »»
    commit f9a734f8f44b0b37ccea769b9a2fd774c0f0c012 "это неверный коммит"
    commit 3779ab50e72908da92d2cfcd72256d7a09f446ba "это правильный коммит"

  3. сбросить ветку на хеш коммита, скопированный на предыдущем шаге
    git reset <commit-hash> (i.e. 3779ab50e72908da92d2cfcd72256d7a09f446ba)

  4. запустите git status, чтобы показать все изменения, которые были частью неправильного коммита.
  5. просто запустите git reset --hard, чтобы отменить все эти изменения.
  6. принудительно перенесите вашу локальную ветку в удаленную систему и обратите внимание, что история ваших изменений чиста, как и прежде, чем она была загрязнена.
    git push -f origin development
40 голосов
/ 27 сентября 2017
git revert -m 1 <merge-commit>
21 голосов
/ 03 мая 2018

Чтобы сохранить журнал в чистоте, так как ничего не произошло (с некоторыми недостатками в этом подходе (из-за push -f)):

git checkout <branch>
git reset --hard <commit-hash-before-merge>
git push -f origin HEAD:<remote-branch>

'commit-hash-before-merge' приходит из журнала (git log) после слияния.

16 голосов
/ 14 июня 2016

Иногда наиболее эффективным способом отката является возврат назад и замена.

git log

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

git checkout -b newbranch <HASH>

Затем удалите старую ветку, скопируйте новую ветвь на ее место и перезапустите оттуда.

git branch -D oldbranch
git checkout -b oldbranch newbranch

Если он был передан, тогда удалите старую ветку из всех репозиториев, переместите переделанную ветвь в самую центральную и перетяните ее вниз ко всем.

1 голос
/ 09 июля 2019

Если вы хотите отменить merge коммит, вот что вам нужно сделать.

  1. Сначала проверьте git log, чтобы найти идентификатор вашего слияния.Вы также найдете несколько родительских идентификаторов, связанных с объединением (см. Изображение ниже).

enter image description here

Запишите идентификатор фиксации слияния, показанный вжелтый.Родительские идентификаторы - это идентификаторы, записанные в следующей строке как Merge: parent1 parent2.Сейчас ...

Рассказ:

Переключиться на ветку, в которой было выполнено слияние.Затем просто выполните команду git revert <merge commit id> -m 1, которая откроет консоль vi для ввода сообщения о коммите.Написать, сохранить, выйти, готово!

Длинный рассказ:

Переключиться на ветку, в которой было выполнено слияние.В моем случае это ветвь test, и я пытаюсь удалить из нее ветку feature/analytics-v3.

git revert - это команда, которая отменяет любой коммит.Но при возврате коммита merge есть неприятный трюк.Вам необходимо ввести флаг -m, иначе он не будет выполнен.С этого момента вам нужно решить, хотите ли вы вернуть свою ветку и сделать ее похожей на parent1 или parent2 с помощью:

git revert <merge commit id> -m 1 (возвращаетна parent2)

git revert <merge commit id> -m 2 (возвращается к parent1)

Вы можете git войти эти родители, чтобы выяснить, какой путь вы хотите пойти, и это корень всей путаницы,

1 голос
/ 08 июня 2019

Все ответы уже охватили большинство вещей, но я добавлю свои 5 центов. Короче говоря, отменить коммит слияния довольно просто:

git revert -m 1 <commit-hash>

Если у вас есть разрешение, вы можете отправить его прямо в «главную» ветку, в противном случае просто переместите его в свою «возвратную» ветвь и создайте запрос на извлечение.

Вы можете найти более полезную информацию по этому вопросу здесь: https://itcodehub.blogspot.com/2019/06/how-to-revert-merge-in-git.html

1 голос
/ 14 января 2019

git doc о git revert -m предоставьте ссылку, чтобы объяснить это: https://github.com/git/git/blob/master/Documentation/howto/revert-a-faulty-merge.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...