16 poin oleh GN⁺ 2024-09-27 | 2 komentar | Bagikan ke WhatsApp
  • Versi porting untuk git dari hg absorb yang dibuat oleh Facebook
    • hg absorb bisa dibilang sebagai salah satu peningkatan workflow paling keren dalam sistem kontrol versi dalam beberapa tahun terakhir
    • Saat ada perubahan yang belum di-commit di atas draft changeset pada working directory, menjalankan hg absorb akan otomatis menyerap perbaikan yang belum di-commit ke draft ancestor changeset yang sesuai
    • Bisa melakukan pekerjaan hg histedit + "roll" tanpa membuat commit atau menyusun aturan modifikasi riwayat secara manual
    • Perintah ini melihat baris yang diubah, mencari changeset yang mengubah baris tersebut, lalu memodifikasi changeset itu agar mencakup perubahan yang belum di-commit
    • Jika perubahan tidak bisa dibuat tanpa konflik, maka akan tetap dibiarkan dalam keadaan belum di-commit
    • Workflow ini sangat berguna untuk pekerjaan seperti menerapkan feedback review. Buat perubahan pada file lalu jalankan hg absorb, maka pemetaan antara perubahan dan commit akan dirapikan secara otomatis. Fitur yang terasa seperti sihir

Skenario penggunaan git absorb

  • Ada feature branch dengan beberapa commit
  • Rekan tim meninjau branch tersebut dan menunjukkan beberapa bug
  • Ada perbaikan bug, tetapi karena percaya pada atomic commit, Anda tidak ingin memasukkan semuanya ke dalam satu commit fixes yang tidak transparan
  • Daripada mencari SHA commit secara manual untuk git commit --fixup atau menjalankan interactive rebase secara manual, lakukan ini:
    1. git add $FILES_YOU_FIXED
    2. git absorb --and-rebase
  • git absorb secara otomatis mengidentifikasi commit mana yang aman untuk diperbaiki, dan staged changes mana yang termasuk ke masing-masing commit
  • Lalu membuat commit fixup! untuk perubahan tersebut
  • Dengan flag --and-rebase, commit fixup ini otomatis digabungkan ke commit terkait
  • Jika Anda belum yakin, Anda bisa memeriksa output secara manual lalu menggabungkan fixup ke feature branch menggunakan fitur autosquash bawaan git

Instalasi

  • Bisa diinstal dengan mengunduh artifact dari rilis tag terbaru
  • Tersedia artifact untuk Windows, MacOS, dan Linux

Cara penggunaan

  1. Tambahkan perubahan yang ingin diserap dengan git add
  2. Jalankan git absorb
  3. Jika puas dengan hasilnya, jalankan git rebase -i --autosquash
  4. Jika tidak puas, pulihkan ke keadaan sebelumnya dengan git reset --soft

How it works (roughly)

  • git absorb memeriksa apakah dua patch P1 dan P2 dapat dipertukarkan
  • Secara default mempertimbangkan 10 commit terakhir
  • Untuk setiap hunk pada index, diperiksa apakah hunk tersebut dapat dipertukarkan dengan commit terakhir
  • Jika menemukan commit yang tidak dapat dipertukarkan, hunk itu diubah menjadi commit fixup

Konfigurasi

Ukuran stack

  • Secara default mempertimbangkan 10 commit terakhir
  • Untuk mempertimbangkan lebih banyak commit, atur nilai maxStack di .gitconfig

Satu fixup per commit yang bisa diperbaiki

  • Secara default membuat commit fixup terpisah untuk setiap hunk yang bisa diserap
  • Dengan flag -F, Anda bisa membuat hanya satu commit fixup untuk semua hunk yang diserap ke commit yang sama

Auto-stage semua perubahan jika tidak ada yang di-stage

  • Secara default hanya mempertimbangkan file yang sudah di-stage
  • Jika ingin semua perubahan otomatis di-stage saat tidak ada perubahan yang di-stage, atur autoStageIfNothingStaged

Target fixup selalu SHA

  • Secara default, pesan commit fixup merujuk ke ringkasan commit target
  • Bisa diatur agar selalu merujuk ke SHA target

