git: снова вернуться назад во время интерактивной перебазировки

#git

Вопрос:

есть ли способ вернуться назад во время интерактивной перебазировки git? Давайте скажем что-то вроде этого:

 git init

for c in a b c; do
    touch $c amp;amp; git add $c amp;amp; git commit -m $c
done
 

Теперь, допустим, я запускаю какое-то интерактивное перебазирование, подобное этому:

 git rebase -i --root
# p 5e2df3f a
# e b87116d b
# p a55558f c
 

И, после редактирования b в соответствии с моими предпочтениями — возможно, разделив его на два коммита после a git reset HEAD^ -p , я получаю:

 git commit --amend
touch b2 amp;amp; git add b2 git commit -m "b''"
git log --oneline 
# a5f42cc (HEAD) b''
# 5446996 b'
# 5e2df3f a
 

как я могу теперь вернуться назад, не завершая перебазирование до конца? Т.е. прямо на этом этапе я бы увидел:

 git rebase --edit-todo
# p a55558f c
 

Но что, если я допустил ошибку в своем новом 5446996 b' коммите? Что, если я пойму, что мне нужно изменить что-то еще в 5e2df3f a том, что изначально было началом моей задачи редактирования перебазирования?

Могу ли я как-то вернуться назад — как вложенный git rebase -i (который не разрешен напрямую)? Или есть какие-то другие средства для достижения этой цели?

Я явно не хочу завершать перебазирование, в котором я нахожусь, а затем перезапускать его снова.

Спасибо!

Ответ №1:

Вы просто воспроизводите вручную, что будет делать вложенная перебазировка. То есть вы можете просто вернуться к фиксации и исправить ее:

 git checkout 5446996
# edit
git commit -a --amend
 

Затем вы выбираете оставшиеся коммиты:

 git cherry-pick 5446996..a5f42cc
 

При необходимости исправьте конфликты и git cherry-pick --continue .

Затем завершите перебазирование с git rebase --continue помощью .

Комментарии:

1. Спасибо! Я постараюсь поместить это в несколько более автоматизированный скрипт, чтобы сделать возврат назад менее сложным. Я думаю, что вместо git cherry-pick можно было бы по существу добавить диапазон фиксации в edit-todo после проверки!

2. Спасибо, это действительно здорово! Я автоматизировал все это с помощью github.com/milianw/shell-helpers/blob/master/git-fixup теперь давайте посмотрим, как он будет вести себя в реальном мире в течение следующих недель 🙂