Sebagian besar praktik terbaik dalam Git bermuara pada satu kebiasaan: tentukan isi komit sebelum mengetik git commit, bukan setelahnya. Area staging adalah usulan komit berikutnya yang dibangun secara terencana. Praktik ini diterapkan dalam alur kerja rutin: men-stage perubahan secara presisi dengan git add -p, meninjau hasil staging, menulis pesan komit yang bermanfaat, menjaga repositori dari berkas sampah menggunakan .gitignore, serta beralih cabang dan memulihkan berkas dengan git switch dan git restore. Seluruh perintah diuji pada Git 2.43.0, sedangkan git switch dan git restore memerlukan Git 2.23 atau lebih baru.

Prinsip Komit Tunggal dan Perubahan Atomik

Sebuah komit ideal memuat satu perubahan logis yang dapat dijelaskan dalam satu kalimat dan dapat di-revert tanpa merusak bagian lain. Perbaikan pembulatan total faktur adalah satu komit. Sebaliknya, memperbaiki pembulatan, mengganti nama fungsi pembantu, dan memperbarui dependensi adalah tiga komit terpisah. Jika Anda kesulitan menulis subjek tanpa kata "dan", perubahan tersebut kemungkinan merupakan dua komit. Komit kecil dan terfokus mempercepat tinjauan kode, membuat git revert aman, dan membantu git bisect menemukan sumber masalah secara akurat.

Pekerjaan jarang selesai secara berurutan. Misalnya, Anda memperbaiki format salam pada berkas PHP sekaligus mengubah perhitungan total faktur di berkas yang sama:

git diff
diff --git a/InvoiceService.php b/InvoiceService.php
--- a/InvoiceService.php
+++ b/InvoiceService.php
@@ -2,10 +2,10 @@

 function greet(string $name): string
 {
-    return 'Hello ' . $name;
+    return "Hello, {$name}!";
 }

 function total(array $items): float
 {
-    return array_sum($items);
+    return array_sum(array_map(fn ($i) => $i->price, $items));
 }

Memilih Perubahan Menggunakan Git Add Patch

Perintah git add InvoiceService.php akan men-stage kedua perubahan sekaligus. Untuk men-stage perubahan pertama saja, gunakan patch mode:

git add -p InvoiceService.php

Git menampilkan potongan perubahan (hunk) satu per satu. Karena kedua suntingan berdekatan, Git menggabungkannya ke dalam satu hunk, sehingga tekan s untuk membaginya:

(1/1) Stage this hunk [y,n,q,a,d,s,e,?]? s
Split into 2 hunks.
@@ -2,8 +2,8 @@

 function greet(string $name): string
 {
-    return 'Hello ' . $name;
+    return "Hello, {$name}!";
 }

 function total(array $items): float
 {
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? y
@@ -6,6 +6,6 @@
 }

 function total(array $items): float
 {
-    return array_sum($items);
+    return array_sum(array_map(fn ($i) => $i->price, $items));
 }
(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]? n
  • Kini git status -s menampilkan MM InvoiceService.php, menandakan sebagian berkas telah di-stage dan sebagian belum. Lakukan komit pada bagian yang di-stage, lalu ulangi untuk sisanya. Opsi tombol yang tersedia meliputi: y untuk men-stage hunk, n untuk mengabaikan, s untuk memecah hunk, e untuk menyunting manual, a atau d untuk men-stage atau melewati seluruh hunk tersisa pada berkas, q untuk keluar, serta ? untuk mencetak bantuan navigasi (seperti j, K, g, dan /). Perintah git add -p hanya bekerja pada berkas yang sudah dilacak. Untuk berkas baru yang belum dilacak, jalankan git add -N berkas.txt terlebih dahulu agar tercatat sebagai intent to add berstatus A.
  • Patch mode rawan kekeliruan pemilihan hunk, sehingga periksa perubahan sebelum membuat komit:
git diff --staged      # index vs last commit: what will be committed
git diff               # working tree vs index: what will be left behind

Perintah git commit -v menyematkan diff staging di bawah templat pesan tanpa menyimpannya ke dalam pesan komit. Jalankan git config --global commit.verbose true untuk menjadikannya setelan baku. Opsi -v ganda (-vv) juga memperlihatkan perubahan yang belum di-stage.

Standar Format Penulisan Pesan Komit

Dokumentasi Git menyarankan format pesan: satu baris ringkasan di bawah 50 karakter, satu baris kosong, lalu deskripsi lengkap. Baris pertama diperlakukan sebagai judul pada git log --oneline, patch email, dan antarmuka web:

Round invoice totals to two decimals before tax

Totals were summed from unrounded line items, so a 3-line invoice
could be off by one cent against the payment gateway. Round each
line first, then sum.

Fixes the mismatch reported in #482.
  • Tiga kebiasaan penting penulisan pesan: gunakan kalimat perintah (imperative mood) pada subjek seperti "Add retry to webhook client" alih-alih "Added" atau "Adds"; batasi panjang baris tubuh pesan sekitar 72 karakter untuk keterbacaan di terminal; serta jelaskan alasan perubahan (why), bukan sekadar apa yang diubah (what), karena rincian kode sudah tercantum pada diff:
