Чи є спосіб повторити злиття в git?


17

Тож я зробив досить велику помилку. Я взяв на себе зобов’язання, потягнув, об’єднав (але зіпсував код, роблячи це) і потім натиснув. Я хотів би повторити це злиття і отримати правильний код. Чи можна це зробити?

Я використовую бітбукет.

git 

10
Лише зауваження - це насправді тематичне обговорення , і його не слід було мігрувати. Спробуйте прочитати власні довідкові сторінки та зверніть увагу на програмні засоби, які зазвичай використовуються у програмі . Однак це також є темою тут - SwiftCore, не відчувай себе погано, що вона була перенесена, це не твоя вина.
Боб

Відповіді:


13

Не впевнений, чи це "блаженний" спосіб зробити це, але ось що я зробив, щоб вирішити ту саму проблему, не потребуючи "силового натиску" чи нічого подібного.

Припустимо, що ваша історія виглядає приблизно так (а M - неспокійне злиття):

-A--B--C--M (master points here)
  \      /
   D----E

Біг git checkout -b merge_fix <commit ID E>створює гілку, перш ніж ми помилилися:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

Тепер давайте знову зробимо злиття на нашій новій гілці. Ми не можемо просто об'єднатись master, тому нам потрібно вручну вибрати фіксацію перед нашим поганим злиттям: git merge <commit ID C>Не робіть тих самих помилок, які ви робили минулого разу!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

Припускаючи, що фіксація Gвиглядає добре, тепер ми хочемо синхронізуватися з вершиною masterгілки. Ця команда вказує git ігнорувати зміни, які були внесені до master, і змушує наші зміни стати результатом злиття:git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

Нарешті, (знову припускаючи, що фіксація Hвиглядає добре, ми хочемо перейти вперед, masterщоб включити наше фіксоване злиття:

git checkout master
git merge merge_fix

Це дійсно просто переміщує masterвказівник гілки на H, але я скористаюся можливістю трохи очистити своє мистецтво ASCII:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

І там у вас є! ви успішно повторно зробили об'єднання, не відміняючи жодної історії!


6

Ви можете це зробити так:

  1. Поверніться до комісії перед об'єднанням.
  2. Виконайте злиття ще раз
  3. Силовий поштовх

Тобто:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

Просто пам’ятайте, що git push --forceце перепише все, що ви мали у віддаленому відділенні, і на це можуть вплинути й інші люди, які використовують цю гілку. (Зазвичай ви не повинні цього робити.)


6
Пам'ятайте лише зробити git push --forceце не безпечно
Zepplock

1

git merge --abort а потім можна знову злитися


Я просто отримую повідомлення "немає злиття для переривання"

3
Це можна зробити лише тоді, коли є конфлікти злиття.
chanchal118

чому мінус один? це мені допомогло.
swdev

Тому що питання полягає в тому, коли ви вже закінчили злиття (неправильно) і натиснули.
Робін Грін

-1

Перевірте, чи сподіваєтесь, що вона вам корисна

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

Незважаючи на те, що це може відповісти на питання ОП, лише відповіді на відповідні посилання не надто добре сприйняті в ТА Однак ви можете процитувати у своїй відповіді найбільш відповідні уривки із посилання.

Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
Пранів 웃
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.