- 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:
git add $FILES_YOU_FIXED
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
- Tambahkan perubahan yang ingin diserap dengan
git add
- Jalankan
git absorb
- Jika puas dengan hasilnya, jalankan
git rebase -i --autosquash
- 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
Komentar Hacker News
Orang yang menggunakan
git absorbmenganggap alat ini sangat bergunagit absorbsecara otomatis menemukan commit yang tepatPuas menggunakan alias untuk
git commit --fixupSudah mencoba
git absorb, tetapi sering salah memilih commit indukBelum pernah menggunakan
git --fixupdangit rebase --autosquash, tetapi tampaknya bergunagit-absorbterasa seperti melangkah satu tingkat lebih jauhSkeptis terhadap mengubah commit dan riwayat
Dengan
magit, commit fixup bisa dibuat dengan mudahJadi tahu tentang
git commit --fixupdangit rebase --autosquashgit rebase -imemenuhi berbagai kebutuhanTidak paham dengan obsesi terhadap riwayat commit yang sangat bersih
Tidak paham memilih commit yang bisa diperbaiki tanpa konflik dari 10 commit terakhir
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...