Setiap demo rebase sejauh ini diakhiri baris Successfully rebased and updated refs/heads/... — tanda setiap commit fitur diterapkan bersih di atas basis barunya. Begitu main dan fitur menyunting baris yang sama, penerapan sebuah patch gagal: rebase berhenti di tengah jalan, meninggalkan penanda konflik di working directory, dan menunggu kita memutuskan. Konflik rebase punya irama berbeda dari konflik merge — ia muncul per commit, bisa berulang dalam satu rebase, dan setiap putarannya dituntaskan git rebase --continue. Chapter ini mereproduksinya secara nyata: dua konflik berturut-turut dalam satu rebase, diselesaikan keduanya sampai baris Successfully kembali.

Reproduksi: Dua Commit Menabrak main #

Repository latihan sengaja dirancang bertabrakan. Berkas harga.md berisi dua baris harga yang dipisah baris kosong; branch fitur-harga menaikkan kedua harga lewat dua commit terpisah, sementara main menyesuaikan kedua baris dalam satu commit:

bash
mkdir latihan-konflik && cd latihan-konflik
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'kopi: 1000\n\ngula: 500\n' > harga.md
git add harga.md
git commit -m "Buat daftar harga"
git switch -c fitur-harga
printf 'kopi: 1500\n\ngula: 500\n' > harga.md
git add harga.md
git commit -m "Naikkan harga kopi jadi 1500"
printf 'kopi: 1500\n\ngula: 700\n' > harga.md
git add harga.md
git commit -m "Naikkan harga gula jadi 700"
git switch main
printf 'kopi: 1200\n\ngula: 600\n' > harga.md
git add harga.md
git commit -m "Sesuaikan daftar harga"
git switch fitur-harga
git log --oneline --graph --all

Output yang Dihasilkan:

text
* 1d60b0b Sesuaikan daftar harga
| * b929dbc Naikkan harga gula jadi 700
| * 072ba1c Naikkan harga kopi jadi 1500
|/  
* 2271a02 Buat daftar harga

Dari fitur-harga, rebase ke main dijalankan — dan langsung terhenti:

bash
git rebase main

Output yang Dihasilkan:

text
Auto-merging harga.md
CONFLICT (content): Merge conflict in harga.md
error: could not apply 072ba1c... Naikkan harga kopi jadi 1500
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
hint: Disable this message with "git config advice.mergeConflict false"
Could not apply 072ba1c... Naikkan harga kopi jadi 1500

Keluaran itu layak dibaca pelan-pelan. Auto-merging harga.md menyatakan Git mencoba menggabungkan otomatis; CONFLICT (content): Merge conflict in harga.md menyatakan upaya itu gagal pada berkas tersebut. Baris error: could not apply 072ba1c... Naikkan harga kopi jadi 1500 menyebut commit yang gagal diterapkan — commit pertama fitur; baris Could not apply penutup mengulangnya sebagai ringkasan. Blok hint: lalu membagi tiga jalan keluar: selesaikan lalu git rebase --continue, lewati commit dengan git rebase --skip, atau batalkan semuanya dengan git rebase --abort — ketiganya terdokumentasi di git-rebase .

Membaca Keadaan: Rebase Sedang Berhenti #

Status saat rebase berhenti memperlihatkan posisi persisnya di dalam daftar:

bash
git status

Output yang Dihasilkan:

text
interactive rebase in progress; onto 1d60b0b
Last command done (1 command done):
   pick 072ba1c Naikkan harga kopi jadi 1500
Next command to do (1 remaining command):
   pick b929dbc Naikkan harga gula jadi 700
  (use "git rebase --edit-todo" to view and edit)
You are currently rebasing branch 'fitur-harga' on '1d60b0b'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
	both modified:   harga.md

no changes added to commit (use "git add" and/or "git commit -a")

Baris interactive rebase in progress; onto 1d60b0b — git rebase biasa pun memakai mesin yang sama dengan mode interaktif, maka label itu tampil — melaporkan basis baru. Last commands done mencatat pick 072ba1c yang barusan gagal; Next command to do mencatat pick b929dbc yang masih menunggu. Bagian Unmerged paths menampilkan both modified: harga.md dengan saran penandaan resolusi lewat git add. Terakhir, isi berkas yang bertabrakan:

bash
cat harga.md

Output yang Dihasilkan:

text
<<<<<<< HEAD
kopi: 1200
=======
kopi: 1500
>>>>>>> 072ba1c (Naikkan harga kopi jadi 1500)

gula: 600

Penanda <<<<<<<, =======, >>>>>>> ini persis penanda konflik merge dari chapter Merge Conflicts . Dua sisi yang berhadapan: sisi HEAD berisi kopi: 1200 — basis baru, alias keadaan main tempat rebase sedang berdiri — sedangkan sisi bawah berisi kopi: 1500, isi commit fitur yang sedang diterapkan. Satu detail penting: baris gula: 600 berada di luar penanda. Bagian berkas yang tidak bertabrakan sudah digabung otomatis — resolusi cukup fokus pada blok bertanda.

