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:

bash
git switch -c fitur/rapikan

Output yang Dihasilkan:

text
Switched to a new branch 'fitur/rapikan'

Commit pertama memasang kerangka bagian baru di akhir berkas — masih berupa placeholder:

bash
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:

text
[fitur/rapikan e0534cc] wip: mulai mode fokus
 1 file changed, 4 insertions(+)

Dua commit berikutnya mengisi kerangka itu — satu aturan, lalu satu contoh:

bash
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):

text
[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:

bash
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:

text
[fitur/rapikan b67e7a1] wip: rapikan redaksi
 1 file changed, 1 insertion(+), 2 deletions(-)

Commit kelima membawa bentuk final dan pesan yang layak tampil:

bash
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:

text
[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:

bash
git log --oneline main..fitur/rapikan

Output yang Dihasilkan:

text
95429b9 feat: mode fokus
b67e7a1 wip: rapikan redaksi
227c006 wip: tambah contoh tugas aktif
f8ec201 wip: tambah aturan satu tugas
e0534cc wip: mulai mode fokus

Lima 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:

bash
git rebase -i HEAD~5

Buffer yang terbuka di editor (komentar bantuannya dipotong):

text
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:

text
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 :

bash
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~5

Script 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:

text
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:

bash
git log --oneline main..fitur/rapikan

Output yang Dihasilkan:

text
cc9f64c feat: mode fokus

Sebelum 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:

bash
cat src/app.txt

Output yang Dihasilkan:

text
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 jam

Menyatukan ke main #

bash
git switch main
git merge fitur/rapikan

Output yang Dihasilkan:

text
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:

bash
git branch -d fitur/rapikan

Output yang Dihasilkan:

text
Deleted branch fitur/rapikan (was cc9f64c).

Ringkasan Proyek #

Graf riwayat akhir seluruh proyek:

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

Output yang Dihasilkan:

text
* 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 tugas

Sembilan 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.

BagianPencapaianPerintah inti
Bagian 1basis main + fitur daftar tugas dalam dua commit bertahapgit init -b main, git switch -c, git add, git commit
Bagian 2gelembung fitur di graf, changelog, tag v0.1.0git merge --no-ff, git branch -d, git tag -a
Bagian 3konflik terkontrol diselesaikan dengan empat langkahgit merge, sunting + git add, git commit
Bagian 4lima eksperimen menjadi satu commit, masuk lewat fast-forwardgit rebase -i dengan fixup dan squash, git merge

Konsep yang dipakai di sepanjang proyek dan tempat teorinya bila ingin diulang:

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 .