#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 теперь давайте посмотрим, как он будет вести себя в реальном мире в течение следующих недель 🙂