Interactive Rebase + Quiz 3.1
Tujuan Pembelajaran
- Menguasai interactive rebase untuk merapikan history
- Memahami opsi pick, reword, squash, fixup, dan drop
- Mengevaluasi pemahaman modul 3.1 melalui quiz
Materi Inti
A. Interactive Rebase
Interactive rebase (git rebase -i) adalah salah satu fitur paling powerful di Git. Dengan ini kamu bisa merapikan history commit sebelum di-push atau membuat PR.
Memulai interactive rebase:
# Rebase interaktif untuk 4 commit terakhir
git rebase -i HEAD~4
Setelah menjalankan perintah ini, editor akan terbuka dengan daftar commit:
pick abc123 feat: tambah halaman login
pick def456 fix: perbaiki typo di login
pick ghi789 feat: tambah validasi form
pick jkl012 fix: perbaiki bug validasi
B. Opsi Interactive Rebase
Kamu bisa mengganti kata pick di depan setiap commit dengan opsi berikut:
| Opsi | Singkatan | Fungsi |
|---|---|---|
pick | p | Gunakan commit apa adanya (default) |
reword | r | Ubah pesan commit (konten tetap sama) |
edit | e | Pause untuk mengedit commit |
squash | s | Gabungkan dengan commit sebelumnya (simpan kedua pesan) |
fixup | f | Gabungkan dengan commit sebelumnya (buang pesan ini) |
drop | d | Hapus commit sepenuhnya |
Kamu juga bisa mengubah urutan commit dengan memindahkan baris.
C. Contoh Penggunaan
Squash: Gabungkan commit kecil menjadi satu
Sebelum:
pick abc123 feat: tambah halaman login
pick def456 fix: perbaiki typo di login
pick ghi789 style: rapikan indentasi login
Ubah menjadi:
pick abc123 feat: tambah halaman login
squash def456 fix: perbaiki typo di login
squash ghi789 style: rapikan indentasi login
Hasil: 3 commit digabung menjadi 1 commit dengan pesan yang bisa kamu edit.
Fixup: Gabungkan tanpa menyimpan pesan
pick abc123 feat: tambah halaman login
fixup def456 fix: perbaiki typo di login
fixup ghi789 style: rapikan indentasi login
Hasil: 3 commit digabung menjadi 1 dengan pesan “feat: tambah halaman login” saja.
Reword: Ubah pesan commit
reword abc123 feat: tambah halaman login
pick def456 feat: tambah validasi form
Editor akan terbuka lagi untuk mengedit pesan commit abc123.
D. Force Push Setelah Rebase
Karena rebase mengubah hash commit, kamu perlu force push jika branch sudah pernah di-push:
# AMAN: gagal jika remote sudah berubah
git push --force-with-lease origin fitur-branch
# BAHAYA: menimpa remote tanpa cek
git push --force origin fitur-branch
Warning: Selalu gunakan
--force-with-leasedaripada--force. Ini mencegah kamu menimpa perubahan orang lain yang mungkin sudah push ke branch yang sama.
E. Kapan Menggunakan Interactive Rebase
Gunakan sebelum membuat PR:
- Gabungkan commit “fix typo” dan “perbaiki bug kecil” ke commit utama
- Ubah pesan commit yang kurang jelas
- Hapus commit yang tidak perlu (misalnya commit debugging)
Jangan gunakan pada:
- Branch
mainatau branch shared - Commit yang sudah di-merge
- Branch yang sudah di-review orang lain (kecuali diminta)
Demonstrasi Live
Merapikan History dengan Interactive Rebase
mkdir latihan-irebase && cd latihan-irebase && git init
# Buat beberapa commit yang "berantakan"
echo "<h1>App</h1>" > index.html
git add . && git commit -m "feat: setup halaman utama"
echo "<nav>Menu</nav>" >> index.html
git add . && git commit -m "feat: tambah navigasi"
echo "<nav>Menu Utama</nav>" > index.html.tmp
head -1 index.html > index.html
cat index.html.tmp >> index.html
rm index.html.tmp
git add . && git commit -m "fix: perbaiki typo di navigasi"
echo "<footer>2024</footer>" >> index.html
git add . && git commit -m "feat: tambah footer"
echo "<footer>Copyright 2024</footer>" >> index.html
git add . && git commit -m "fix: perbaiki teks footer"
# Lihat history yang berantakan
git log --oneline
# 5 commit, tapi seharusnya bisa lebih rapi
# Interactive rebase untuk merapikan
git rebase -i HEAD~4
# Di editor, ubah:
# pick ... feat: tambah navigasi
# squash ... fix: perbaiki typo di navigasi (gabung ke navigasi)
# pick ... feat: tambah footer
# squash ... fix: perbaiki teks footer (gabung ke footer)
# Lihat history yang sudah rapi
git log --oneline
# Sekarang hanya 3 commit yang bersih
Latihan Interaktif
Latihan LGB: Interactive Rebase
Level 1: “Interactive Rebase Intro” (Moving Work Around - Level 2)
Buka Learn Git Branching dan ketik:
level move2
Tujuan: Gunakan interactive rebase untuk mengubah urutan commit.
Solusi:
git rebase -i HEAD~4 --aboveAll
Info: Di LGB,
--aboveAlladalah flag khusus LGB. Di Git sesungguhnya, kamu mengubah urutan baris di editor teks.
Level 2: “Juggling Commits” (Mixed Bag - Level 2)
Ketik di LGB:
level mixed2
Tujuan: Kombinasikan interactive rebase dengan amend untuk mengubah commit di tengah history.
Solusi:
git rebase -i HEAD~2 --aboveAll
git commit --amend
git rebase -i HEAD~2 --aboveAll
git rebase caption main
Info: Teknik ini menunjukkan bagaimana interactive rebase memungkinkan kamu mengedit commit yang bukan commit terakhir, sesuatu yang tidak bisa dilakukan dengan
git commit --amendsaja.
Latihan Terminal: Squash Workflow
mkdir latihan-squash && cd latihan-squash && git init
# Simulasi development yang "berantakan"
echo "# Toko Online" > README.md
git add . && git commit -m "init: setup project"
echo "<h1>Toko</h1>" > index.html
git add . && git commit -m "feat: tambah halaman utama"
echo "<h1>Toko Online</h1>" > index.html
git add . && git commit -m "fix: perbaiki judul"
echo "<nav>Home | Produk</nav>" >> index.html
git add . && git commit -m "feat: tambah menu navigasi"
echo "<nav>Home | Produk | Kontak</nav>" > nav.html
git add . && git commit -m "fix: pindahkan nav ke file terpisah"
# Lihat history
git log --oneline
# Squash: gabungkan fix ke commit fitur
# git rebase -i HEAD~4
# Ubah commit "fix: perbaiki judul" menjadi fixup
# Ubah commit "fix: pindahkan nav" menjadi squash dengan "feat: tambah menu"
Quiz Modul 3.1
Quiz ini menguji pemahaman tentang rebase, interactive rebase, dan cherry-pick.
Passing grade: 70% (minimal 6 dari 8 benar)
Topik yang Diuji
| No | Topik | Jumlah Soal |
|---|---|---|
| 1 | Rebase vs Merge | 2 soal |
| 2 | Golden Rule | 1 soal |
| 3 | Interactive Rebase | 3 soal |
| 4 | Force Push | 1 soal |
| 5 | Rebase workflow | 1 soal |
Materi yang Perlu Dikuasai
Rebase vs Merge:
- Rebase membuat history linear, merge membuat merge commit
- Rebase mengubah hash commit (membuat commit baru)
- Merge tidak mengubah commit yang sudah ada
Golden Rule:
- Jangan rebase branch yang sudah di-push dan digunakan orang lain
- Rebase aman untuk branch lokal atau branch pribadi
Interactive Rebase:
squashmenggabungkan commit dan menyimpan kedua pesanfixupmenggabungkan commit dan membuang pesan commit yang digabungrewordmengubah pesan commit tanpa mengubah kontendropmenghapus commit sepenuhnya- Bisa mengubah urutan commit
Force Push:
--force-with-leaselebih aman karena gagal jika remote sudah berubah--forcemenimpa remote tanpa pengecekan (berbahaya)
Rebase Workflow:
- Gunakan rebase untuk membersihkan history lokal sebelum PR
git rebase --abortuntuk membatalkan rebasegit rebase --continueuntuk melanjutkan setelah menyelesaikan konflik
Tugas Mandiri
- Buat project dengan minimal 6 commit yang “berantakan” (ada fix typo, debugging, dll)
- Gunakan interactive rebase untuk merapikan menjadi 3-4 commit yang bersih
- Praktikkan setiap opsi: reword, squash, fixup, dan drop
- Selesaikan kedua level LGB di atas sampai mendapat centang hijau
- Buat branch fitur, rebase ke main, lalu merge (bandingkan hasilnya dengan merge biasa)
Praktik Interaktif
Selesaikan level berikut untuk memperkuat pemahaman kamu.
Quiz: Review Modul 3.1
Jawab 8 pertanyaan berikut untuk menguji pemahaman kamu.
Perbedaan utama rebase dan merge adalah...