Worktree, Blame & Advanced — Git

Tool kelas lanjut yang jarang diajarkan di tutorial dasar — tapi sekali tahu, produktivitas melompat. 1. git worktree — banyak folder, satu repo Masalah…

Tiga alat untuk kerja di repo yang sudah ramai: git worktree membuka branch lain di folder kedua tanpa mengganggu folder pertama, git blame menunjukkan siapa yang terakhir mengubah tiap baris, dan git log -S mencari commit yang membuat sebuah teks muncul atau hilang. Gambaran untuk yang pertama: dua meja kerja untuk satu lemari arsip. Di meja satu, kerjaan fitur tetap berantakan seperti adanya. Di meja dua, kamu kerjakan hotfix. Dua meja itu mengambil dari lemari arsip yang sama, yaitu satu folder .git.

🧪 Tebakan cepat: di repo contoh di bawah, commit refactor validation mengubah baris return e.includes("@"); jadi return email.includes("@");. Apakah git log -S"includes" menampilkan commit itu? Tebak dulu, jawabannya ada di bagian "git log -S: kapan sebuah teks muncul atau hilang".

Repo contohnya

Sebuah toko online punya auth.js. Riwayatnya di main ada tiga commit dari tiga orang:

$ git log --oneline main
e91c5a8 (main) wajibkan titik di email
7b2e4d0 refactor validation
a3f9c21 tambah fungsi validateEmail

Isi auth.js sekarang:

function validateEmail(e) {
  const email = e.trim();
  return email.includes("@") && email.includes(".");
}

Kamu sendiri sedang di branch fitur-login, dengan perubahan yang belum di-commit.

git worktree: dua folder, satu repo

Tiba-tiba ada bug darurat di main. Kerjaanmu di fitur-login masih setengah jadi, dan npm run dev-nya lagi jalan. Daripada stash dan pindah branch, buka main di folder kedua:

$ git worktree add ../toko-hotfix main
Preparing worktree (checking out 'main')
HEAD is now at e91c5a8 wajibkan titik di email
$ git worktree list
/home/kamu/kode/toko        c0d4e17 [fitur-login]
/home/kamu/kode/toko-hotfix e91c5a8 [main]
$ cd ../toko-hotfix          # perbaiki bug, commit, push seperti biasa
$ cd ../toko
$ git worktree remove ../toko-hotfix

Kapan worktree lebih baik dari git stash? Saat kamu perlu dua branch aktif bersamaan: server dev di satu folder tetap jalan, hotfix di folder lain. Kalau cuma perlu menyimpan perubahan sebentar, stash sudah cukup.

git blame: siapa terakhir mengubah tiap baris

$ git blame auth.js
^a3f9c21 (Rina 2026-09-01 10:12:45 +0700 1) function validateEmail(e) {
7b2e4d03 (Bima 2026-09-08 14:03:10 +0700 2)   const email = e.trim();
e91c5a84 (Sari 2026-09-15 09:30:02 +0700 3)   return email.includes("@") && email.includes(".");
^a3f9c21 (Rina 2026-09-01 10:12:45 +0700 4) }

Jadi baris 2, const email = e.trim();, terakhir diubah Bima di commit 7b2e4d0. Untuk tahu kenapa, buka commit-nya dengan git show 7b2e4d0: pesan, penulis, dan diff lengkapnya. Kalau file-nya panjang, batasi barisnya: git blame -L 2,3 auth.js cuma menampilkan baris 2 sampai 3.

git log -S: kapan sebuah teks muncul atau hilang

-S disebut pickaxe. Dia mencari commit yang mengubah jumlah kemunculan sebuah teks, artinya commit yang menambahkan atau menghapus teks itu.

$ git log -S"validateEmail" --oneline
a3f9c21 tambah fungsi validateEmail
$ git log -S"includes" --oneline
e91c5a8 (main) wajibkan titik di email
a3f9c21 tambah fungsi validateEmail

Hitung includes di auth.js setelah tiap commit:

Commit Jumlah includes Muncul di -S"includes"?
a3f9c21 tambah fungsi validateEmail 0 jadi 1 ya
7b2e4d0 refactor validation 1 jadi 1 gak
e91c5a8 wajibkan titik di email 1 jadi 2 ya

refactor validation memang mengubah baris yang berisi includes, tapi jumlahnya tetap satu, jadi gak muncul. Itu jawaban tebakannya.

Bedakan dengan --grep, yang mencari di pesan commit, bukan di kode: git log --grep="valid" --oneline menampilkan 7b2e4d0 refactor validation dan a3f9c21 tambah fungsi validateEmail, karena dua pesan itu memuat kata valid.

💡 Tambahan: riwayat satu file dan diff-nya

⚠️ Jebakan yang sering ketemu

TL;DR: git worktree add ../folder branch membuka branch lain di folder kedua, satu repo, tanpa stash, cocok saat perlu dua branch aktif bersamaan. git worktree list melihat semuanya, git worktree remove membereskannya. git blame file menunjukkan hash, penulis, tanggal dan nomor baris dari perubahan terakhir tiap baris, lanjutkan dengan git show <hash>. git log -S"teks" mencari commit yang menambah atau menghapus teks itu (jumlah kemunculannya berubah), sedangkan --grep mencari di pesan commit.

Yang akan kamu pelajari