Скасувати злиття після натискання


80

Кроки, які я виконав:

У мене є дві гілки branch1 та branch2,

$git branch --Initial state
$branch1

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

Я вирішував конфлікти і робив a

$git commit -m "Merge resolved"

тоді

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

Тепер я зрозумів, що, перебуваючи на кроці 1, автоматичне злиття видалило якийсь код, і код зміни було висунуто, тепер я хочу повернутися до мого початкового стану, щоб скасувати будь-які зміни. Шукає негайної допомоги?


Чи git revert робить не те, що ти хочеш?
Фредерік Чонг,

1
він видає повідомлення як: fatal: коміт 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, яка виходила з неї під час операції відновлення, я запустив git config --global core.editor / usr / bin / vim, і це виправило проблему, а потім повернення успішно запустилося, щоб виправити проблему. Подяка
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 (before merge)

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

Після об'єднання його з іншим, feature-branchякий мав коміти f1, f2поверх master, він став таким:

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.