Konsep sudah jelas; sekarang perintahnya. git rebase punya bentuk dasar yang pendek, dua variasi basis yang sering dipakai dalam rutinitas harian, dan satu opsi lanjutan (--onto) untuk kasus pemindahan basis yang lebih bebas. Chapter ini menjalankan ketiganya nyata di sandbox: rebase ke main lokal, rebase ke origin/main hasil git fetch, dan --onto untuk memindahkan branch dari satu dasar ke dasar lain. Di sepanjang jalan kita juga akan bertemu keluaran yang menjadi tanda tangan rebase — Successfully rebased and updated refs/heads/... — dan satu kejutan bernama konflik yang sengaja ditunda ke chapter akhir section ini.

Sintaks Inti: git rebase main #

Bentuk paling sering dipakai: berdiri di branch fitur, sebutkan basis barunya. Repository latihannya mirip chapter sebelumnya — main maju satu commit selagi fitur menambah dua commitnya:

bash
mkdir latihan-rebase && cd latihan-rebase
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 commit -m "Buat halaman beranda"
git switch -c fitur
printf '[email protected]\n' > kontak.md
git add kontak.md
git commit -m "Tambah halaman kontak"
printf 'galeri foto\n' > galeri.md
git add galeri.md
git commit -m "Tambah halaman galeri"
git switch main
printf 'beranda\nfaq\n' > situs.md
git add situs.md
git commit -m "Tambah halaman faq"
git switch fitur
git log --oneline --graph --all

Output yang Dihasilkan:

text
* b5b5f2a Tambah halaman faq
| * f347b57 Tambah halaman galeri
| * b4f0db6 Tambah halaman kontak
|/  
* 5e97ed2 Buat halaman beranda

Dari dalam fitur, rebase ke main dijalankan tanpa argumen lain:

bash
git rebase main

Output yang Dihasilkan:

text
Successfully rebased and updated refs/heads/fitur.

Baris Successfully rebased and updated refs/heads/fitur. — keluaran bawaan Git 2.47.3 — menyatakan dua hal sekaligus: seluruh commit berpindah basis tanpa konflik, dan penunjuk refs/heads/fitur (berkas kecil milik branch dari chapter Konsep Branch ) digeser ke ujung hasil. Graf hasilnya kini linear:

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

Output yang Dihasilkan:

text
* 0928cf6 Tambah halaman galeri
* 10b872f Tambah halaman kontak
* b5b5f2a Tambah halaman faq
* 5e97ed2 Buat halaman beranda

Menjalankan perintah yang sama sekali lagi kini tidak melakukan apa-apa — Git memeriksa posisi, mendapati fitur sudah berdiri tepat di atas ujung main, dan mengakuinya dengan jujur:

bash
git rebase main

Output yang Dihasilkan:

text
Current branch fitur is up to date.

Basis origin/main: Rebase Setelah fetch #

Pada proyek sungguhan, basis yang relevan biasanya bukan main lokal — yang bisa saja tertinggal — melainkan origin/main, penunjuk remote-tracking hasil git fetch (materi section Remote Repository ). Sandbox berikutnya mensimulasikan alurnya: Budi men-push main dan fitur ke sebuah bare repository, lalu seorang rekan — di klon toko-rekan — menambah satu commit di main origin:

bash
mkdir latihan-remote && cd latihan-remote
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 commit -m "Buat halaman beranda"
git switch -c fitur
printf 'pencarian siap\n' > pencarian.md
git add pencarian.md
git commit -m "Mulai halaman pencarian"
git switch main
git init --bare ../toko-origin.git
git remote add origin ../toko-origin.git
git push -u origin main
git push origin fitur
git clone ../toko-origin.git ../toko-rekan
cd ../toko-rekan
printf 'beranda\ntentang\n' > situs.md
git add situs.md
git commit -m "Tambah halaman tentang"
git push
cd ../latihan-remote
git switch fitur

Tanpa fetch, origin/main masih tertinggal dua langkah. Tarik dulu kabar terbaru dari origin:

bash
git fetch origin

Output yang Dihasilkan:

