В вопросе может быть неоднозначно, что подразумевается под «последним».
например git log --graph
выводит следующее (упрощенно):
* commit H0
|
* merge
|\
| * commit B0
| |
| * commit B1
| |
* | commit H1
| |
* | commit H2
|/
|
Тогда последними коммитами по времени являются H0, слияние, B0. Чтобы раздавить их, вам придется перебазировать вашу объединенную ветвь при коммите H1.
Проблема в том, что H0 содержит H1 и H2 (и, как правило, больше коммитов до слияния и после ветвления), а B0 - нет. Таким образом, вы должны управлять изменениями, начиная с H0, слияния, H1, H2, B0 как минимум.
Можно использовать rebase, но иначе, чем в других упомянутых ответах:
rebase -i HEAD~2
Это покажет вам варианты выбора (как упоминалось в других ответах):
pick B1
pick B0
pick H0
Поместите сквош вместо пика в H0:
pick B1
pick B0
s H0
После сохранения и выхода rebase будет применять коммиты по очереди после H1. Это означает, что он попросит вас снова разрешить конфликты (где HEAD будет сначала H1, а затем будет накапливать коммиты по мере их применения).
После завершения ребазирования вы можете выбрать сообщение для сдавленных H0 и B0:
* commit squashed H0 and B0
|
* commit B1
|
* commit H1
|
* commit H2
|
P.S. Если вы просто выполните сброс в BO:
(например, используя reset --mixed
, что более подробно объясняется здесь https://stackoverflow.com/a/18690845/2405850):
git reset --mixed hash_of_commit_B0
git add .
git commit -m 'some commit message'
затем вы давите на B0 изменений H0, H1, H2 (потеря полностью фиксирует изменения после ветвления и до слияния.