git absorb - otomatikleştirilmiş `git commit --fixup`
(github.com/tummychow)- Facebook’un geliştirdiği
hg absorbaracının Git’e port edilmiş sürümühg absorb, son birkaç yılda sürüm kontrol sistemlerinde görülen en havalı iş akışı iyileştirmelerinden biri sayılabilir- Çalışma dizininde commit edilmemiş değişiklikler draft changeset’lerin üstündeyken
hg absorbçalıştırılırsa, commit edilmemiş düzeltmeler uygun draft ancestor changeset’e otomatik olarak emilir - Commit oluşturmadan veya geçmişi elle düzenleme kuralları yazmadan
hg histedit+ "roll" işlemi yapılabilir - Komut, değiştirilen satırlara bakar, o satırları değiştiren changeset’i bulur ve ilgili changeset’i commit edilmemiş değişiklikleri içerecek şekilde düzenler
- Çakışma olmadan değişiklik üretilemiyorsa bunlar commit edilmemiş durumda kalır
- Bu iş akışı, örneğin review geri bildirimlerini uygulamak gibi işler için çok kullanışlıdır. Dosya değişikliklerini yapıp
hg absorbçalıştırdığınızda, değişikliklerle commit’ler arasındaki eşleme otomatik olarak düzenlenir. Adeta sihirli bir özelliktir
git absorb kullanım senaryosu
- Birkaç commit içeren bir feature branch’iniz var
- Ekip arkadaşınız branch’i review ediyor ve birkaç bug’a işaret ediyor
- Elinizde bug düzeltmeleri var, ancak atomik commit’lere inandığınız için bunların hepsini
fixesgibi belirsiz bir commit’e koymak istemiyorsunuz git commit --fixupiçin commit SHA’sını elle bulmak veya manuel interactive rebase çalıştırmak yerine şunu yapın:git add $FILES_YOU_FIXEDgit absorb --and-rebase
git absorb, hangi commit’lerin güvenli şekilde düzeltilebileceğini ve hangi staged değişikliklerin hangi commit’e ait olduğunu otomatik olarak belirler- Ardından bu değişiklikler için
fixup!commit’leri oluşturur --and-rebasebayrağı kullanıldığında bufixupcommit’leri ilgili commit’lere otomatik olarak entegre edilir- Buna güvenmiyorsanız çıktıyı önce elle kontrol edebilir, ardından Git’in yerleşik
autosquashözelliğini kullanarakfixupdeğişikliklerini feature branch’e entegre edebilirsiniz
Kurulum
- En güncel tag release’den artifact indirip kurabilirsiniz
- Windows, macOS ve Linux için artifact sağlanır
Kullanım
- Emilmesini istediğiniz değişiklikleri
git addile ekleyin git absorbçalıştırın- Sonuçtan memnunsanız
git rebase -i --autosquashçalıştırın - Memnun kalmazsanız
git reset --softile önceki duruma dönün
Nasıl çalışır (kabaca)
git absorb, iki patch’in P1 ve P2 değiştirilebilir olup olmadığını kontrol eder- Varsayılan olarak son 10 commit’i dikkate alır
- İndeksteki her hunk için, o hunk’ın son commit’le değiştirilebilir olup olmadığını denetler
- Değiştirilemeyen bir commit bulduğunda, ilgili hunk’ı bir
fixupcommit’ine dönüştürür
Yapılandırma
Stack boyutu
- Varsayılan olarak son 10 commit dikkate alınır
- Daha fazla commit’i hesaba katmak için
.gitconfigiçindemaxStackdeğeri ayarlanabilir
Düzeltilebilir commit başına tek fixup
- Varsayılan olarak emilebilen her hunk için ayrı bir
fixupcommit’i oluşturulur -Fbayrağı kullanılarak aynı commit’e emilen tüm hunk’lar için yalnızca tek birfixupcommit’i oluşturulabilir
Hiçbir şey staged değilse tüm değişiklikleri otomatik stage et
- Varsayılan olarak yalnızca staged dosyalar dikkate alınır
- Staged değişiklik yokken tüm değişiklikleri otomatik stage etmek için
autoStageIfNothingStagedayarı kullanılabilir
fixup hedefi her zaman SHA olsun
- Varsayılan olarak
fixupcommit mesajı hedef commit’in özetine işaret eder - Bunun yerine her zaman hedefin SHA’sını gösterecek şekilde ayarlanabilir
TODO
- Zorlama bayrağının uygulanması
- Uzak varsayılan branch kontrolünün eklenmesi
- Tek tek güvenlik kontrollerini devre dışı bırakmak için küçük bir zorlama bayrağı eklenmesi
- Tüm hata çıktılarının kullanıcı için faydalı olmasının sağlanması
- Başarı durumunda daha fazla log çıktısı verilmesi
- Daha fazla test eklenmesi
- Stack ve değiştirilebilirlik ayrıntılarının belgelenmesi
- Daha fazla değiştirilebilirlik vakasının eklenmesi
- Tüm hunk’ların aynı anda belleğe yüklenmemesinin sağlanması
- Eşzamanlı düzenlemelere karşı koruma için index kilidinin uygulanması
GN⁺ özeti
git absorb, Facebook’unhg absorbaracından port edilen bir araçtır ve commit’leri otomatik düzelterek geliştirme iş akışını iyileştirir- Review geri bildirimlerini uygularken çok faydalıdır; commit’leri elle bulmaya veya düzenlemeye gerek kalmadan süreci otomatikleştirir
- Benzer işlev sunan diğer araçlardan biri
git-autofixup’tır. Commit mesajı tabanlı olarakfixupcommit’lerini otomatik oluşturan bir araçtır - Avantajı, code review geri bildirimlerini uygulamayı kolaylaştırması ve commit geçmişini daha temiz hale getirmesidir. Dezavantajı ise otomasyona fazla güvenildiğinde beklenmedik sonuçlar doğurabilmesidir
2 yorum
Hacker News yorumu
git absorbkullananlar bu aracın çok faydalı olduğunu düşünüyorgit absorbdoğru commit'i otomatik olarak buluyorgit commit --fixupiçin bir alias kullanmaktan memnun olanlar vargit absorbu denemiş ama çoğu zaman yanlış parent commit'i seçtiğini söyleyenler vargit --fixupvegit rebase --autosquashkullanmamış ama faydalı göründüğünü söyleyenler vargit-absorbbunun bir adım ötesine geçiyor gibi görünüyorCommit'leri ve geçmişi değiştirme konusunda şüpheci olanlar var
magitile kolayca fixup commit'i oluşturulabildiği söyleniyorgit commit --fixupvegit rebase --autosquashı yeni öğrenenler vargit rebase -içeşitli ihtiyaçları karşılıyorAşırı temiz bir commit geçmişine takıntıyı anlayamayanlar var
Son 10 commit içinden çatışmasız şekilde düzeltilebilecek bir commit seçme fikrini anlamayanlar var
fixup^kullandıklarını söylüyorlarBu yorum biraz dokundu.
fixup/autosquashişini biraz denedim ama, bunu sadece ben mi dert ediyorum diye düşünüp hafif bir boşluğa düştüm...