Могу ли я заменить старый коммит коммитом из другой ветки? - PullRequest
0 голосов
/ 13 апреля 2019

Предположим, у меня есть ветвь B1, последние коммиты которой зафиксированы C1 -> C2 -> C3, и другая ветвь B2, последние коммиты которой C4 -> C5 -> C6.

Как я могу заменить коммит C2 на B1, скажем, коммитом C4 из B2?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

Вы можете сделать это с интерактивной перебазировкой - но не перебазой B1 на B2.Вместо этого выполните:

git rebase -i B1 hash-of-C2^

(вместо hash-of-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 также должен работать, но мне нравится просто копировать весь хэш, а не сокращать его в случае, если я испорчу его.)

Вот и все.Конечно, вам может потребоваться разрешить конфликты из-за этих изменений, как и при любой перебазировке.

0 голосов
/ 13 апреля 2019

Предполагая, что обе ветви опубликованы, вы можете выбрать опцию возврата / вишневого пика:

# on branch B1
git revert C2
git cherry-pick C4

Это оставило бы ветку B1, похожую на следующую:

C1 -- C2 -- C3 -- RC2 -- C4

Но функционально это должно быть примерно таким же, как:

C1 -- C4 -- C3
...