Программно исправлять последний коммит в предыдущем

Каждый раз, когда я хочу зафиксировать свой последний коммит во втором последнем коммите, я делаю это

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
Другие вопросы по тегам