git reset HEAD~1 --soft
git commit --amend --no-edit
or
git reset HEAD~2 --soft
git commit -C ORIG_HEAD^ --reset-author
or
head=`git log -1 --pretty=%H HEAD~1`
git reset HEAD~2 --hard
git merge --squash ORIG_HEAD
git commit -C $head --reset-author
or
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.
person
ElpieKay
schedule
16.04.2018