Güncelleme
Bir takma ad yaptım git squash-all
.
Örnek kullanım : git squash-all "a brand new start"
.
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
Uyarı : bir yorum sağlamayı unutmayın, aksi takdirde varsayılan yeni ileti "Yeni bir başlangıç" kullanılır.
Veya aşağıdaki komutu kullanarak diğer adı oluşturabilirsiniz:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
Bir Astar
git reset $(git commit-tree HEAD^{tree} -m "A new start")
Not : burada "A new start
" sadece bir örnektir, kendi dilinizi kullanmaktan çekinmeyin.
TL; DR
Ezmeye gerek yok, kullanın git commit-tree
yetim bir taahhüt oluşturmak için ve onunla devam edin.
Açıklamak
üzerinden tek bir taahhüt oluştur git commit-tree
Ne git commit-tree HEAD^{tree} -m "A new start"
yapar:
Sağlanan ağaç nesnesini temel alan yeni bir tamamlama nesnesi oluşturur ve stdout'ta yeni tamamlama nesnesi kimliğini yayar. -M veya -F seçenekleri belirtilmedikçe, günlük mesajı standart girişten okunur.
İfade , geçerli dalınızın ucuna HEAD^{tree}
karşılık gelen ağaç nesnesi anlamına gelir HEAD
. bkz. Ağaç Nesneleri ve Tamamlama Nesneleri .
geçerli dalı yeni işleme sıfırla
Ardından git reset
, geçerli dalı yeni oluşturulan tamamlama nesnesine sıfırlayın.
Bu şekilde, çalışma alanındaki hiçbir şeye dokunulmaz ve rebase / squash'a ihtiyaç yoktur, bu da onu gerçekten hızlı hale getirir. Ve gereken zaman, havuz büyüklüğü veya geçmiş derinliği ile ilgisizdir.
Varyasyon: Proje Şablonundan Yeni Repo
Bu, şablon / arketip / tohum / iskelet olarak başka bir depo kullanarak yeni bir projede "başlangıç taahhüdü" oluşturmak için kullanışlıdır. Örneğin:
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")
Bu, şablon deposunu uzak ( origin
veya başka bir şekilde) eklemekten kaçınır ve şablon deposunun geçmişini ilk taahhüdünüze daraltır.