Aturan emas rebase

Aturan emas rebase: jangan pernah menulis ulang riwayat yang sudah bersama atau terpublikasi.

Daftar isi

Aturan emas rebase berbunyi: jangan pernah me-rebase commit yang sudah dibagikan atau terpublikasi. Topik ini membahas alasan aturan itu dengan membuktikan kerusakannya langsung, batas wilayah yang aman, dan jalan keluar yang sehat ketika riwayat bersama ternyata memang perlu dibetulkan. Aturan ini bukan soal selera, melainkan soal apa yang terjadi pada repository orang lain.

Mengapa riwayat bersama tidak boleh diganti#

Commit yang sudah dikirim bisa saja sudah ditarik oleh orang lain, dan hash commit pada salinannya mengacu pada commit asli. Apabila commit itu diganti pasangannya melalui rebase, dua repository tidak lagi berbicara tentang commit yang sama: yang satu memuat commit lama, yang lain memuat pasangan baru, dan Git menganggap keduanya commit yang berbeda. Penyatuan berikutnya membawa kedua versi sekaligus, sehingga pekerjaan yang sama muncul dua kali pada riwayat.

Kerusakan ini tidak terasa pada repository pelaku, karena semua berjalan lancar di sana. Ia baru terasa pada orang lain, dan karena itu tidak tertangkap oleh pengujian pada mesin pelaku. Sifat inilah yang menjadikan aturan emas sebagai kesepakatan sosial yang ditegakkan disiplin, bukan oleh Git.

Membuktikan duplikasi pada repository orang lain#

Skenario berikut melanggar aturan emas dengan sengaja pada tiga repository lokal. Budi mengirim satu commit, Citra menariknya, lalu Budi mengubah commit itu dan memaksakan pengirimannya.

bash
# 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"
bash
rm -rf /tmp/lab-emas.git /tmp/lab-budi /tmp/lab-citra
git init --bare /tmp/lab-emas.git
git init -b main /tmp/lab-budi
cd /tmp/lab-budi
git config user.name "Budi"
git config user.email "[email protected]"
printf "Panduan.\n" > panduan.md
git add panduan.md
git commit -m "Panduan"
git remote add origin /tmp/lab-emas.git
git push -q -u origin main
cd /tmp
git clone -q lab-emas.git lab-citra
cd lab-budi
printf "Panduan diperbaiki.\n" > panduan.md
git add panduan.md
git commit --amend -m "Panduan yang lebih baik"
git push --force-with-lease origin main
text Keluaran
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: 	git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: 	git branch -m <name>
Initialized empty Git repository in /tmp/lab-emas.git/
Initialized empty Git repository in /tmp/lab-budi/.git/
[main (root-commit) 53ff172] Panduan
 1 file changed, 1 insertion(+)
 create mode 100644 panduan.md
warning: remote HEAD refers to nonexistent ref, unable to checkout
[main 7b03084] Panduan yang lebih baik
 Date: Sun Nov 1 09:00:00 2026 +0700
 1 file changed, 1 insertion(+)
 create mode 100644 panduan.md
To /tmp/lab-emas.git
 + 53ff172...7b03084 main -> main (forced update)

Pengiriman paksa berhasil, dan dari sudut pandang Budi semuanya rapi. Sekarang periksa sisi Citra yang pernah menarik commit lama.

bash
cd /tmp/lab-citra
git fetch
git log --oneline --graph --all -4
text Keluaran
From /tmp/lab-emas
 + 53ff172...7b03084 main       -> origin/main  (forced update)
* 7b03084 Panduan yang lebih baik

Repository Citra kini memuat dua commit yang mengatakan hal serupa, yaitu commit lama pada branch lokalnya dan pasangan baru pada origin/main. Grafisnya memperlihatkan dua commit yang mengatakan hal serupa, dan setiap orang yang menarik setelah itu perlu menebak versi mana yang sah. Pada proyek nyata, duplikasi ini menimpa puluhan commit sekaligus dan membuat penelusuran penyebab perubahan menjadi tidak bisa dipercaya.

Jalan keluar yang sehat#

Ketika kesalahan pada riwayat bersama benar-benar perlu dibetulkan, dua jalan keluar menjaga kewarasan. Jalan pertama adalah git revert, yang membatalkan dengan commit baru dan tidak menulis ulang apa pun, sehingga seluruh salinan tetap serasi. Jalan kedua adalah koordinasi eksplisit, yaitu mengumumkan penulisan ulang, memastikan setiap orang menyelesaikan pekerjaannya, dan menuntun setiap orang menyelaraskan salinannya setelah pengiriman paksa. Keduanya mahal, dan justru karena mahal itulah pemeriksaan sebelum mengirim menjadi kebiasaan yang paling murah.

Wilayah aman rebase dapat diringkas dari sisi yang berlawanan: commit pada branch milik pribadi yang belum dikirim bebas di-rebase sebanyak yang diperlukan, dan branch yang disegarkan terhadap main milik orang lain boleh di-rebase selama commitnya masih milik pribadi. Selama penunjuk kerajinan ini dijaga, rebase memberi manfaatnya penuh tanpa menyeret siapa pun.

Ringkasan#

  • Commit yang sudah dibagikan tidak boleh di-rebase karena salinan orang lain masih mengacu pada commit aslinya.
  • Penulisan ulang riwayat bersama menghasilkan duplikasi commit pada repository orang lain, dan tidak terasa pada mesin pelaku.
  • --force-with-lease lebih aman daripada --force, tetapi keduanya tetap dilarang pada branch bersama tanpa koordinasi.
  • Pembetulan riwayat bersama dijalankan dengan revert atau dengan pengumuman penulisan ulang yang eksplisit.

Referensi#