16 puan yazan GN⁺ 2024-09-27 | 2 yorum | WhatsApp'ta paylaş
  • 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:
    1. git add $FILES_YOU_FIXED
    2. 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

  1. Emilmesini istediğiniz değişiklikleri git add ile ekleyin
  2. git absorb çalıştırın
  3. Sonuçtan memnunsanız git rebase -i --autosquash çalıştırın
  4. 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

 
GN⁺ 2024-09-27
Hacker News yorumu
  • git absorb kullananlar bu aracın çok faydalı olduğunu düşünüyor

    • CI'da birden fazla commit içeren bir PR başarısız olduğunda, git absorb doğru commit'i otomatik olarak buluyor
    • Commit'i elle bulma zahmetini azaltıyor
    • Neredeyse hiç false positive yok ve false negative olduğunda elle halledilebiliyor
    • PR'ın tek bir commit olması gerektiğini düşünenler var ama bu her zaman böyle değil
    • GitHub'da mantıksal olarak küçük commit'ler tercih ediliyor
  • git commit --fixup için bir alias kullanmaktan memnun olanlar var

    • Mevcut branch'teki commit'leri gösterip fzf ile seçmeye izin veriyor
    • Seçilen commit'e göre bir fixup commit'i oluşturuyor
  • git absorbu denemiş ama çoğu zaman yanlış parent commit'i seçtiğini söyleyenler var

    • Commit'i elle bulmak daha iyi gelmiş
    • Commit geçmişi üzerinde tam kontrolü tercih ediyorlar
    • Bu araç onlara fazla sihirli geliyor
  • git --fixup ve git rebase --autosquash kullanmamış ama faydalı göründüğünü söyleyenler var

    • git-absorb bunun bir adım ötesine geçiyor gibi görünüyor
    • README'de belirli durumlarda tam olarak ne yapacağının net olmadığı söyleniyor
  • Commit'leri ve geçmişi değiştirme konusunda şüpheci olanlar var

    • Hataları düzeltip yeni bir commit oluşturup devam etmenin daha iyi olduğunu düşünüyorlar
  • magit ile kolayca fixup commit'i oluşturulabildiği söyleniyor

    • Emacs kullanılmasa bile sadece magit için onu elde tutmaya değeceği belirtiliyor
    • VS Code kullanıcıları için Edamagit öneriliyor
  • git commit --fixup ve git rebase --autosquashı yeni öğrenenler var

    • İnteraktif git rebase'in en sevdikleri Git araçlarından biri olduğu söyleniyor
    • Mükemmel mantıksal atomik commit'ler oluşturmaya yardımcı oluyor
    • Ancak bu tür geçmiş düzenlemelerinin bazen ters tepebildiği de belirtiliyor
  • git rebase -i çeşitli ihtiyaçları karşılıyor

    • Commit'leri squash, fixup, reword ve delete işlemlerini interaktif şekilde yapmayı sağlıyor
    • Git kullanan herkesin bunu öğrenmesi gerektiği söyleniyor
  • Aşırı temiz bir commit geçmişine takıntıyı anlayamayanlar var

    • Commit geçmişinin gerçekten bu kadar sık ve ayrıntılı incelenip incelenmediğini sorguluyorlar
  • Son 10 commit içinden çatışmasız şekilde düzeltilebilecek bir commit seçme fikrini anlamayanlar var

    • Çoğu zaman çatışmaları çözerken sık sık fixup^ kullandıklarını söylüyorlar
    • Hedef commit'in otomatik seçilmesine güvenmiyorlar
 
roxie 2025-05-18
  • Aşırı derecede temiz bir commit geçmişine takıntılı olmayı anlamıyorum
    • Commit geçmişini gerçekten bu kadar sık ve ayrıntılı inceleyip incelemediklerini merak ediyorum

Bu yorum biraz dokundu. fixup / autosquash işini biraz denedim ama, bunu sadece ben mi dert ediyorum diye düşünüp hafif bir boşluğa düştüm...