git add dan git commit: cara menyimpan perubahan dengan benar
Menyimpan perubahan di Git dilakukan dalam dua langkah: git add memasukkan perubahan yang Anda pilih ke staging area (index), lalu git commit -m "pesan" mencatatnya ke riwayat sebagai satu snapshot. git status menunjukkan apa yang sudah berubah dan apa yang sudah disiapkan. Commit terakhir bisa diperbaiki dengan git commit --amend.
Di Git tidak ada tombol «simpan». Perubahan dicatat dalam dua langkah: pertama git add memilih perubahan mana yang akan masuk ke snapshot berikutnya, lalu git commit menulis snapshot itu ke dalam riwayat. Area perantara di antara keduanya disebut index atau staging area. Banyak orang butuh waktu lama untuk memahaminya, padahal justru area inilah yang membuat commit menjadi bermakna.
Tiga keadaan file: direktori kerja, index, riwayat
Setiap perubahan melewati tiga area:
- Direktori kerja — tempat Anda mengedit file di editor.
- Index (stage) —
git addmenyalin versi file saat ini ke draf commit berikutnya. - Riwayat —
git commitmengubah isi index menjadi commit lengkap dengan penulis, tanggal, dan pesan.
Analogi yang mudah: direktori kerja adalah ruangan tempat barang berserakan, index adalah kardus yang sudah terbuka tempat Anda memasukkan barang yang akan dikirim, dan commit adalah paket yang sudah disegel dan diberi label. Anda sendiri yang memutuskan apa yang masuk ke kardus, dan tidak harus mengirim semuanya sekaligus.
Mengapa index dibutuhkan
Bayangkan dalam satu jam Anda memperbaiki bug login, sekalian merapikan salah ketik di README, lalu mulai membuat fitur baru. Tanpa index, semuanya akan masuk ke satu commit berjudul «macam-macam». Dengan index, Anda membuat tiga commit terpisah. Masing-masing mudah dipahami, mudah direview, dan bisa dibatalkan tanpa mengganggu yang lain.
git status: apa yang berubah dan apa yang sudah disiapkan
Sebelum setiap add dan commit, biasakan melihat git status. Ini perintah paling aman di Git karena tidak mengubah apa pun.
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/auth.js
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
src/profile.js
- Changes to be committed — sudah ada di index dan akan masuk ke commit;
- Changes not staged — sudah diubah, tetapi belum ditambahkan;
- Untracked files — file baru yang belum dikenali Git.
Format singkat lebih nyaman kalau file yang berubah banyak:
$ git status -s
M src/auth.js
M README.md
?? src/profile.js
Kolom pertama menunjukkan status di index, kolom kedua status di direktori kerja. M di kiri berarti «diubah dan sudah ditambahkan», M di kanan berarti «diubah, belum ditambahkan», dan ?? berarti file belum dilacak.
git add: cara menambahkan perubahan ke index
| Perintah | Yang ditambahkan |
|---|---|
git add file.js | File tertentu |
git add src/ | Semua perubahan di dalam folder |
git add . | Semua perubahan di folder saat ini dan di bawahnya, termasuk file baru dan yang dihapus |
git add -A | Semua perubahan di seluruh repositori |
git add -u | Hanya file yang sudah dilacak; file baru tidak disentuh |
git add -p | Interaktif, per potongan (hunk) |
git add '*.css' | File yang cocok dengan pola |
Sinonim git add adalah git stage. Keduanya perintah yang sama, karena itu istilah «stage» atau «men-stage» juga sering dipakai.
git add -p: menambahkan sebagian isi file
Trik ini sering diremehkan. Jika dalam satu file ada dua perubahan yang tidak berhubungan, git add -p akan menampilkan setiap potongan dan bertanya apakah potongan itu ingin ditambahkan:
$ git add -p src/auth.js
@@ -12,7 +12,7 @@ function login(user) {
- if (user.password = input) {
+ if (user.password === input) {
(1/2) Stage this hunk [y,n,q,a,d,s,e,?]?
y — tambahkan, n — lewati, s — pecah potongan menjadi lebih kecil, q — keluar. Dengan cara ini satu file bisa menghasilkan dua commit yang rapi.
Cara memeriksa apa yang akan masuk ke commit
git diff # perubahan yang BELUM masuk ke index
git diff --staged # yang sudah ada di index dan akan masuk ke commit
Kebingungan yang sering terjadi: setelah git add, perintah git diff biasa tidak menampilkan apa-apa. Itu bukan tanda perubahan hilang. Perubahannya sudah ada di index, jadi lihat dengan git diff --staged (sinonimnya --cached).
Cara mengeluarkan file dari index
git restore --staged file.js
Isi file tetap utuh; file hanya tidak lagi disiapkan untuk commit. Di versi Git lama, perintah yang sama ditulis sebagai git reset HEAD file.js, dan itu masih berfungsi.
git commit: menyimpan perubahan
git commit -m "Perbaiki pemeriksaan kata sandi saat login"
[main 3f2a9c1] Perbaiki pemeriksaan kata sandi saat login
1 file changed, 1 insertion(+), 1 deletion(-)
Di keluarannya terlihat nama cabang, hash pendek commit baru, dan statistik perubahan. Ke dalam commit hanya masuk isi index. Jika setelah git add Anda mengedit file lagi, perubahan baru itu tidak ikut, kecuali Anda menambahkannya lagi.
Opsi git commit yang berguna
| Perintah | Fungsi |
|---|---|
git commit | Membuka editor untuk pesan yang lebih panjang |
git commit -m "..." | Pesan langsung di dalam perintah |
git commit -am "..." | Menambahkan semua file yang sudah dilacak lalu commit; file baru tidak ikut |
git commit -v | Menampilkan diff di editor saat Anda menulis pesan |
git commit --amend | Menulis ulang commit terakhir |
git commit --allow-empty -m "..." | Commit kosong, misalnya untuk menjalankan ulang CI |
Jika editor bawaan adalah Vim dan Anda terjebak di dalamnya: tulis pesan, tekan Esc, lalu ketik :wq dan Enter. Untuk mengganti editor, gunakan git config --global core.editor "code --wait" atau nano.
Cara menulis pesan commit yang baik
Pesan commit akan dibaca enam bulan kemudian, saat seseorang mencari dari mana asal sebuah bug. Pesan yang baik menjawab pertanyaan «apa dan mengapa», bukan «apa yang saya kerjakan hari ini».
- baris pertama maksimal sekitar 50–72 karakter dan menyatakan inti perubahan;
- gunakan kalimat perintah atau bentuk netral: «Tambahkan validasi email», «Fix login redirect»;
- jika perlu, beri baris kosong lalu tambahkan rinciannya: mengapa dibuat begini, batasan apa yang ada;
- satu commit untuk satu perubahan logis.
Contoh buruk: fix, revisi, wip, asdf. Contoh baik: Perbaiki error keranjang saat daftar produk kosong. Banyak tim memakai format Conventional Commits: feat: ..., fix: ..., docs: ....
git commit --amend: memperbaiki commit terakhir
Salah ketik di pesan atau lupa menambahkan satu file tidak perlu dibuatkan commit baru bernama «lupa file». Untuk itu ada amend.
Mengubah pesan
git commit --amend -m "Perbaiki pemeriksaan kata sandi saat login"
Menambahkan file yang terlewat
git add forgotten.js
git commit --amend --no-edit
Opsi --no-edit mempertahankan pesan yang lama.
Hal penting tentang amend
--amend tidak benar-benar «mengedit» commit. Git membuat commit baru dengan hash berbeda lalu menggantikan yang lama. Selama commit itu hanya ada di komputer Anda, ini aman. Jika Anda sudah melakukan git push, push biasa setelah amend akan ditolak, dan Anda perlu memakai git push --force-with-lease. Di cabang bersama yang juga dipakai orang lain, sebaiknya jangan dilakukan, karena Anda menulis ulang riwayat yang sudah menjadi dasar pekerjaan rekan Anda.
Jika amend dilakukan secara keliru, commit lama masih bisa ditemukan di git reflog, lalu Anda bisa kembali ke sana dengan git reset --soft HEAD@{1}.
Kesalahan yang sering terjadi
«nothing to commit, working tree clean»
Tidak ada perubahan: semuanya sudah di-commit, atau Anda mengedit file di folder lain. Periksa git status dan lokasi proyek Anda.
«no changes added to commit»
File sudah berubah, tetapi belum ditambahkan ke index. Jalankan git add, atau gunakan git commit -am untuk file yang sudah dilacak.
«Please tell me who you are»
Nama dan e-mail belum diatur. Jalankan sekali git config --global user.name "Nama Anda" dan git config --global user.email "email@anda".
Commit berisi file yang tidak seharusnya
Jika commit belum dikirim, batalkan commit dan biarkan perubahannya tetap di index: git reset --soft HEAD~1. Lalu keluarkan file yang tidak diinginkan dengan git restore --staged dan commit ulang. Jika yang masuk adalah rahasia seperti kata sandi atau kunci API, anggap rahasia itu bocor dan buat yang baru.
git add . ikut menambahkan file sampah
Siapkan .gitignore lebih dulu dan selalu periksa git status sebelum commit. File yang sudah terlanjur dilacak baru berhenti dilacak setelah Anda menjalankan git rm --cached file.
Apa sebenarnya commit itu
Commit tidak menyimpan selisih terhadap versi sebelumnya, melainkan snapshot seluruh proyek: referensi ke pohon file, referensi ke commit induk, penulis, tanggal, dan pesan. File yang tidak berubah tidak disalin ulang. Git hanya merujuk objek yang sudah tersimpan, sehingga riwayat tidak memakan banyak ruang.
Hash commit (misalnya 3f2a9c1) dihitung dari seluruh isi tersebut. Jika satu huruf di pesan diubah, hash-nya ikut berubah. Karena itu --amend dan rebase membuat commit baru, tidak mengedit yang lama, dan riwayat yang ditulis ulang akan berbenturan dengan salinan milik rekan kerja.
Untuk melihat riwayat secara ringkas, gunakan:
git log --oneline --graph -10
Setiap baris adalah satu commit. Jika pesan-pesan di riwayat Anda sudah bisa dipahami tanpa membuka diff, berarti Anda sudah melakukannya dengan benar.
Alur kerja harian
git status # apa yang berubah
git diff # lihat perubahannya
git add -p # pilih yang akan dimasukkan
git diff --staged # periksa yang akan masuk ke commit
git commit -m "Deskripsi yang jelas"
git log --oneline -5 # pastikan commit sudah tercatat
git push # kirim ke server
Commit hanya menyimpan perubahan secara lokal. Agar perubahan sampai ke GitHub atau server lain, Anda perlu menjalankan git push.
Ringkasan
git add menyusun snapshot berikutnya di index, git status dan git diff --staged menunjukkan apa yang akan masuk, dan git commit menulisnya ke riwayat. Buatlah commit kecil dengan pesan yang jelas, dan untuk perbaikan kecil pada commit terakhir gunakan git commit --amend selama belum di-push. Index dan alur add lalu commit dibahas dengan contoh praktis dalam kursus Git di Skillaria.
Pertanyaan umum
Seberapa sering sebaiknya melakukan commit?
Setiap kali satu perubahan logis selesai dan proyek dalam keadaan berfungsi. Banyak commit kecil lebih baik daripada satu commit besar di akhir hari.
Apakah ada perintah git save?
Tidak ada. Menyimpan dilakukan dengan git add dan git commit, sedangkan pekerjaan yang belum selesai bisa ditunda sementara dengan git stash.
Bagaimana cara melihat isi sebuah commit?
Jalankan git show diikuti hash commit untuk melihat penulis, pesan, dan semua perubahannya. Tanpa hash, perintah ini menampilkan commit terakhir.
Apa bedanya git add . dengan git add -A?
Di Git versi modern keduanya menambahkan file baru, yang diubah, dan yang dihapus. Perbedaannya ada pada cakupan: git add . bekerja pada folder saat ini beserta isinya, sedangkan git add -A bekerja pada seluruh repositori.
Bisakah mengubah commit yang bukan yang terakhir?
Bisa, dengan rebase interaktif: git rebase -i hash-induk, lalu tandai commit yang dituju sebagai edit atau reword. Lakukan ini hanya pada commit yang belum dikirim ke cabang bersama.
Topik ini dibahas mendalam dengan praktik di kursus “Git dari Nol hingga Pengembang Percaya Diri”.
Ke kursus