Відкат злиття Git


225
develop branch
--> dashboard (working branch)

Я використовую git merge --no-ff developдля об'єднання будь-яких змін у верхній частині потоку на інформаційній панелі

git журнал:

commit 88113a64a21bf8a51409ee2a1321442fd08db705
Merge: 981bc20 888a557
Author: XXXX <>
Date:   Mon Jul 30 08:16:46 2012 -0500

    Merge branch 'develop' into dashboard

commit 888a5572428a372f15a52106b8d74ff910493f01
Author: root <root@magneto.giveforward.com>
Date:   Sun Jul 29 10:49:21 2012 -0500

    fixed end date edit display to have leading 0

commit 167ad941726c876349bfa445873bdcd475eb8cd8
Author: XXXX <>
Date:   Sun Jul 29 09:13:24 2012 -0500

У злитті було близько 50+ комітів, і мені цікаво, як просто повернути злиття, щоб приладова панель повернулася до стану попереднього злиття

Друга частина цього полягає в тому, що якщо я не зливаюсь --no-ff, я не змушую команду " Об'єднати гілку" перетворитися "на інформаційну панель ". Як би я повернути це об'єднання назад?


3
Можливий дублікат Undo a Git merge? .

Відповіді:


321

Повернення зобов'язання щодо об'єднання було вичерпно висвітлено в інших питаннях. Коли ви здійснюєте швидке злиття вперед, другий, який ви описуєте, ви можете використовувати git resetдля повернення до попереднього стану:

git reset --hard <commit_before_merge>

Ви можете знайти <commit_before_merge>з git reflog, git logабо, якщо ви відчуваєте моксі (і нічого іншого не зробили):git reset --hard HEAD@{1}


6
дякую за швидку відповідь .. переглядаючи журнал git, фіксація перед об'єднанням 50+ починається назад, оскільки розвиток злиття git насправді ставить у всі інші коміти. Я здогадуюсь, що я не отримую, якщо я не знаю, що / де було це злиття - як я його знаходжу? Ви згадуєте про знаходження комітету_заперед_мерге .. Я думаю, я не розумію цієї частини
cgmckeever

4
схоже, що з git reflog виглядає так, що він красиво підсумовує останні голови і дозволяє мені знати, куди мені потрібно скинути. Здається, що у журналу git занадто багато деталізації, щоб точно визначити місце для скидання. Спасибі
cgmckeever

1
Так, reflogрятівник. HEAD@{1}просто описує другий останній стан HEAD або, більш технічно: "Посилання, що супроводжується суфіксом @ із порядковим описом, укладеним у дужку пари (наприклад, {1}, {15}), вказує n-е попереднє значення цього реф. "
Крістофер

4
А що з підштовхуванням повернення до віддаленого? Я не бачу, як це буде працювати.
Антон Савельєв

2
Це безперспективно. Це знищує всі комісії після злиття.
aaa90210

151

Звідси:

http://www.christianengvall.se/undo-pushed-merge-git/

git revert -m 1 <merge commit hash>

Git revert додає нову комісію, яка відкочує вказану комісію.

Використання -m 1 говорить про те, що це злиття, і ми хочемо повернутись до батьківського комітету на головній гілці. Ви б використали -m 2, щоб вказати галузь розробки.


30
Зауважте, що ви не можете повторно об'єднати гілку після цього, як говорять документи: "Повернення комісії злиття заявляє, що ви ніколи не хочете, щоб зміни дерева, внесені об'єднанням. В результаті, пізніші злиття принесуть лише внесені зміни дерева. зобов’язаннями, які не є пращурами раніше поверненого злиття. Це може бути, а може і не бути тим, що ви хочете ".
Далібор Карлович

23
@ DaliborKarlović Це твердження трохи суворе. Ви, безумовно, можете повернути ці зміни пізніше, хитрість полягає в тому, щоб повернути комісію повернення. Більше інформації тут у розділі "Повернення
ревертування

3
На жаль, hereпосилання в коментарі @Hilikus більше не діє. Сайт стверджує, що вміст переміщено до книги ( git-scm.com/book/en/v2 ), але якщо так, то тут не шукати банальних даних.
Джессі

@ DaliborKarlović, це випадок, коли відповідь вище від @Christopher?
Джеймс Б

3
Вміст про скасування злиття було переміщено сюди
SEK

28

Просто скиньте комісію злиття за допомогою git reset --hard HEAD^ .

Якщо ви використовуєте --no-ff git завжди створює злиття, навіть якщо ви нічого не зробили між ними. Без --no-ff git просто зробить швидкий вперед, тобто ваші гілки HEAD будуть встановлені на HEAD злитої гілки. Щоб вирішити цю проблему, знайдіть ідентифікатор комісії, до якого потрібно повернутись та git reset --hard $COMMITID.


1
Хороше рішення, якщо ви не знаєте, що потрібно зробити перед об'єднанням.
iglesiasedd

Працював для мене, оскільки я не знаю, чинити ідентифікатор + 1
Анант Сінгх --- Живий, щоб померти

якщо небажане злиття вже було здійснено для віддаленого, я використовував git push -f для оновлення віддаленої гілки після повернення.
зумек

16
git revert -m 1 88113a64a21bf8a51409ee2a1321442fd08db705

Але можуть мати несподівані побічні ефекти. Дивіться --mainline parent-numberваріант у git-scm.com/docs/git-revert

Можливо, грубим, але ефективним способом було б перевірити лівого з батьків цього комітету, зробити копію всіх файлів, HEADще раз оформити замовлення та замінити весь вміст на старі файли. Тоді git підкаже вам, що повертається назад, і ви створите власний комітет повернення :)


1
+1, тому що ця відповідь не псується з історією, як це відбувається скидання (дуже важливо, якщо ви вже натиснули на віддалений). Але яких несподіваних побічних ефектів слід очікувати?
pedromanoel

3
Це побічний ефект, про який ви згадали? Reverting a merge commit declares that you will never want the tree changes brought in by the merge. As a result, later merges will only bring in tree changes introduced by commits that are not ancestors of the previously reverted merge. This may or may not be what you want.
pedromanoel

1
Ви кажете, що git resetце рішення, але також згадуєте, що це може мати несподівані побічні ефекти. Однак це посилання є git revert, не git reset:)
Марк

2
Зауважте, у налаштуваннях git не встановлено прапорця -m. Також зверніть увагу на @JorgeOrpinel посилання на документи git-return, а не git-reset. Я думаю, він мав намір сказати git revertне такgit reset
Девін Глісон Ламберт

Як уникнути Mainline було вказано, але фіксація 1234xyz не є помилкою злиття .
Ахал

0

Якщо ви об'єднали гілку, то відмінили злиття, використовуючи запит на витягнення, і об'єднали цей запит, щоб відновити.

Найпростіший спосіб, який я відчував:

  1. Вийміть нову гілку від develo / master (де ви об’єдналися)
  2. Скасувати "повернути" за допомогою git revert -m 1 xxxxxx(якщо відновлення було об'єднано за допомогою гілки) або з використанням, git revert xxxxxxякщо це було просте відновлення
  3. Тепер у новій гілці повинні бути зміни, які ви хочете знову об’єднати.
  4. Внесіть зміни або об'єднайте цю галузь для розвитку / освоєння
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.