text
From ../toko-origin
   5db7801..1d4da6c  main       -> origin/main

Baris 5db7801..1d4da6c main -> origin/main adalah laporan gerak origin/main (jalur ../toko-origin pada keluaran menyesuaikan lokasi direktori). Sekarang rebase dijalankan menembak penunjuk itu, bukan branch lokal:

bash
git rebase origin/main

Output yang Dihasilkan:

text
Successfully rebased and updated refs/heads/fitur.

Hasil akhirnya terbaca paling jelas dengan --decorate:

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

Output yang Dihasilkan:

text
* d673bb9 (HEAD -> fitur) Mulai halaman pencarian
* 1d4da6c (origin/main) Tambah halaman tentang
| * bd407c7 (origin/fitur) Mulai halaman pencarian
|/  
* 5db7801 (main) Buat halaman beranda

Perhatikan detail penting di graf: origin/fitur masih menunjuk commit lama bd407c7, sementara fitur lokal sudah pindah ke d673bb9. Rebase menulis ulang sisi lokal — remote belum tahu apa-apa. Sinkronisasi ulang branch yang sudah di-rebase menuntut git push --force-with-lease, dan di situlah letak risiko berbagi commit yang diulas di chapter Aturan Aman Mengubah Riwayat .

–onto: Memindahkan ke Basis Lain #

Sekilas satu bentuk lanjutan: git rebase --onto <basis-baru> <basis-lama> <branch> memutar ulang commit milik <branch> yang tidak berada di <basis-lama> ke atas <basis-baru>. Kasus klasiknya: branch topik berangkat dari fitur, lalu main berjalan sendiri — dan kita ingin commit topik pindah langsung ke atas main, melewati fitur:

bash
mkdir latihan-onto && cd latihan-onto
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 commit -m "Buat halaman beranda"
git branch fitur
printf 'faq\n' > faq.md
git add faq.md
git commit -m "Tambah halaman faq"
git switch main
printf 'beranda\ntentang\n' > situs.md
git add situs.md
git commit -m "Tambah halaman tentang"
git switch -c topik fitur
printf 'galeri foto\n' > galeri.md
git add galeri.md
git commit -m "Tambah halaman galeri"
git log --oneline --graph --all

Output yang Dihasilkan:

text
* a8b56b1 Tambah halaman galeri
| * f5a4153 Tambah halaman tentang
| * 125fd06 Tambah halaman faq
|/  
* a05ee8e Buat halaman beranda

Commit “Tambah halaman galeri” berada di topik yang berbasis fitur. Perintah git rebase --onto main fitur topik membacanya: “pindahkan ke main (--onto main) commit-commit topik yang bukan milik fitur”:

bash
git rebase --onto main fitur topik

Output yang Dihasilkan:

text
Successfully rebased and updated refs/heads/topik.
bash
git log --oneline --graph --all

Output yang Dihasilkan:

text
* d0dab0e Tambah halaman galeri
* f5a4153 Tambah halaman tentang
* 125fd06 Tambah halaman faq
* a05ee8e Buat halaman beranda

Parent commit galeri kini bisa diverifikasi langsung:

bash
git rev-parse topik^ main

Output yang Dihasilkan:

text
f5a4153fe1772d2e30ffff855fe3bf884fabce1d
f5a4153fe1772d2e30ffff855fe3bf884fabce1d

Satu hash yang sama untuk dua nama: topik^ adalah main — commit galeri benar-benar berpindah rumah ke ujung main, tanpa membawa serta commit fitur. Opsi --onto jarang dipakai sehari-hari, tetapi menyelamatkan saat struktur branch perlu ditata ulang; dokumentasi lengkapnya ada di git-rebase .

Dua alat penyusun riwayat — merge dan rebase — kini sama-sama sudah dicoba. Mana yang sebaiknya dipilih? Pertanyaan itu punya jawaban yang bergantung kebiasaan tim, dan perbandingannya yang jujur — tabel lengkap plus dua graf dari skenario yang sama — menunggu di chapter berikutnya: Rebase vs Merge .