Urutan commit adalah bagian dari cerita — dan cerita sering tersusun salah. Fitur pelengkap ter-commit lebih dulu daripada fondasinya; perbaikan kecil menyusul jauh di bawah commit yang seharusnya ia susuli; langkah-langkah demonstrasi berantakan karena dikerjakan sambil mencari-cari bentuk. Karena daftar todo interactive rebase dibaca dari atas ke bawah sebagai naskah riwayat baru, menukar dua baris di editor sama saja dengan menukar dua commit dalam sejarah — dan membuang satu baris sama saja dengan menghapus commit. Chapter ini menjalankan keduanya secara nyata, plus satu peringatan penting tentang kapan penataan urutan justru memancing konflik.
Repository dengan Tiga Langkah yang Saling Bebas #
Latihan ini sengaja memakai tiga commit yang masing-masing menyentuh berkas berbeda — tombol, galeri, catatan kaki — supaya urutannya bebas diputar tanpa tabrakan:
mkdir latihan-urutan && cd latihan-urutan
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Situs\n' > situs.md
git add situs.md
git commit -m "Buat kerangka situs"
printf 'tombol simpan\n' > tombol.md
git add tombol.md
git commit -m "Tambah tombol simpan"
printf 'galeri foto\n' > galeri.md
git add galeri.md
git commit -m "Tambah halaman galeri"
printf 'catatan kaki\n' > catatan.md
git add catatan.md
git commit -m "Tambah catatan kaki"
git log --onelineOutput yang Dihasilkan:
45d3554 Tambah catatan kaki
5032701 Tambah halaman galeri
7b4c94e Tambah tombol simpan
1b38180 Buat kerangka situsUrutan sekarang: tombol, lalu galeri, lalu catatan kaki. Misalkan narasi yang kita inginkan: galeri seharusnya hadir lebih dulu sebelum catatan kaki — keduanya perlu ditukar.
Menukar Dua Baris pada Todo #
Daftar todo dibuka seperti biasa:
git rebase -i HEAD~3Editor menampilkan tiga baris pick — persis mirror git log dalam urutan terbalik, dari tertua ke terbaru:
pick 7b4c94e Tambah tombol simpan
pick 5032701 Tambah halaman galeri
pick 45d3554 Tambah catatan kakiKarena baris dibaca dari atas ke bawah, menukar isi dua baris akan menukar posisi dua commit pada riwayat hasil. Tukar baris kedua dan ketiga hingga buffer menjadi:
pick 7b4c94e Tambah tombol simpan
pick 45d3554 Tambah catatan kaki
pick 5032701 Tambah halaman galeriSimpan dan tutup editor; rebase berjalan tanpa satu kata pun keluhan:
Output yang Dihasilkan:
Successfully rebased and updated refs/heads/main.Riwayat barunya membuktikan hasil penukaran:
git log --onelineOutput yang Dihasilkan:
11e3e60 Tambah halaman galeri
96954e8 Tambah catatan kaki
7b4c94e Tambah tombol simpan
1b38180 Buat kerangka situs“Tambah catatan kaki” kini berada di bawah “Tambah halaman galeri” — kebalikan dari posisi semula. Perhatikan pula detail hash: 7b4c94e (tombol, baris pertama todo) tidak berubah karena posisi dan parent-nya tak tersentuh, sedangkan kedua commit yang bertukar ditulis ulang dengan hash baru.
Pembaca yang ingin penukaran tanpa membuka editor bisa memakai satu baris sed sebagai GIT_SEQUENCE_EDITOR:
GIT_SEQUENCE_EDITOR="sed -i -e 2h -e 2d -e 3G" git rebase -i HEAD~3Ekspresinya terbaca: 2h menyalin baris kedua ke memori sed, 2d membuang baris aslinya, dan 3G menempelkan salinan itu setelah baris ketiga — baris kedua dan ketiga resmi bertukar tempat. Efeknya identik dengan penyuntingan manual di atas; ragam trik editor todo lainnya terdokumentasi pada halaman manual git-rebase
.
Kapan Menata Urutan Itu Berguna #
Penataan urutan paling terasa pada dua kebiasaan. Pertama, menyiapkan riwayat demonstrasi: saat sebuah repo latihan harus memperagakan fitur secara bertahap, urutan commit adalah alur cerita yang pembaca ikuti — menata ulang baris todo lebih murah daripada membangun ulang repo. Kedua, menempatkan prasyarat sebelum pemakainya: commit “siapkan konfigurasi” yang tertinggal di bawah commit “pakai konfigurasi” jauh lebih masuk akal setelah ditukar. git bisect pun ikut diuntungkan — riwayat yang urut logis membuat pencarian commit penyebab galat lebih efisien, karena setiap titik pemeriksaan menceritakan keadaan yang koheren.
Drop: Membuang Commit Seutuhnya #
Aksi drop (atau sekadar menghapus baris) membuang commit dari riwayat baru. Riwayat saat ini — tombol, catatan kaki, galeri — masih memuat tiga commit; baris ketiganya di todo kini “Tambah catatan kaki” karena hasil penukaran. Membuangnya cukup satu ekspresi sed yang menghapus baris ketiga:
GIT_SEQUENCE_EDITOR="sed -i 3d" git rebase -i HEAD~3Output yang Dihasilkan:
Successfully rebased and updated refs/heads/main.git log --onelineOutput yang Dihasilkan:
96954e8 Tambah catatan kaki
7b4c94e Tambah tombol simpan
1b38180 Buat kerangka situs“Tambah catatan kaki” lenyap dari riwayat — dan ini bukan sekadar disembunyikan dari tampilan. Commit itu benar-benar tidak dibuat ulang, sehingga seluruh perubahannya ikut hilang dari snapshot akhir:
git ls-filesOutput yang Dihasilkan:
catatan.md
situs.md
tombol.mdBerkas catatan.md tidak lagi terlacak — bukti bahwa drop menghapus isi commit, bukan cuma entri lognya. Data mentahnya masih tertinggal di database objek untuk sementara (materi chapter Anatomi Commit
), tetapi tidak ada jalur yang menjanganinya lagi.
Urutan sudah bisa ditata; commit bisa dibuang. Langkah natural berikutnya adalah yang paling sering dicari: menekuk riwayat rapat — tiga commit “wip” dan satu commit final dilipat menjadi satu commit utuh bernama final. Dua aksi pilihan untuk itu, squash dan fixup, menanti di chapter berikutnya: Menggabungkan Commit
.