#git #version-control #rebase
#git #контроль версий #перебазирование
Вопрос:
Предположим, у меня есть ветвь B1, последние коммиты которой — C1 -> C2 -> C3 , и другая ветвь B2, последние коммиты которой — C4 -> C5 -> C6.
Как я могу заменить фиксацию C2 на B1, скажем, фиксацией C4 из B2?
Ответ №1:
Вы можете сделать это с помощью интерактивного перебазирования, но не перебазирования B1 на B2. Скорее, сделайте:
git rebase -i B1 hash-of-C2^
(вместо хэша C2 вы введете фактический хэш C2, то есть шестнадцатеричную строку, которая выглядит так ddc18e47147f4f5cb969609150c4d29040b2c07f
, как вы можете видеть с помощью git log
)
затем в редакторе вы увидите:
pick short-hash-of-C2 commit comment here
pick short-hash-of-C3 commit comment here
(короткий хэш будет префиксом полного хэша C2, например ddc18e47
)
Теперь keep
замените drop
на C2, но добавьте строку для C4, чтобы теперь у вас было:
drop short-hash-of-C2 commit comment here
pick full-hash-of-C4
pick short-hash-of-C3 commit comment here
(Обратите внимание, что короткий хэш C4 также должен работать, но мне нравится просто копировать весь хэш, а не сокращать его на случай, если я его испорчу.)
Вот и все. Конечно, вам может потребоваться разрешить конфликты из-за этих изменений, как и при любом перебазировании.
Ответ №2:
Предполагая, что обе эти ветки опубликованы, вы можете выбрать опцию возврата / выбора вишни:
# on branch B1
git revert C2
git cherry-pick C4
В результате ветка B1
будет выглядеть следующим образом:
C1 -- C2 -- C3 -- RC2 -- C4
Но функционально это должно быть примерно так же, как:
C1 -- C4 -- C3
Комментарии:
1. Итак, 1 за альтернативу, но я бы предпочел не иметь этих «шрамов» в журнале фиксации. Также — можете ли вы уточнить, что вы подразумеваете под «публикуемыми» ветвями?
2. @einpoklum Ваш ответ заключается в переписывании истории, и обычно у вас нет такой свободы, если ветка уже опубликована и доступна нескольким людям.
3. Тим Бигелесьен: То есть вы имеете в виду «опубликованный» в буквальном смысле, то есть доступный и возможный для использования многими людьми?
4. Да, потому что в этом случае, если вы перепишете историю, вы вызовете проблемы у всех, у кого эта ветка проверена локально.