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:
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 --allOutput yang Dihasilkan:
* b5b5f2a Tambah halaman faq
| * f347b57 Tambah halaman galeri
| * b4f0db6 Tambah halaman kontak
|/
* 5e97ed2 Buat halaman berandaDari dalam fitur, rebase ke main dijalankan tanpa argumen lain:
git rebase mainOutput yang Dihasilkan:
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:
git log --oneline --graph --allOutput yang Dihasilkan:
* 0928cf6 Tambah halaman galeri
* 10b872f Tambah halaman kontak
* b5b5f2a Tambah halaman faq
* 5e97ed2 Buat halaman berandaMenjalankan 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:
git rebase mainOutput yang Dihasilkan:
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:
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 fiturTanpa fetch, origin/main masih tertinggal dua langkah. Tarik dulu kabar terbaru dari origin:
git fetch originOutput yang Dihasilkan:
From ../toko-origin
5db7801..1d4da6c main -> origin/mainBaris 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:
git rebase origin/mainOutput yang Dihasilkan:
Successfully rebased and updated refs/heads/fitur.Hasil akhirnya terbaca paling jelas dengan --decorate:
git log --oneline --graph --all --decorateOutput yang Dihasilkan:
* d673bb9 (HEAD -> fitur) Mulai halaman pencarian
* 1d4da6c (origin/main) Tambah halaman tentang
| * bd407c7 (origin/fitur) Mulai halaman pencarian
|/
* 5db7801 (main) Buat halaman berandaPerhatikan 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:
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 --allOutput yang Dihasilkan:
* a8b56b1 Tambah halaman galeri
| * f5a4153 Tambah halaman tentang
| * 125fd06 Tambah halaman faq
|/
* a05ee8e Buat halaman berandaCommit “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”:
git rebase --onto main fitur topikOutput yang Dihasilkan:
Successfully rebased and updated refs/heads/topik.git log --oneline --graph --allOutput yang Dihasilkan:
* d0dab0e Tambah halaman galeri
* f5a4153 Tambah halaman tentang
* 125fd06 Tambah halaman faq
* a05ee8e Buat halaman berandaParent commit galeri kini bisa diverifikasi langsung:
git rev-parse topik^ mainOutput yang Dihasilkan:
f5a4153fe1772d2e30ffff855fe3bf884fabce1d
f5a4153fe1772d2e30ffff855fe3bf884fabce1dSatu 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 .