Тож я зробив досить велику помилку. Я взяв на себе зобов’язання, потягнув, об’єднав (але зіпсував код, роблячи це) і потім натиснув. Я хотів би повторити це злиття і отримати правильний код. Чи можна це зробити?
Я використовую бітбукет.
Тож я зробив досить велику помилку. Я взяв на себе зобов’язання, потягнув, об’єднав (але зіпсував код, роблячи це) і потім натиснув. Я хотів би повторити це злиття і отримати правильний код. Чи можна це зробити?
Я використовую бітбукет.
Відповіді:
Не впевнений, чи це "блаженний" спосіб зробити це, але ось що я зробив, щоб вирішити ту саму проблему, не потребуючи "силового натиску" чи нічого подібного.
Припустимо, що ваша історія виглядає приблизно так (а 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
І там у вас є! ви успішно повторно зробили об'єднання, не відміняючи жодної історії!
Ви можете це зробити так:
Тобто:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
Просто пам’ятайте, що git push --force
це перепише все, що ви мали у віддаленому відділенні, і на це можуть вплинути й інші люди, які використовують цю гілку. (Зазвичай ви не повинні цього робити.)
git push --force
це не безпечно
git merge --abort
а потім можна знову злитися
Перевірте, чи сподіваєтесь, що вона вам корисна
https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html