Git нажать на неправильную ветку

99

Работая с git, после некоторой фиксации и пары нажатий я понял, что использую не ту ветку!

Теперь мне нужно каким-то образом удалить мои изменения в неправильной_бранке и зафиксировать и нажать изменения в right_branch

Какой лучший (и простой) способ сделать это?

Спасибо

Алессандро Де Симоне
источник
возможный дубликат Git: удаление выбранных
коммитов
Хороший вопрос @tokland: 99% разработчиков Ruby используют git, а проект, над которым я работаю, находится в RoR ... но я знаю, что это не может быть хорошей мотивацией
Алессандро Де Симоне
3
С моей точки зрения, это не повторение того, что заметил Халфдан, поскольку речь идет также о перемещении коммитов в другую ветку, а не только об их удалении.
olenz

Ответы:

144

переключитесь на эту ветку, проверьте 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 commitsha1 commitsha2.
ThomasW
Спасатель! И не сложно. Спасибо!
Craig Silver
что происходит, когда вы хотите объединить неверную ветку (например, разработать) в right_branch (например, feature / X), тогда вы получите
откаты,
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
тарикакьол
источник