Aktualizacja
Zrobiłem alias git squash-all
.
Przykładowe zastosowania : git squash-all "a brand new start"
.
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
Zastrzeżenie : pamiętaj, aby podać komentarz, w przeciwnym razie użyty zostanie domyślny komunikat zatwierdzenia „Nowy początek”.
Lub możesz utworzyć alias za pomocą następującego polecenia:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
Jedna wkładka
git reset $(git commit-tree HEAD^{tree} -m "A new start")
Uwaga : tutaj „ A new start
” to tylko przykład, możesz swobodnie używać własnego języka.
TL; DR
Nie musisz zgniatać, użyj, git commit-tree
aby stworzyć sierocą zmianę i idź z nią.
Wyjaśnić
utwórz pojedynczy zatwierdzenie przez git commit-tree
Co git commit-tree HEAD^{tree} -m "A new start"
to jest:
Tworzy nowy obiekt zatwierdzenia na podstawie podanego obiektu drzewa i emituje nowy identyfikator obiektu zatwierdzenia na standardowym wyjściu. Komunikat dziennika jest odczytywany ze standardowego wejścia, chyba że podano opcje -m lub -F.
Wyrażenie HEAD^{tree}
oznacza obiekt drzewa odpowiadający HEAD
, a mianowicie czubek bieżącej gałęzi. zobacz drzewa obiektów i popełnić-obiektów .
zresetuj bieżącą gałąź do nowego zatwierdzenia
Następnie git reset
po prostu zresetuj bieżącą gałąź do nowo utworzonego obiektu zatwierdzenia.
W ten sposób nic nie jest dotykane w obszarze roboczym, ani nie ma potrzeby korzystania z bazy / squash, co czyni go naprawdę szybkim. Potrzebny czas nie ma znaczenia dla wielkości repozytorium ani głębokości historii.
Odmiana: nowe repozytorium z szablonu projektu
Jest to przydatne do utworzenia „początkowego zatwierdzenia” w nowym projekcie przy użyciu innego repozytorium jako szablonu / archetype / seed / skeleton. Na przykład:
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")
Pozwala to uniknąć dodawania repozytorium szablonu jako zdalnego ( origin
lub w inny sposób) i zwija historię repozytorium szablonu do początkowego zatwierdzenia.