a1b2c3d fix stuff
e4f5a6b Retry webhook delivery on 5xx responses

Jika ada berkas tertinggal atau terjadi kesalahan ketik pesan, gunakan --amend untuk mengganti ujung cabang:

# add a forgotten change and keep the existing message
git add newfile.txt
git commit --amend --no-edit

# or just reword the message
git commit --amend -m "Add newfile.txt with sample content"

Operasi --amend menghasilkan komit baru dengan hash berbeda (misalnya dari d38c758 ke 285763d lalu ke 62515a9), bukan mengedit komit lama. Ini aman pada repositori lokal pribadi, namun berbahaya jika komit sudah ditarik pengembang lain karena mengubah riwayat bersama.

Mengabaikan Berkas Menggunakan Aturan .gitignore

Berkas .gitignore mendaftarkan pola berkas tak terlacak yang harus diabaikan Git. Contoh konfigurasi umum:

.env
*.log
build/
vendor/
node_modules/
!keep.log
  • Aturan penting mencakup: garis miring di akhir (build/) hanya mencocokkan direktori; garis miring di awal atau tengah menjadikan pola relatif terhadap lokasi berkas .gitignore (/hello.* cocok dengan hello.txt tetapi tidak dengan a/hello.java); **/foo mencocokkan di direktori mana pun; dan tanda seru di awal (!) menegaskan negasi seperti !keep.log. Berkas dalam direktori induk yang telah diabaikan tidak dapat dimasukkan kembali dengan negasi karena Git tidak memeriksa isi direktori tersebut.
  • Untuk mengetahui aturan yang berlaku pada suatu berkas, gunakan git check-ignore:
git check-ignore -v logs/a.log build/o.js keep.log
.gitignore:2:*.log  logs/a.log
.gitignore:3:build/ build/o.js
.gitignore:4:!keep.log  keep.log

Keluaran menampilkan sumber:baris:pola dan jalur berkas. Berkas keep.log cocok dengan aturan negasi pada baris 4, sehingga tetap berstatus untracked pada git status.

Berkas yang sudah terlacak tidak terpengaruh aturan .gitignore. Untuk menghentikan pelacakan berkas seperti .env tanpa menghapusnya dari penyimpanan lokal:

git rm --cached .env
git commit -m "Stop tracking .env"

Setelahnya, git status dan git ls-files tidak lagi mencatat berkas tersebut. Ini hanya berlaku ke depan; riwayat komit lama masih memuat isinya, sehingga kredensial yang pernah ter-komit harus segera dirotasi.

Aturan ignore dapat ditempatkan di .gitignore repositori untuk seluruh tim, di .git/info/exclude khusus klon lokal, atau di berkas global core.excludesFile ($XDG_CONFIG_HOME/git/ignore atau ~/.config/git/ignore) untuk berkas preferensi editor dan sistem operasi pribadi.

Manajemen Cabang dan Pemulihan Berkas dengan Switch dan Restore

Git 2.23 memecah fungsi git checkout menjadi git switch dan git restore. Gunakan git switch main untuk berpindah cabang, git switch -c feature/x untuk membuat cabang baru, git switch - untuk kembali ke cabang sebelumnya, dan git switch --detach HEAD~1 untuk memeriksa komit tanpa cabang. Untuk pemulihan berkas, gunakan git restore --staged InvoiceService.php untuk unstage, git restore InvoiceService.php untuk membuang perubahan belum di-stage, git restore -p InvoiceService.php untuk membuang perubahan per potongan, dan git restore --source=HEAD~1 InvoiceService.php untuk memulihkan berkas dari komit lain.

Perintah git switch menolak salah ketik cabang tanpa opsi -c dengan pesan galat fatal: invalid reference. Berhati-hatilah dengan git restore pada berkas yang belum di-stage karena menimpa salinan kerja secara permanen dan tidak dapat dipulihkan melalui reflog.

  • Solusi masalah umum: jika git add -p melewati berkas baru, jalankan git add -N; jika tombol s tidak tersedia, gunakan e untuk menyunting manual; jika berkas di .gitignore tetap modified, jalankan git rm --cached; jika pola negasi gagal, jangan abaikan direktori induknya; jika salah komit ke cabang lain, gunakan reset atau cherry-pick; jika git switch tidak ditemukan, perbarui Git atau gunakan git checkout.
  • Biasakan menjalankan git diff --staged sebelum komit, pisahkan perubahan dengan git add -p, tulis alasan logis pada tubuh pesan komit, tambahkan kredensial serta keluaran build ke .gitignore sebelum komit perdana, dan perlakukan git restore pada berkas yang belum di-stage sebagai tindakan ireversibel. Referensi resmi mencakup dokumentasi git-add, git-commit, gitignore, git-switch, dan git-restore.