Обновление
Я сделал псевдоним 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"
:
Создает новый объект фиксации на основе предоставленного объекта дерева
и отправляет новый идентификатор объекта фиксации на стандартный вывод. Сообщение журнала
читать со стандартного ввода, если не указаны опции -m или -F.
Выражение HEAD^{tree}
означает объект дерева, соответствующий HEAD
, а именно кончик вашей текущей ветви. см. Tree-Objects и Commit-Objects .
сбросить текущую ветку на новый коммит
Тогда git reset
просто сбрасывает текущую ветку на вновь созданную
совершить объект.
Таким образом, ничего в рабочей области не затрагивается, и нет
нужно перебазировать / сквош, что делает его очень быстрым. И необходимое время не зависит от размера хранилища или глубины истории.
Вариант: новый репо из шаблона проекта
Это полезно для создания «начального коммита» в новом проекте с использованием другого репозитория в качестве шаблона / archetype / seed / skeleton. Например:
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
или иным образом) и сворачивает историю репо в ваш первоначальный коммит.