Memperbarui
Saya sudah membuat alias git squash-all
.
Contoh penggunaan : git squash-all "a brand new start"
.
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
Peringatan : ingatlah untuk memberikan komentar, jika tidak, pesan komit default "Awal baru" akan digunakan.
Atau Anda dapat membuat alias dengan perintah berikut:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
Satu Liner
git reset $(git commit-tree HEAD^{tree} -m "A new start")
Catatan : " A new start
" di sini hanyalah contoh, jangan ragu untuk menggunakan bahasa Anda sendiri.
TL; DR
Tidak perlu squash, gunakan git commit-tree
untuk membuat komitmen anak yatim dan pergi bersamanya.
Menjelaskan
buat komit tunggal via git commit-tree
Apa yang git commit-tree HEAD^{tree} -m "A new start"
dilakukan adalah:
Membuat objek komit baru berdasarkan objek pohon yang disediakan dan memancarkan id objek komit baru di stdout. Pesan log dibaca dari input standar, kecuali opsi -m atau -F diberikan.
Ekspresi HEAD^{tree}
berarti objek pohon yang terkait HEAD
, yaitu ujung cabang Anda saat ini. lihat Tree-Objects dan Commit-Objects .
atur ulang cabang saat ini ke komit baru
Kemudian git reset
cukup reset cabang saat ini ke objek komit yang baru dibuat.
Dengan cara ini, tidak ada di ruang kerja yang disentuh, juga tidak perlu rebase / squash, yang membuatnya sangat cepat. Dan waktu yang dibutuhkan tidak relevan dengan ukuran repositori atau kedalaman riwayat.
Variasi: Repo Baru dari Template Proyek
Ini berguna untuk membuat "commit awal" dalam proyek baru menggunakan repositori lain sebagai templat / pola dasar / seed / kerangka. Sebagai contoh:
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")
Ini menghindari menambahkan repo templat sebagai remote ( origin
atau sebaliknya) dan menciutkan riwayat repo templat ke komit awal Anda.