Strategi branching memilih arah; kecelakaan tetap datang tanpa undangan — dan hampir semua kecelakaan Git pernah ditangkap, dibaca, dan diobati di chapter teori dengan keluaran nyata. Chapter ini merangkum dua belas yang paling sering muncul menjadi satu tabel tiga kolom: gejala berisi pesan atau keadaan persis yang terlihat di terminal, penyebab menjelaskan mekanisme di baliknya, dan solusi menunjuk perintah penawar beserta chapter tempatnya dibedah. Cara pakainya seperti tabel keputusan pada contekan undo: temukan baris yang gejalanya paling mirip, baca penyebabnya dulu — obat yang tepat ditentukan oleh diagnosis, bukan oleh kepanikan. Empat kelompok mengikuti asal masalahnya: status dan staging, push dan merge, pekerjaan yang tampak hilang, serta konfigurasi dan identitas.

Status dan Staging #

Masalah grup ini murni salah baca keadaan — tidak ada yang rusak, hanya Git dan kita membedakan istilah. git status adalah alat diagnosis pertama sekaligus solusi bagi dua dari tiga gejalanya.

GejalaPenyebabSolusi
nothing to commit, working tree clean padahal yakin baru menyimpan suntinganBerkas baru masih untracked — belum pernah di-git add — atau tersamarkan pola .gitignore.Baca daftar untracked di git status; git add <berkas> untuk mendaftarkannya; bila berkas tidak juga muncul, periksa pola dengan git check-ignore -v (Untracked dan Tracked Files ).
Your branch is ahead of 'origin/main' by N commitCommit lokal belum dikirim ke remote.git push (Upstream Branch ).
Your branch is behind 'origin/main' by N commitRemote-tracking sudah maju — biasanya setelah git fetch — sementara branch lokal diam.git pull untuk menutup jarak, atau git merge/git rebase eksplisit (git fetch ).

Push dan Merge #

Grup ini lahir dari satu fakta: remote dan lokal bergerak independen. Penolakan push bukan kegagalan melainkan pengaman — server menolak menimbun commit yang tidak dikenalnya, dan pesan galatnya selalu menyertakan jalan keluar.

GejalaPenyebabSolusi
! [rejected] main -> main (fetch first)Remote memegang commit yang tidak dimiliki lokal — menggeser tanpa memuatnya akan mengubur kerjaan rekan.git fetch lalu merge atau rebase, baru git push (Push Rejected ).
! [rejected] main -> main (non-fast-forward)Riwayat lokal ditulis ulang (amend, rebase, reset) sehingga HEAD bukan turunan origin/main.Sinkronkan dulu seperti baris di atas; bila penulisan ulang memang disengaja dan belum dibagikan, git push --force-with-lease (Non-Fast-Forward Push ).
CONFLICT (content): Merge conflict in ... saat pullKedua sisi menyunting baris yang sama — Git menyerahkan keputusan kepada kita.Sunting blok <<<<<<</=======/>>>>>>>, git add, lalu selesaikan; git merge --abort atau git rebase --abort membatalkan (Menyelesaikan Merge Conflicts ).
fatal: refusing to merge unrelated historiesDua riwayat tanpa satu pun leluhur bersama — lokal bertemu repository platform yang tercentang buat README.Bila keduanya memang satu proyek: git pull origin main --allow-unrelated-histories (Menghubungkan Repository Lokal ).

Pekerjaan yang Tampak Hilang #

Tiga dari empat gejala grup ini tidak benar-benar kehilangan apa pun: Git menyimpan objek lebih lama dari yang terlihat, dan reflog menjaga jejak semua posisi HEAD. Musuh sebenarnya bukan Git, melainkan refleks merapikan repository saat panik.

GejalaPenyebabSolusi
You are in 'detached HEAD' stateHEAD menempel pada commit atau hash, bukan pada branch.Buat branch git switch -c <nama> untuk menambatkan posisi; bila commit sudah telanjur lahir, temukan posisinya di git reflog lalu bangkitkan branch baru (Menangani Detached HEAD ).
Berkas “hilang” setelah berpindah branchWorking tree ditukar sesuai snapshot branch tujuan — berkas itu hanya ada di branch asal, tidak terhapus.git switch <branch-asal> mengembalikannya; versi lain diambil dengan git restore --source=<titik> (Berpindah Branch ).
fatal: bad object <hash>Hash salah ketik, atau objeknya sudah dipangkas dari database — nasib yang menimpa objek setelah git gc --prune=now.Periksa ketikan dengan git cat-file -t <hash>; objek yang benar-benar terpangkas hanya kembali dari cadangan git bundle (Menghapus Secret dari Riwayat , Backup Repository ).
Hooks tidak jalan di clone baru.git/hooks/ hidup di dalam .git — folder yang tidak pernah ikut git clone.git config core.hooksPath hooks mengarahkan Git ke folder hook versioned; satu perintah per clone (Mengelola Hooks ).

Konfigurasi dan Identitas #

Gejala grup ini berdiri di luar riwayat: akhir baris, lokasi folder, dan identitas penulis. Semuanya sekali atur lalu terlupakan — sampai komputer baru atau kolaborator baru mengingatkan.

GejalaPenyebabSolusi
warning: CRLF will be replaced by LFAkhir baris berkas dan aturan konversi belum sepakat — Windows memakai CRLF, repository menyimpan LF.Atur core.autocrlf per mesin dan .gitattributes per repository (Konfigurasi Line Endings ).
fatal: not a git repositoryPerintah dijalankan dari folder di luar repository — Git tidak menemukan folder .git di atasnya.Pindah ke folder proyek; bila proyek memang belum menjadi repository, jalankan git init -b main (Struktur Repository ).
Commit tercatat atas nama yang salah, atau Please tell me who you are.user.name/user.email belum diatur, atau global dipakai pada repo yang seharusnya beridentitas lain.Set identitas — git config user.name/user.email — lalu perbaiki commit terakhir dengan git commit --amend --reset-author --no-edit (Konfigurasi Identitas ).

Dua belas baris di atas menyentuh istilah dari upstream sampai reflog — dan masih ada puluhan istilah lain yang tersebar di seluruh Course. Kamus ringkasnya menutup section contekan ini: Glosarium .