Как переупорядочить коммиты в Git неинтерактивно

Какие неинтерактивные команды git обеспечивают переход от "До" к "После"?

До:

A---B---C---D

После:

A---C'---B'---D'

3 ответа

В вашем случае вы можете перебазировать интерактив: git rebase -i HEAD~4 Тогда вы можете просто изменить порядок ваших выборов

Например, давайте добавим еще три файла в нашу ветку:

git add A
git commit -m "A"

git add B
git commit -m "B"

git add C
git commit -m "C"

Ваш шортлог будет:

$ git shortlog
 (3):
      A
      B
      C

Если вы хотите изменить порядок B с C:

$ git rebase -i HEAD~2
pick 1f9133d B
pick 33f41be C

Вы просто изменяете их порядок:

pick 33f41be C
pick 1f9133d B

После того, как вы закончите писать, смотрите короткий список:

$ git shortlog
 (3):
      A
      C
      B

Вы можете сделать то же самое со всеми коммитами, переупорядочив. Это как то, что вы видите, это то, что вы получаете, что довольно круто:)

Попробуй это:

git reset --hard A
git cherry-pick C
git cherry-pick B
git cherry-pick D

Там может быть способ с git rebase, но я не очень понял это.

Смотрите Как мне запустить git rebase --interactive неинтерактивным способом? за использование git rebase --interactive неинтерактивным способом.

Затем, если у вас есть формальные критерии для переупорядочения коммитов, вы можете написать это, см., Например, " Сгладить git merge", чтобы переупорядочить коммиты по исходной дате фиксации.

Если вы хотите изменить порядок коммитов в скрипте и не хотите иметь дело с хешами коммитов, то это, похоже, работает как общее решение (на основе ответа Паоло Эберманна):

git reset --hard @~3
git cherry-pick ORIG_HEAD~1
git cherry-pick ORIG_HEAD~2
git cherry-pick ORIG_HEAD

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

Другие вопросы по тегам