Workflow apapun yang dipilih tim — feature branch, GitHub Flow, bahkan cabang singkat ala Trunk-Based Development — hukumnya sama: main terus bergerak. Setiap hari rekan menambah commit ke jalur utama, sementara branch fitur kita berdiri diam di titik tempat ia lahir. Selisih yang kecil hari ini menjadi jurang minggu depan, dan jurang itu dibayar dengan satu mata uang yang paling mahal: konflik. Chapter ini melatih kebiasaan murah yang mencegahnya — mengukur ketinggalan secara rutin, lalu menyatu kembali ke main lewat salah satu dari dua jalan: merge atau rebase.
Biaya Branch yang Menua #
Anggap setiap hari usia branch menumpuk utang. Saat Budi bercabang hari Senin, kode main dan kode branch-nya identik. Selasa Siti mengubah tiga berkas, Rabu dua lagi — tidak ada yang terasa berubah di meja Budi, tetapi setiap commit itu adalah selisih baru. Bila kedua sisi menyentuh baris yang sama, main dan branch berhenti bisa didamaikan otomatis; Git menyerahkan keputusannya kepada manusia.
Ukuran penderitaan itu sebanding usia branch, bukan ukuran fiturnya. Fitur raksasa yang diintegrasikan tiap hari nyaris tanpa gesekan; fitur kecil yang dibiarkan dua minggu bisa menyulut konflik panjang. Karena itu disiplinnya sederhana: integrasi rutin dari main — harian adalah ideal, mingguan adalah batas bawah sebelum selisih mulai menakutkan.
Mengukur Seberapa Jauh Tertinggal #
Sebelum menyatu, ukur dulu. Rentang dua-titik A..B yang dikenal dari Git Log dan Opsinya
menjawab dua pertanyaan berbeda sekaligus. Sandbox-nya: branch fitur/pencarian berumur tiga hari dengan dua commit, sementara main sudah maju dua commit oleh Siti.
git log --oneline main..fitur/pencarian
git log --oneline fitur/pencarian..mainOutput yang Dihasilkan (dua perintah):
a8e60a6 Tambah filter hasil
bfa97f6 Tambah kolom pencarian75cfaf9 Tambah footer
06b5e23 Tambah halaman kontakPerintah pertama menghitung commit yang hanya dimiliki branch — dua commit milik Budi. Perintah kedua, dengan rentang dibalik, menghitung yang hanya dimiliki main — dua commit milik Siti. Dua baris versus dua baris terlihat damai; bayangkan bila sisi kanan berisi empat puluh commit dan salah satunya menulis ulang berkas yang sedang kita pegang.
Dua Jalan Menyatu: Merge atau Rebase #
Keduanya membawa hasil main masuk ke branch; bedanya mekanisme dan bekasnya di riwayat:
| Kriteria | Merge dari main | Rebase ke main |
|---|---|---|
| Bentuk riwayat | gelembung commit merge berinduk dua | lurus linear, seolah tak pernah tertinggal |
| Hash commit fitur | tetap — identitas asli terjaga | ditulis ulang — commit lama diganti salinan baru |
| Konflik diurai | sekali, terkumpul di satu merge | per commit saat dipindahkan ke basis baru |
| Branch sudah ter-push bersama | aman — riwayat bersama tak disentuh | berbahaya — identitas yang dilihat rekan berubah |
| Kesan jujur | mencatat kapan integrasi terjadi | merapikan, dengan biaya menulis ulang |
Perbandingan mendalam keduanya sudah dibedah di Rebase vs Merge ; mekanisme pemindahan basisnya di Konsep Rebase . Aturan praktisnya satu kalimat: branch pribadi yang belum dilihat siapa-siapa enak di-rebase; branch yang sudah hidup di remote dan jadi bahan review orang lain lebih aman di-merge.
Demo: Branch Tiga Hari, Dua Repo Kembar #
Percobaan paling jujur memakai kasus identik di dua repositori kembar — pola dari Revert vs Reset
. Kerangkanya: main berisi kerangka toko, Budi bercabang dua commit, lalu Siti menambah dua commit ke main. Variabel GIT_AUTHOR_DATE/GIT_COMMITTER_DATE hanya menambat tanggal konsisten; commit Siti memakai identitas lewat -c:
mkdir sinkron-merge && cd sinkron-merge
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'beranda\n' > situs.md
git add situs.md
GIT_AUTHOR_DATE="2026-10-15T09:00:00+07:00" GIT_COMMITTER_DATE="2026-10-15T09:00:00+07:00" \
git commit -m "Buat kerangka toko"
git switch -c fitur/pencarian
printf 'kolom pencarian\n' > pencarian.md
git add pencarian.md
GIT_AUTHOR_DATE="2026-10-15T10:00:00+07:00" GIT_COMMITTER_DATE="2026-10-15T10:00:00+07:00" \
git commit -m "Tambah kolom pencarian"
printf 'kolom pencarian\nhasil\n' > pencarian.md
git add pencarian.md
GIT_AUTHOR_DATE="2026-10-16T11:00:00+07:00" GIT_COMMITTER_DATE="2026-10-16T11:00:00+07:00" \
git commit -m "Tambah filter hasil"
git switch main
printf 'kontak\n' > kontak.md
git add kontak.md
GIT_AUTHOR_DATE="2026-10-16T09:00:00+07:00" GIT_COMMITTER_DATE="2026-10-16T09:00:00+07:00" \
git -c user.name="Siti Rahma" -c user.email="[email protected]" \
commit -m "Tambah halaman kontak"
printf 'toko budi\n' > footer.md
git add footer.md
GIT_AUTHOR_DATE="2026-10-17T09:00:00+07:00" GIT_COMMITTER_DATE="2026-10-17T09:00:00+07:00" \
git -c user.name="Siti Rahma" -c user.email="[email protected]" \
commit -m "Tambah footer"
git switch fitur/pencarianBuat repositori kembar kedua dengan blok yang sama — cukup ganti namanya menjadi sinkron-rebase. Ukuran ketinggalan diukur seperti bagian sebelumnya; kedua repo identik hingga titik ini. Pada repo pertama, jalan merge ditempuh dari dalam branch:
git merge mainOutput yang Dihasilkan:
Merge made by the 'ort' strategy.
footer.md | 1 +
kontak.md | 1 +
2 files changed, 2 insertions(+)
create mode 100644 footer.md
create mode 100644 kontak.mdgit log --oneline --graph --all --decorateOutput yang Dihasilkan:
* d1a12cb (HEAD -> fitur/pencarian) Merge branch 'main' into fitur/pencarian
|\
| * 75cfaf9 (main) Tambah footer
| * 06b5e23 Tambah halaman kontak
* | a8e60a6 Tambah filter hasil
* | bfa97f6 Tambah kolom pencarian
|/
* 872f9e0 Buat kerangka tokoBekas integrasinya terlihat jelas: commit merge d1a12cb menjahit dua jalur, dan commit Budi (bfa97f6, a8e60a6) tetap berdiri di jalurnya dengan hash asli. Di repo kembar kedua, jalan rebase ditempuh dari dalam branch yang sama:
git rebase mainOutput yang Dihasilkan:
Successfully rebased and updated refs/heads/fitur/pencarian.git log --oneline --graph --all --decorateOutput yang Dihasilkan:
* aca08df (HEAD -> fitur/pencarian) Tambah filter hasil
* cf9e025 Tambah kolom pencarian
* 75cfaf9 (main) Tambah footer
* 06b5e23 Tambah halaman kontak
* 872f9e0 Buat kerangka tokoPerbedaannya mencolok. Graf kedua lurus — seolah fitur/pencarian baru bercabang dari main tadi pagi, padahal usianya tiga hari. Harganya juga terlihat: Tambah kolom pencarian kini bernama cf9e025, bukan lagi bfa97f6 — kedua commit Budi ditulis ulang sebagai salinan di basis baru. Hash di mesin pembaca berbeda, tetapi hubungan “hash berubah setelah rebase, tetap setelah merge” selalu berlaku.
Dua demo tadi berjalan mulus karena satu hal: berkas yang disentuh Budi dan Siti tidak bertabrakan. Kedua jalur menyatu tanpa satu pun konflik. Begitu dua tangan menyunting baris yang sama, sinkronisasi berubah wujud — dari urusan teknis menjadi urusan antar manusia. Chapter berikutnya memainkan skenario itu sampai tuntas: dari push yang ditolak, konflik yang muncul, sampai prosedur menyelesaikannya bersama.