Git: Как переназначить определенный коммит в прошлом? - PullRequest
1 голос
/ 08 ноября 2019

Я хотел бы переназначить на конкретный коммит, который не является HEAD другой ветки, но идет в обратном направлении:

A --- B --- C          master
            \
             \-- D --- E   topic

до

A --- B --- C          master
      \
       \-- D --- E   topic

Как мне этого добитьсяизящным и общим способом?

Под общим я подразумеваю, что целевой коммит (B) не обязательно является прямым предком HEAD (я мог бы с таким же успехом перейти на A или предыдущий коммит) и чтобыть намного больше, чем просто два коммита на ветке темы. Я мог бы также хотеть изменить положение с B на A.

1 Ответ

1 голос
/ 08 ноября 2019

Использование git cherry-pick

git rebase - это git cherry-pick на стероидах.

Если у вас есть только несколько коммитов для перемещения: вы можете использоватьgit cherry-pick, чтобы выбрать их один за другим

# move back to B
git checkout B

# start a branch here, and use it as the active branch
git checkout -b wip

# cherry-pick the commits you want to have
git cherry-pick D
git cherry-pick E

# if all went well : move the 'topic' branch to the current branch :
git checkout topic
git reset --hard wip

# delete the temporary 'wip' branch
git branch -d wip

Использование git rebase

Как упомянуто в комментариях: git rebase может принимать дополнительные опции дляперемещать только диапазон коммитов.

Вы можете сделать то же, что и вышеупомянутая последовательность cherry-pick, используя:

git rebase --onto B master topic

Дополнительное примечание: git rebase -i

git rebase также имеет флаг --interactive|-i:

git rebase -i --onto B master topic

С флагом -i: прежде чем что-либо делать, git откроет для вас текстовый редактор, где всеПеребазированный коммит будет указан в списке.

Этот шаг имеет очевидное преимущество: он показывает вам, что будет применено (до его фактического применения), а также описывает больше действий, чем просто «выбор этого коммита».

Вы можете искать в Интернете более полные учебники по git rebase -i, вот один из них:
Git Interactive Rebase, Squash, Amend и другие способыпереписывающей истории (мыслиbot.com)

...