- Facebook’un geliştirdiği
hg absorb aracı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
fixes gibi belirsiz bir commit’e koymak istemiyorsunuz
git commit --fixup için commit SHA’sını elle bulmak veya manuel interactive rebase çalıştırmak yerine şunu yapın:
git add $FILES_YOU_FIXED
git 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-rebase bayrağı kullanıldığında bu fixup commit’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 kullanarak fixup değ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 add ile ekleyin
git absorb çalıştırın
- Sonuçtan memnunsanız
git rebase -i --autosquash çalıştırın
- Memnun kalmazsanız
git reset --soft ile ö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
fixup commit’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
.gitconfig içinde maxStack değeri ayarlanabilir
Düzeltilebilir commit başına tek fixup
- Varsayılan olarak emilebilen her hunk için ayrı bir
fixup commit’i oluşturulur
-F bayrağı kullanılarak aynı commit’e emilen tüm hunk’lar için yalnızca tek bir fixup commit’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
autoStageIfNothingStaged ayarı kullanılabilir
fixup hedefi her zaman SHA olsun
- Varsayılan olarak
fixup commit 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’un hg absorb aracı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ı olarak fixup commit’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...