Обновить
Я сделал псевдоним git squash-all
.
Пример использования : git squash-all "a brand new start"
.
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
Предостережение : не забудьте предоставить комментарий, в противном случае будет использоваться сообщение о фиксации по умолчанию «Новое начало».
Или вы можете создать псевдоним с помощью следующей команды:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
Один лайнер
git reset $(git commit-tree HEAD^{tree} -m "A new start")
Примечание : здесь " A new start
" это просто пример, не стесняйтесь использовать свой собственный язык.
TL; DR
Не нужно раздавливать, использовать git commit-tree
для создания коммитов сирот и идти с ним.
объяснять
создать один коммит через git commit-tree
Что git commit-tree HEAD^{tree} -m "A new start"
это такое:
Создает новый объект фиксации на основе предоставленного объекта дерева и генерирует новый идентификатор объекта фиксации в stdout. Сообщение журнала читается из стандартного ввода, если не указаны опции -m или -F.
Выражение HEAD^{tree}
означает соответствующий объект дерева HEAD
, а именно кончик вашей текущей ветви. см. Tree-Objects и Commit-Objects .
сбросить текущую ветку на новый коммит
Затем git reset
просто сбросьте текущую ветку на вновь созданный объект коммита.
Таким образом, ничего в рабочей области не затрагивается, и нет необходимости в ребазе / сквоше, что делает его действительно быстрым. И необходимое время не зависит от размера хранилища или глубины истории.
Вариация: новый репо из шаблона проекта
Это полезно для создания «начального коммита» в новом проекте с использованием другого хранилища в качестве шаблона / архетипа / семени / скелета. Например:
cd my-new-project
git init
git fetch --depth=1 -n https://github.com/toolbear/panda.git
git reset --hard $(git commit-tree FETCH_HEAD^{tree} -m "initial commit")
Это позволяет избежать добавления репо-шаблона в качестве удаленного ( origin
или иного) и сворачивает историю репо-шаблона в исходную фиксацию.