Я думаю, что вы можете сделать это, проверяя указанный c коммит, создавая потерянную ветвь на этом коммите, а затем перебираясь на ветку.
- Извлекайте коммит перед вашим первым коммитом
git checkout <commit hash before your first commit>
- Создание сиротской ветви. Индекс будет содержать файлы в этом состоянии, но история коммитов не будет.
git checkout --orphan foo
- Фиксация сдавленных изменений
git commit -m 'Squashed!'
- Извлечь основную ветку
git checkout <original branch name>
- Перебазирование в новую сжатую ветвь.
git rebase foo
Я проверил это с хранилищем с 5 коммитами на master
:
* 40f82e6 - 5
* 78deb2c - 4
* aff34f8 - 3
* 15cd469 - 2
* 6e420cb - 1
Давайте сква sh первые три (вывод сокращен):
$ git checkout aff34f8
Note: checking out 'aff34f8'.
HEAD is now at aff34f8 3
$ git checkout --orphan foo
Switched to a new branch 'foo'
$ git commit -m 'Squashed!'
[foo (root-commit) 933b62d] Squashed!
$ git checkout master
Switched to branch 'master'
$ git rebase foo
First, rewinding head to replay your work on top of it...
Applying: 1
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
No changes -- Patch already applied.
Applying: 2
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
No changes -- Patch already applied.
Applying: 3
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
No changes -- Patch already applied.
Applying: 4
Applying: 5
После этого изменения мастер теперь выглядит так:
* 5d908c9 - 5
* 477ee53 - 4
* 933b62d - Squashed!