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 validationmengubah barisreturn e.includes("@");jadireturn email.includes("@");. Apakahgit 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
git worktree add ../toko-hotfix mainmembuat folder barutoko-hotfixdi sebelah folder proyekmu, lalu checkoutmaindi sana. Foldertokogak tersentuh: branch-nya tetapfitur-login, perubahannya tetap di tempat.git worktree listmenampilkan semua worktree: alamat folder, commit yang sedang dibuka, dan branch-nya.- Tiap worktree punya file dan branch sendiri, tapi commit dan branch-nya dibagi. Commit hotfix yang kamu buat di
toko-hotfixlangsung terlihat daritoko. - Satu branch cuma boleh dibuka di satu worktree. Git menolak kalau kamu mencoba membuka
fitur-logindi folder kedua. git worktree remove ../toko-hotfixmenghapus folder itu setelah selesai.
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) }
- Kolom pertama: hash commit yang terakhir mengubah baris itu. Tanda
^menandai commit paling awal dalam riwayat. - Di dalam kurung: penulis, tanggal dan jam, lalu nomor baris.
- Sisanya: isi barisnya.
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
git log -p -- auth.jsmenampilkan setiap commit yang menyentuhauth.js, lengkap dengan diff-nya. Tambahkan--followsupaya riwayatnya tetap tersambung kalau file-nya pernah di-rename.git log -S"includes" -pmenampilkan diff di commit yang ketemu, jadi kamu langsung lihat baris yang ditambah atau dihapus.git log -G"includes"memakai regex dan menampilkan semua commit yang diff-nya menambah atau menghapus baris berisi teks itu. Commitrefactor validationikut muncul di sini.git blame -w auth.jsmengabaikan perubahan yang cuma spasi atau indentasi.
⚠️ Jebakan yang sering ketemu
- Blame dikira menunjuk penulis asli. Blame menunjuk orang terakhir yang mengubah baris. Satu commit "rapikan format" bisa mengambil alih ratusan baris. Lanjutkan dengan
git showataugit log -puntuk melihat sebelumnya. -Sdikira mencari semua perubahan. Dia cuma mencari perubahan jumlah. Baris yang diedit tanpa menambah atau mengurangi teksnya gak muncul. Pakai-Guntuk itu.- Membuka branch yang sama di dua worktree. Git menolak. Pakai branch lain, atau buat branch baru dengan
git worktree add -b nama-branch ../folder. - Menghapus worktree yang sedang kamu buka.
git worktree removetetap menghapus foldernya, dan terminalmu tertinggal di folder yang sudah gak ada: perintah Git berikutnya menjawabfatal: Unable to read current working directory. Pindah dulu ke folder utama (cd ../toko), baru hapus.
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.