Rebase memindahkan rangkaian commit ke basis baru dengan memutarnya ulang satu per satu, dan hasilnya adalah riwayat yang tampak seolah-olah pekerjaan dimulai dari titik yang lebih baru. Topik ini membahas mekanika pemutaran ulang itu, dampak wajibnya berupa pergantian hash, dan bentuk riwayat linear yang dihasilkannya. Mekanika ini menjadi dasar bagi kebijakan aturan emas pada topik berikutnya.
Apa yang dilakukan rebase#
Perintah git rebase main yang dijalankan pada branch pekerjaan melakukan tiga hal berurutan. Pertama, Git menemukan leluhur bersama antara branch pekerjaan dan main, lalu menyimpan seluruh commit milik branch pekerjaan sejak titik itu. Kedua, penunjuk branch pekerjaan dipindahkan ke ujung main. Ketiga, commit yang disimpan diputar ulang satu per satu di atas basis baru, dan setiap putaran menghasilkan commit baru dengan hash baru.
Kata memutar ulang dipilih secara harfiah: isi perubahan setiap commit diterapkan kembali pada keadaan basis baru, sehingga hasilnya menyatukan isi terbaru dari main dengan pekerjaan branch, tanpa commit merge. Commit asli tidak disunting sama sekali, melainkan digantikan pasangan barunya, dan inilah sumber seluruh konsekuensi keamanan rebase.
Merekam hash sebelum dan sesudah#
Dampak pergantian hash dapat dilihat langsung. Siapkan dua jalur yang menyimpang, lalu catat hash sebelum rebase.
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"rm -rf /tmp/lab-rebase
mkdir /tmp/lab-rebase
cd /tmp/lab-rebase
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Dasar dokumen.\n" > dokumen.md
git add dokumen.md
git commit -m "Dasar dokumen"
git switch -c fitur-ringkasan
printf "Dasar dokumen.\nRingkasan awal.\n" > dokumen.md
git commit -am "Ringkasan awal"
printf "Dasar dokumen.\nRingkasan awal.\nRingkasan akhir.\n" > dokumen.md
git commit -am "Ringkasan akhir"
git switch main
printf "Dasar dokumen.\nPanduan gaya.\n" > gaya.md
git add gaya.md
git commit -m "Panduan gaya"
git log --oneline fitur-ringkasanInitialized empty Git repository in /tmp/lab-rebase/.git/
[main (root-commit) d6ebebb] Dasar dokumen
1 file changed, 1 insertion(+)
create mode 100644 dokumen.md
Switched to a new branch 'fitur-ringkasan'
[fitur-ringkasan d99233b] Ringkasan awal
1 file changed, 1 insertion(+)
[fitur-ringkasan 5877983] Ringkasan akhir
1 file changed, 1 insertion(+)
Switched to branch 'main'
[main 70f6bdf] Panduan gaya
1 file changed, 2 insertions(+)
create mode 100644 gaya.md
5877983 Ringkasan akhir
d99233b Ringkasan awal
d6ebebb Dasar dokumenDua commit fitur bertumpuk di atas commit dasar, sedangkan main sudah bergerak dengan commit sendiri. Jalankan rebase dari sisi fitur.
git switch fitur-ringkasan
git rebase main
git log --oneline --graph -4Switched to branch 'fitur-ringkasan'
Rebasing (1/2)
Rebasing (2/2)
Successfully rebased and updated refs/heads/fitur-ringkasan.
* 1c8739f Ringkasan akhir
* 1315e84 Ringkasan awal
* 70f6bdf Panduan gaya
* d6ebebb Dasar dokumenPesan Successfully rebased menyatakan pemutaran ulang tuntas, dan grafis riwayat kini lurus: kedua commit fitur berada di atas Panduan gaya, dengan hash yang sama sekali berbeda dari sebelumnya. Pesan commit, penulis, dan waktunya dipertahankan, sedangkan hash berganti karena induk dan isi pohonnya berubah.
Linear bukan berarti lebih benar#
Riwayat linear yang dihasilkan rebase lebih mudah dibaca, dan banyak tim memilihnya karena alasan itu. Tetapi bentuk linear ini diperoleh dengan mengganti commit lama, sehingga kejujuran riwayat bergeser: riwayat tidak lagi mencatat bahwa pekerjaan pernah dimulai dari basis yang lebih tua. Pada commit milik pribadi yang belum dibagikan, harga ini nyaris nol, dan itulah wilayah utama rebase. Pada commit yang sudah dibagikan, harga ini dihitung oleh setiap orang yang menarik riwayatnya, dan itulah pokok aturan emas pada topik Aturan emas rebase.
Perbandingan yang seimbang antara rebase dan merge bukan soal benar-salah, melainkan soal apa yang ingin disimpan riwayat: merge menyimpan peristiwa penyatuan dua jalur, sedangkan rebase menyimpan urutan kerja yang lurus. Keduanya sah, dan konsistensi kebijakan tim lebih berharga daripada pilihannya.
Pemutaran ulang yang bertemu konflik#
Commit yang diputar ulang dapat bertabrakan dengan perubahan basis barunya, dan rebase berhenti di tengah jalan dengan pesan konflik yang serupa merge. Keadaan berhentinya dinyatakan pada git status, dan penyelesaiannya memakai tiga langkah yang sudah dikenal: menyunting berkas konflik, menandai keputusannya dengan git add, lalu melanjutkan dengan git rebase --continue. Apabila pemutaran ulang ternyata keliru sejak awal, git rebase --abort mengembalikan branch ke keadaan persis sebelum rebase dimulai, karena commit asli tidak pernah disentuh.
Satu perbedaan penting dari konflik merge ada pada pengulangannya. Konflik merge selesai satu kali, sedangkan konflik rebase dapat berulang pada setiap commit yang memuat perubahan yang sama. Untuk perbaikan yang memang perlu di-rebase berulang, Git menyediakan git config rerere.enabled true yang merekam cara penyelesaian sebelumnya dan menerapkannya otomatis pada konflik yang serupa, sehingga pengulangan yang menyebalkan menjadi hampir tak terlihat.
Memilih basis yang tepat#
Basis rebase tidak harus ujung main. Menyebut commit mana pun sebagai argumen menjadikannya basis, dan pemilihan ini menentukan seberapa banyak riwayat yang diputar. Bentuk yang paling umum adalah git rebase main pada branch pekerjaan, sehingga seluruh commit fitur berpindah ke ujung main terkini.
Bentuk lanjutan --onto memisahkan dua keputusan yang biasanya menyatu, yaitu commit mana yang diputar dan ke mana ia diletakkan. Bentuk ini berguna untuk memindahkan sebagian commit antar cabang, misalnya hanya dua commit terakhir yang seharusnya berada di branch lain, dan sisanya ditinggalkan pada tempatnya. Karena jangkauannya melewati intuisi bacaan biasa, bentuk ini layak dijalankan setelah riwayat diperiksa dengan git log --oneline --graph --all agar batas commit yang diputar terlihat jelas sebelum dijalankan.
Ringkasan#
- Rebase menemukan leluhur bersama, memindahkan branch ke basis baru, lalu memutar ulang commit satu per satu.
- Setiap commit hasil rebase adalah commit baru dengan hash baru, meskipun pesan, penulis, dan waktunya dipertahankan.
- Hasilnya riwayat linear tanpa commit merge, dan commit asli digantikan, bukan disunting.
- Wilayah aman rebase adalah commit yang belum dibagikan, dan kebijakan tim menentukan pilihan rebase atau merge.
Referensi#
- Git Branching - Rebasing — Pro Git — bab Pro Git tentang mekanika rebase.
- git-rebase — Git Documentation — rujukan perintah rebase dan pilihan basisnya.