Menyelesaikan Konflik lalu Melanjutkan #

Resolusinya: harga kopi hasil fitur memang 1500, harga gula otomatis sudah 600 dari main. Tulis hasilnya, stage-kan, lanjutkan:

bash
printf 'kopi: 1500\n\ngula: 600\n' > harga.md
git add harga.md
git rebase --continue

Output yang Dihasilkan:

text
[detached HEAD 99696b4] Naikkan harga kopi jadi 1500
 1 file changed, 1 insertion(+), 1 deletion(-)
Auto-merging harga.md
CONFLICT (content): Merge conflict in harga.md
error: could not apply b929dbc... Naikkan harga gula jadi 700
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
hint: Disable this message with "git config advice.mergeConflict false"
Could not apply b929dbc... Naikkan harga gula jadi 700

Dua peristiwa berurutan terjadi di keluaran itu. Pertama, git rebase --continue menuntaskan commit pertama: baris [detached HEAD 99696b4] Naikkan harga kopi jadi 1500 — commit hasil resolusi lahir (editor pesan terbuka berisi pesan aslinya; simpan lalu tutup). Kedua, rebase melanjutkan ke pick b929dbc — dan konflik kedua meledak: error: could not apply b929dbc... Naikkan harga gula jadi 700. Irama khas rebase: satu konflik per commit — commit kedua fitur menabrak suntingan main pada baris gula. Berkasnya kini:

bash
cat harga.md

Output yang Dihasilkan:

text
kopi: 1500

<<<<<<< HEAD
gula: 600
=======
gula: 700
>>>>>>> b929dbc (Naikkan harga gula jadi 700)

Bentuk yang sudah dikenal, hanya bergeser baris: bagian kopi sudah bersih (1500 — hasil resolusi pertama), blok konflik kini memagari gula: 600 melawan gula: 700. Resolusi kedua — gula hasil fitur memang 700 — dengan urutan sama persis:

bash
printf 'kopi: 1500\n\ngula: 700\n' > harga.md
git add harga.md
git rebase --continue

Output yang Dihasilkan:

text
[detached HEAD f755215] Naikkan harga gula jadi 700
 1 file changed, 1 insertion(+), 1 deletion(-)
Successfully rebased and updated refs/heads/fitur-harga.

Kali ini tak ada konflik susulan: [detached HEAD f755215] menuntaskan commit kedua, langsung disusul Successfully rebased and updated refs/heads/fitur-harga. — rebase selesai. Siklus penuhnya:

Hasil Akhir: Graf Linear dengan Isi Terkurasi #

Riwayat akhirnya linear — kedua commit fitur berdiri di atas main:

bash
git log --oneline --graph --all

Output yang Dihasilkan:

text
* f755215 Naikkan harga gula jadi 700
* 99696b4 Naikkan harga kopi jadi 1500
* 1d60b0b Sesuaikan daftar harga
* 2271a02 Buat daftar harga
bash
cat harga.md

Output yang Dihasilkan:

text
kopi: 1500

gula: 700
bash
git status

Output yang Dihasilkan:

text
On branch fitur-harga
nothing to commit, working tree clean

Kedua resolusi membekas permanen di commit yang bersangkutan: 99696b4 membawa kopi: 1500, f755215 membawa gula: 700; branch pulang bersih.

Beda dengan Konflik Merge #

AspekKonflik mergeKonflik rebase
MunculSekali, di akhir penggabunganBerulang — sekali untuk tiap commit yang menabrak
Sisi penandaHEAD = branch aktif saat mergeHEAD = basis baru (ujung main saat rebase)
Setelah git addgit merge --continue atau git commitgit rebase --continue
Membatalkangit merge --abort — kembali ke pra-mergegit rebase --abort — kembali ke pra-rebase
HasilCommit merge berparent duaRiwayat linear

Baris kedua tabel itu sumber kebingungan paling umum: pada merge, sisi HEAD adalah branch tempat kita berdiri; pada rebase, sisi HEAD adalah basis baru — sebab rebase berdiri di atas main sambil menerapkan patch fitur satu per satu. Perintah git rebase --abort mengembalikan seluruh keadaan pra-rebase — dibahas lebih dalam beserta --skip di chapter Abort dan Continue Rebase .

Konflik rebase menutup latihan dasar menulis ulang riwayat: konsep, perintah, perbandingan dengan merge, todo interaktif, urutan, penggabungan, penyuntingan, hingga penyelesaian konflik — semuanya telah dijalankan nyata. Dua tombol darurat yang tersisa, git rebase --abort dan --skip, membuka chapter berikutnya: Abort dan Continue Rebase .