Программно исправлять последний коммит в предыдущем
Каждый раз, когда я хочу зафиксировать свой последний коммит во втором последнем коммите, я делаю это
git rebase HEAD~2 -i
<replace pick with fixup on line 2>
Есть ли способ сделать это в автоматическом сценарии, без вмешательства человека?
Я попробовал это, и это не работает:
git commit --fixup=HEAD
3 ответа
git reset HEAD~1 --soft
git commit --amend --no-edit
или же
git reset HEAD~2 --soft
git commit -C ORIG_HEAD^ --reset-author
или же
head=`git log -1 --pretty=%H HEAD~1`
git reset HEAD~2 --hard
git merge --squash ORIG_HEAD
git commit -C $head --reset-author
или же
head=`git log -1 --pretty=%h HEAD~1`
git reset HEAD~2 --hard
git cherry-pick -n HEAD..ORIG_HEAD
git commit -C $head --reset-author
Первое достаточно в вашем случае. Остальные три здесь просто для удовольствия, что может быть полезно в других случаях.
Обновление: объяснение второго:
Предположим, у нас есть A-B-C
как последние три коммитов и C
это голова. То, что вы хотите, это сквош B
а также C
в один коммит, который повторно использует B
коммит сообщения.
git reset HEAD~2 --soft
перезагружается HEAD
в A
и сохраняет изменения B
а также C
в индексе и в рабочем дереве. Тогда следующее git commit
создает коммит, который включает изменения в индексе, или изменения B
а также C
,
Как следует из названия, ORIG_HEAD
указывает на исходную головку, в данном случае на предыдущую, C
, А также ORIG_HEAD^
означает первый родитель ORIG_HEAD
, который B
, -C ORIG_HEAD^
означает повторно использовать сообщение коммита B
без редактирования.
Подробнее о --soft, -C и --reset-author.
Каждый раз, когда я хочу исправить мой последний коммит,
Это можно сделать напрямую:
git commit --amend
Для старых коммитов:
git commit --fixup $commit
git rebase HEAD~n -i --autosquash
Это будет автоматически интерпретировать fixup!
Префиксы, сгенерированные ранее с помощью --fixup (или вручную).
Я все еще ищу "каноническое" решение с самим Git.
Вот мой временный обходной путь решения:
EDITOR="sed -i "2s/pick/fixup/'" git rebase -i HEAD~2
В основном просто заменили интерактивный текстовый редактор на sed
,
Кажется, это работает для меня, полностью автоматическое и не требует какого-либо конкретного sha или чего-то еще:
git commit -a --fixup HEAD ; GIT_SEQUENCE_EDITOR=touch git rebase --interactive --autosquash HEAD~2