Git натисніть на неправильну гілку


99

Працюючи з git, після деякого "коміту" та декількох "натискань", я зрозумів, що використовую неправильну гілку!

Тепер я повинен певним чином видалити мої зміни в wrong_branch і зафіксувати та просунути зміни в right_branch

Який найкращий (і простий) спосіб це зробити?

спасибі


можливий дублікат Git: видалення вибраних
комітів

Гарне запитання @tokland: 99% рубінових розробників використовують git, а проект, над яким я працюю, знаходиться в RoR ... але я знаю, що це не могло бути гарною мотивацією
Алессандро Де Сімоне,

3
З моєї точки зору, це не копія того, що зауважив halfdan, оскільки мова йде також про переміщення комітів до іншої гілки, а не лише їх видалення.
olenz

Відповіді:


142

переключіться на цю гілку, перевіряйте git logта git revertці коміти окремо. Після цього поверніться до потрібної гілки, і там ви зможете git cherry-pickвибрати конкретні коміти з git refs та об’єднати їх у праву гілку.

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

Якщо коміти згруповані разом, і після ваших брудних комітів немає жодних коммітів, ви можете навіть використовувати git resetцю неправильну гілку до стану безпосередньо перед вашими комітами, а потім знову слідувати за нею, git cherry-pickщоб отримати ваші коміти в потрібну гілку.

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

Revert + cherry-pick здається набагато простішим, ніж інші можливі методи, що включають скидання головки та / або перебазування.
ChrisV

2
Для git cherry-pick ви можете покласти кілька шасів в один рядок, тобто git cherry-pick commitsha1 commitsha2.
ThomasW

Рятувальник! І не складно. Дякую!
Крейг Сільвер

що трапляється, коли ви хочете об'єднати неправильну_галузь (наприклад, розробити) у правильну_галузь (наприклад, функція / X), тоді ви отримаєте скасування, скасовуючи зміни, які ви вибрали.
timB33

revertє набагато чистішим та менш драматичним, ніж resetякщо ви дійсно не хочете видалити щось делікатне (облікові дані?)
Qumber

3

Найпростіший спосіб - використання git rebase. Припустимо, у вас є такий параметр:

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

Ви хочете перемістити зміни C3, C4 до правої гілки.

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

Тепер установка

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

Тоді вам доведеться підштовхувати свої результати з силою (ЯКЩО ще ніхто не синхронізував ваш віддалений репо):

git push -f remote:right_branch

Я не пробував це рішення, я вже працював над першою відповіддю (і це спрацювало). Я не думав про перебазу, це виглядає як гарна альтернатива, дякую
Алессандро Де Сімоне

1
Замість того git push -f, краще використовувати git push --force-with-lease. Принаймні, це гарантує, що віддалене посилання буде оновлено, лише якщо ніхто не натискав інші коміти поверх ваших комітів.
П’єр-Олів’є Варес

2

Трохи ярликів, що додають відповіді Дхруви

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

git checkout wrong_branch
git reset commitsha2 #commit just before commitsha1
git push wrong_branch -f
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.