TODO

  • Implementasi flag force
  • Implementasi pemeriksaan remote default branch
  • Menambahkan flag force kecil untuk menonaktifkan pemeriksaan keamanan tertentu secara individual
  • Memastikan semua output error berguna bagi pengguna
  • Menampilkan lebih banyak log saat berhasil
  • Menambahkan lebih banyak pengujian
  • Mendokumentasikan detail stack dan pertukaran
  • Menambahkan lebih banyak kasus pertukaran
  • Mengimplementasikan agar tidak memuat semua hunk ke memori sekaligus
  • Mengimplementasikan penguncian index untuk melindungi dari modifikasi bersamaan

Ringkasan GN⁺

  • git absorb adalah alat yang di-port dari hg absorb milik Facebook, yang memperbaiki workflow pengembangan dengan memodifikasi commit secara otomatis
  • Sangat berguna saat menerapkan feedback review, karena dapat menanganinya secara otomatis tanpa perlu mencari atau mengubah commit secara manual
  • Alat lain yang menyediakan fungsi serupa adalah git-autofixup. Ini adalah alat yang otomatis membuat commit fixup berdasarkan pesan commit
  • Kelebihannya adalah lebih mudah menerapkan feedback code review dan riwayat commit menjadi lebih rapi. Kekurangannya, jika terlalu bergantung pada otomatisasi, bisa muncul hasil yang tidak terduga

2 komentar

 
GN⁺ 2024-09-27
Komentar Hacker News
  • Orang yang menggunakan git absorb menganggap alat ini sangat berguna

    • Saat PR berisi beberapa commit dan gagal di CI, git absorb secara otomatis menemukan commit yang tepat
    • Mengurangi kerepotan mencari commit secara manual
    • Hampir tidak pernah ada false positive, dan jika false negative terjadi, bisa ditangani secara manual
    • Ada pendapat bahwa PR seharusnya hanya terdiri dari satu commit, tetapi tidak selalu begitu
    • Lebih menyukai commit yang kecil secara logis di GitHub
  • Puas menggunakan alias untuk git commit --fixup

    • Menampilkan commit di branch saat ini dan bisa memilihnya lewat fzf
    • Membuat commit fixup berdasarkan commit yang dipilih
  • Sudah mencoba git absorb, tetapi sering salah memilih commit induk

    • Mencari commit secara manual terasa lebih baik
    • Lebih suka memiliki kendali penuh atas riwayat commit
    • Alat ini terasa seperti terlalu banyak sihir
  • Belum pernah menggunakan git --fixup dan git rebase --autosquash, tetapi tampaknya berguna

    • git-absorb terasa seperti melangkah satu tingkat lebih jauh
    • README tidak cukup jelas tentang apa tepatnya yang akan dilakukan dalam situasi tertentu
  • Skeptis terhadap mengubah commit dan riwayat

    • Lebih baik memperbaiki kesalahan, membuat commit baru, lalu lanjut bekerja
  • Dengan magit, commit fixup bisa dibuat dengan mudah

    • Bahkan jika tidak memakai Emacs, tetap layak dipertahankan hanya demi menggunakan magit
    • Untuk pengguna vscode, Edamagit bagus
  • Jadi tahu tentang git commit --fixup dan git rebase --autosquash

    • Interactive git rebase adalah alat Git favorit
    • Membantu membuat commit atomik logis yang sempurna
    • Namun, pengeditan riwayat seperti ini kadang bisa menjadi bumerang
  • git rebase -i memenuhi berbagai kebutuhan

    • Bisa melakukan squash, fixup, reword, dan delete commit secara interaktif
    • Semua orang yang menggunakan git seharusnya mempelajarinya
  • Tidak paham dengan obsesi terhadap riwayat commit yang sangat bersih

    • Meragukan apakah riwayat commit benar-benar diperiksa sedetail itu sesering itu
  • Tidak paham memilih commit yang bisa diperbaiki tanpa konflik dari 10 commit terakhir

    • Sering menyelesaikan konflik sambil cukup sering memakai fixup^
    • Tidak percaya pada pemilihan commit target secara otomatis
 
roxie 2025-05-18
  • Saya tidak paham obsesi terhadap riwayat commit yang superbersih
    • Saya ragu riwayat commit diperiksa sedetail itu sesering itu

Komentar ini cukup menohok saya. Saya sempat sedikit mencoba fixup / autosquash, tapi jadi agak merasa hampa karena berpikir, jangan-jangan cuma saya sendiri yang peduli soal ini...