Fitur terakhir aplikasi — mode fokus — akan kita kerjakan seperti pekerjaan sungguhan berlangsung: coba-coba, simpan checkpoint, perbaiki, ulangi. Hasilnya jujur tapi berantakan: empat commit berpesan wip mengikuti alur pikiran, dan pesan yang layak tampil baru muncul pada commit terakhir. Bagian ini sengaja membiarkan kekacauan itu terjadi, lalu merapikannya dengan git rebase -i: lima commit eksperimen dilipat menjadi satu commit feat: mode fokus sebelum masuk ke main. Tekniknya persis resep dari Menggabungkan Commit
.
Eksperimen Lima Commit #
Branch terakhir proyek:
git switch -c fitur/rapikanOutput yang Dihasilkan:
Switched to a new branch 'fitur/rapikan'Commit pertama memasang kerangka bagian baru di akhir berkas — masih berupa placeholder:
printf '\n## Mode Fokus\n\n(tulis satu tugas yang sedang dikerjakan)\n' >> src/app.txt
git add src/app.txt
git commit -m "wip: mulai mode fokus"Output yang Dihasilkan:
[fitur/rapikan e0534cc] wip: mulai mode fokus
1 file changed, 4 insertions(+)Dua commit berikutnya mengisi kerangka itu — satu aturan, lalu satu contoh:
printf 'Satu tugas pada satu waktu.\n' >> src/app.txt
git add src/app.txt
git commit -m "wip: tambah aturan satu tugas"
printf '\nTugas aktif: Belajar Git satu jam\n' >> src/app.txt
git add src/app.txt
git commit -m "wip: tambah contoh tugas aktif"Output yang Dihasilkan (perintah commit terakhir):
[fitur/rapikan 227c006] wip: tambah contoh tugas aktif
1 file changed, 2 insertions(+)Commit keempat merapikan redaksi — placeholder diganti kalimat sungguhan dan aturan yang berdiri sendiri dilebur:
printf 'Aplikasi Tugas Harian\n======================\n\n## Daftar Tugas\n\n- [ ] Susun jadwal harian\n- [ ] Belajar Git satu jam\n\n## Kategori\n\n- kerja\n- belajar\n- rumah\n\n## Mode Fokus\n\nTulis satu tugas yang sedang dikerjakan, abaikan sisanya.\n\nTugas aktif: Belajar Git satu jam\n' > src/app.txt
git add src/app.txt
git commit -m "wip: rapikan redaksi"Output yang Dihasilkan:
[fitur/rapikan b67e7a1] wip: rapikan redaksi
1 file changed, 1 insertion(+), 2 deletions(-)Commit kelima membawa bentuk final dan pesan yang layak tampil:
printf 'Aplikasi Tugas Harian\n======================\n\n## Daftar Tugas\n\n- [ ] Susun jadwal harian\n- [ ] Belajar Git satu jam\n\n## Kategori\n\n- kerja\n- belajar\n- rumah\n\n## Mode Fokus\n\nSatu tugas pada satu waktu: tuliskan tugas yang sedang dikerjakan,\nabaikan sisanya sampai selesai.\n\nTugas aktif: Belajar Git satu jam\n' > src/app.txt
git add src/app.txt
git commit -m "feat: mode fokus"Output yang Dihasilkan:
[fitur/rapikan 95429b9] feat: mode fokus
1 file changed, 2 insertions(+), 1 deletion(-)Keadaan branch saat ini — diukur dengan rentang main..fitur/rapikan yang menghitung commit milik branch dan belum dimiliki main:
git log --oneline main..fitur/rapikanOutput yang Dihasilkan:
95429b9 feat: mode fokus
b67e7a1 wip: rapikan redaksi
227c006 wip: tambah contoh tugas aktif
f8ec201 wip: tambah aturan satu tugas
e0534cc wip: mulai mode fokusLima commit; empat di antaranya berpesan wip. Riwayat ini jujur mencatat proses, tetapi bagi siapa pun selain penulisnya pesan-pesan itu nyaris tak berisi.
Membuka Naskah Riwayat #
Interactive rebase membuka daftar todo — baris-baris yang bisa kita sunting untuk mengubah naskah riwayat:
git rebase -i HEAD~5Buffer yang terbuka di editor (komentar bantuannya dipotong):
pick e0534cc wip: mulai mode fokus
pick f8ec201 wip: tambah aturan satu tugas
pick 227c006 wip: tambah contoh tugas aktif
pick b67e7a1 wip: rapikan redaksi
pick 95429b9 feat: mode fokus
(dipotong — sisanya komentar bantuan bawaan Git)Daftar berurut dari commit tertua di atas; setiap baris meminta satu aksi. Strategi lipatnya meniru resep dari Menggabungkan Commit
: baris pertama tetap pick sebagai badan commit; tiga baris wip setelahnya diganti fixup — isinya melebur ke atas, pesannya dibuang; baris terakhir diganti squash — isinya melebur dan pesan feat: mode fokus ikut disatukan, sehingga pesan hasil bisa kita tetapkan sendiri. Sunting buffer hingga menjadi:
pick e0534cc wip: mulai mode fokus
fixup f8ec201 wip: tambah aturan satu tugas
fixup 227c006 wip: tambah contoh tugas aktif
fixup b67e7a1 wip: rapikan redaksi
squash 95429b9 feat: mode fokus
(dipotong — sisanya komentar bantuan bawaan Git)Menjalankan Rebase Tanpa Membuka Editor #
Menyunting buffer secara manual tentu boleh, tetapi Git menyediakan jalur terprogram: GIT_SEQUENCE_EDITOR menggantikan editor khusus berkas todo, dan GIT_EDITOR menggantikan editor pesan commit yang terbuka saat aksi squash menyatukan pesan. Siapkan pesan final dalam sebuah berkas, lalu tautkan sed untuk mengganti aksi tiap baris — pola yang diperkenalkan di Interactive Rebase
:
printf 'feat: mode fokus\n' > pesan.txt
GIT_SEQUENCE_EDITOR="sed -i -e 2s/^pick/fixup/ -e 3s/^pick/fixup/ -e 4s/^pick/fixup/ -e 5s/^pick/squash/" \
GIT_EDITOR="cp pesan.txt" git rebase -i HEAD~5Script sed mengganti pick menjadi fixup pada baris 2 sampai 4 dan menjadi squash pada baris 5 — persis suntingan buffer di atas. Ketika Git membuka editor pesan untuk hasil squash, GIT_EDITOR="cp pesan.txt" menggantinya dengan sekadar menimpa berkas pesan menggunakan isi pesan.txt. Keluaran lengkapnya:
Rebasing (2/5)Rebasing (3/5)Rebasing (4/5)Rebasing (5/5)[detached HEAD cc9f64c] feat: mode fokus
Date: Thu Nov 5 09:00:00 2026 +0700
1 file changed, 7 insertions(+)
Successfully rebased and updated refs/heads/fitur/rapikan.Empat hal patut dibaca dari keluaran tersebut. Baris Rebasing (2/5) dan seterusnya adalah progres singkat yang di terminal ditimpa baris berikutnya (Git memakai carriage-return; pada keluaran yang ditangkap keduanya terekam berurutan). Baris [detached HEAD cc9f64c] feat: mode fokus memperlihatkan commit hasil lipatan lahir dengan pesan final. Baris Date: Thu Nov 5 09:00:00 2026 +0700 menampilkan tanggal penulis yang dipertahankan dari commit pertama yang dilipat — sesi ini memakai tanggal tetap, jadi angkanya cocok dengan narasi. Terakhir, 7 insertions(+) adalah diffstat gabungan kelima suntingan; tidak satu baris pekerjaan pun hilang dalam pelipatan.
Satu Commit Bersih #
Ukur kembali isi branch:
git log --oneline main..fitur/rapikanOutput yang Dihasilkan:
cc9f64c feat: mode fokusSebelum rebase, rentang ini berisi lima baris dengan empat pesan wip; kini tinggal satu baris berpesan final. Hash cc9f64c berbeda dari hash commit yang dilipat — menulis ulang riwayat selalu melahirkan objek baru. Bukti bahwa isi berkas utuh sampai baris terakhir:
cat src/app.txtOutput yang Dihasilkan:
Aplikasi Tugas Harian
======================
## Daftar Tugas
- [ ] Susun jadwal harian
- [ ] Belajar Git satu jam
## Kategori
- kerja
- belajar
- rumah
## Mode Fokus
Satu tugas pada satu waktu: tuliskan tugas yang sedang dikerjakan,
abaikan sisanya sampai selesai.
Tugas aktif: Belajar Git satu jamMenyatukan ke main #
git switch main
git merge fitur/rapikanOutput yang Dihasilkan:
Updating caa6e56..cc9f64c
Fast-forward
src/app.txt | 7 +++++++
1 file changed, 7 insertions(+)Keluaran ini berbeda dari dua merge sebelumnya. Baris Updating caa6e56..cc9f64c memaparkan rentang perpindahan, lalu Fast-forward menyatakan tidak ada commit merge yang dibuat: main diam di caa6e56 sejak branch dibuka, dan satu commit bersih di ujung branch cukup ditarik maju. Perbedaannya dengan pilihan --no-ff di Bagian 2 memang disengaja — di sana dua commit fitur perlu gelembung supaya terbaca sebagai satu unit; di sini satu commit feat: mode fokus sudah bercerita sendiri, dan riwayat tetap lurus.
Branch terakhir juga bereskan:
git branch -d fitur/rapikanOutput yang Dihasilkan:
Deleted branch fitur/rapikan (was cc9f64c).Ringkasan Proyek #
Graf riwayat akhir seluruh proyek:
git log --oneline --graph --decorateOutput yang Dihasilkan:
* cc9f64c (HEAD -> main) feat: mode fokus
* caa6e56 Selesaikan konflik judul di src/app.txt
|\
| * 350ef4a Ganti judul dan tambah kategori tugas
* | 6946d1b Perbarui judul aplikasi
|/
* 6eb32b4 (tag: v0.1.0) docs: catat fitur daftar tugas
* 4074715 Gabungkan fitur daftar tugas
|\
| * e64b462 Isi daftar tugas awal
| * 0a15ce0 Tambah kerangka daftar tugas
|/
* ae67134 Rintis aplikasi catatan tugasSembilan commit yang terbaca seperti cerita: rintisan, gelembung fitur pertama, catatan rilis bertanda v0.1.0, pertabrakan dua sisi yang berujung commit penyelesaian, dan satu commit bersih di puncak. Hash di mesin kita berbeda, komposisinya tidak.
| Bagian | Pencapaian | Perintah inti |
|---|---|---|
| Bagian 1 | basis main + fitur daftar tugas dalam dua commit bertahap | git init -b main, git switch -c, git add, git commit |
| Bagian 2 | gelembung fitur di graf, changelog, tag v0.1.0 | git merge --no-ff, git branch -d, git tag -a |
| Bagian 3 | konflik terkontrol diselesaikan dengan empat langkah | git merge, sunting + git add, git commit |
| Bagian 4 | lima eksperimen menjadi satu commit, masuk lewat fast-forward | git rebase -i dengan fixup dan squash, git merge |
Konsep yang dipakai di sepanjang proyek dan tempat teorinya bila ingin diulang:
- siklus branch pendek — Membuat Branch dan Strategi Branching ;
- pilihan bentuk penggabungan — Fast-Forward Merge dan git merge ;
- ritual penyelesaian konflik — Menyelesaikan Merge Conflicts ;
- perapian riwayat — Interactive Rebase dan Menggabungkan Commit .
Aplikasi Catatan Tugas tuntas dengan tiga fitur, changelog, dan satu rilis bernomor. Namun repository ini murni lokal — semua siklus ditarikan sendirian, tanpa satu pun remote. Proyek berikutnya menghubungkan repository ke remote lokal dan mensimulasikan dua orang bekerja bersama lewat push dan fetch: Proyek 03: Kolaborasi Melalui Remote .