Могу ли я заменить старый коммит коммитом из другой ветки?

#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. Да, потому что в этом случае, если вы перепишете историю, вы вызовете проблемы у всех, у кого эта ветка проверена локально.