Оновлення
Я зробив псевдонім 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"
Caveat : не забудьте подати коментар, інакше буде використане повідомлення про фіксацію за замовчуванням "Новий початок".
Або ви можете створити псевдонім за допомогою наступної команди:
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
, а саме кінчик вашої поточної гілки. див. Дерево-Об'єкти та Об'єкти .
скинути поточну гілку до нового коміту
Потім 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
або іншим способом) і згортає історію репо-шаблону у ваш початковий запис.