Chapter sebelumnya menutup dengan satu ancaman rumah tangga: penunjuk origin/* yang mitranya sudah dihapus di remote akan tetap tinggal di clone kita sebagai cermin usang. Daftar cabang remote yang dipenuhi nama mati membuat git branch -r menipu, pelacakan branch lokal menunjuk ke sana yang tak ada, dan diskusi tim jadi membingungkan. Chapter ini menyapu persoalan itu: melihat referensi usang lewat git fetch --prune dan git remote prune, membedanya dari fetch biasa, lalu membiasakan diri dengan perawatan berkala.
Dua Branch yang Lahir dan Dua yang Mati #
Lab memakai pola dua penulis: bare repository proyek-utama.git berisi satu commit awal, Budi dan Siti masing-masing meng-clone-nya. Siti kemudian mengirim dua cabang sampingan sekaligus — fitur dengan berkas promo.md, lalu banner dengan banner.md. Budi mengenal keduanya lewat satu fetch:
git fetch originOutput yang Dihasilkan:
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-prune/proyek-utama
* [new branch] banner -> origin/banner
* [new branch] fitur -> origin/fiturgit branch -rOutput yang Dihasilkan:
origin/HEAD -> origin/main
origin/banner
origin/fitur
origin/mainBaris origin/HEAD -> origin/main adalah penanda cabang default yang ikut tersalin saat clone — keluarganya dibahas di chapter Tracking Branch
. Skenarionya mulai hidup ketika banner promo dibatalkan: dari clone-nya, Siti menghapus branch itu di remote:
git push origin --delete bannerOutput yang Dihasilkan (di clone siti):
To /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-prune/proyek-utama.git
- [deleted] bannerPenghapusan ini sudah dibedah utuh di chapter Menghapus Remote Branch ; fokus kita sekarang sisi penerima: apa yang terjadi pada salinan Budi.
Fetch Biasa Tidak Menyapu #
Budi menjalankan fetch biasa persis seperti biasa:
git fetch originOutput yang Dihasilkan:
Tidak ada satu baris pun — tidak ada perkembangan baru untuk diambil. Sunyi bukan berarti bersih:
git branch -rOutput yang Dihasilkan:
origin/HEAD -> origin/main
origin/banner
origin/fitur
origin/mainorigin/banner masih tercatat meskipun cabang aslinya sudah tiada. Fetch bertugas menyalin keadaan remote; ia tidak membandingkan balik daftar lama untuk mencari yang hilang. Referensi seperti inilah yang disebut stale — penunjuk ke branch yang sudah tidak ada di remote.
Diagnosis dengan git remote show #
Perintah inspeksi yang paling jujur untuk keadaan ini justru tidak menyapu sama sekali — git remote show origin menanyakannya langsung ke remote, lalu membandingkan dengan salinan kita:
git remote show originOutput yang Dihasilkan:
* remote origin
Fetch URL: /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-prune/proyek-utama.git
Push URL: /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-prune/proyek-utama.git
HEAD branch: main
Remote branches:
fitur tracked
main tracked
refs/remotes/origin/banner stale (use 'git remote prune' to remove)
Local branch configured for 'git pull':
main merges with remote main
Local ref configured for 'git push':
main pushes to main (up to date)Bagian Remote branches membandingkan dua dunia: fitur dan main masih hidup di remote dan tercatat di salinan kita, sedangkan origin/banner ditandai stale (use 'git remote prune' to remove) — referensinya ada di salinan, cabangnya sudah tidak ada di remote. Output lengkap seperti ini juga merangkum cabang default remote, ikatan pull dan push tiap branch lokal — potret menyeluruh yang layak dibaca berkala.
Menyapu dengan git remote prune #
Petunjuk pada keluaran di atas bisa langsung diikuti:
git remote prune originOutput yang Dihasilkan:
Pruning origin
URL: /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-prune/proyek-utama.git
* [pruned] origin/bannergit remote prune origin memeriksa daftar cabang remote, membandingkannya dengan salinan penunjuk di clone kita, lalu menghapus salinan yang mitranya sudah tidak ada — baris * [pruned] origin/banner mencatat sapuannya. Varian --dry-run hanya melaporkan tanpa menghapus, berguna untuk memeriksa sebelum menyapu di repository yang kita asing. Hasilnya terbaca dari daftar cabang:
git branch -rOutput yang Dihasilkan:
origin/HEAD -> origin/main
origin/fitur
origin/mainMenyapu Sambil Mengambil dengan fetch –prune #
Skenario berlanjut: proyek promosi pun tamat, dan kali ini giliran fitur yang dihapus Siti dari remote. Budi memilih satu perintah yang sekaligus mengambil dan menyapu:
git fetch --pruneOutput yang Dihasilkan:
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-prune/proyek-utama
- [deleted] (none) -> origin/fiturFlag --prune menambahkan babak pembersihan pada fetch biasa: setelah menyalin perkembangan terbaru, Git menyapu salinan penunjuk yang cabangnya sudah tidak ada. Baris - [deleted] (none) -> origin/fitur terbaca “dari ketiadaan menuju penghapusan origin/fitur” — penanda ini sempat kita lihat sebagai teaser di chapter git fetch
. Daftar akhirnya kembali jujur:
git branch -rOutput yang Dihasilkan:
origin/HEAD -> origin/main
origin/mainKedua penyapu membedah dengan tegas: git fetch --prune adalah fetch + sapuan dalam satu perintah, git remote prune origin sapuan saja tanpa mengambil apa pun — keduanya menghapus referensi yang sama. Cabang lokal tidak ikut tersentuh: menghapusnya adalah pekerjaan git branch -d di chapter Menghapus Remote Branch
. Di sisi Siti, yang menghapus, jejaknya justru terbaca dari anotasi : gone:
git branch -vvOutput yang Dihasilkan (di clone siti):
* banner b4522c1 [origin/banner: gone] Tambah banner promo
fitur bf2d88e [origin/fitur: gone] Tambah halaman promo
main bf0d4bd [origin/main] Buat README tokoAnotasi [origin/banner: gone] memberitahu bahwa upstream branch lokal itu sudah tidak ada di remote — sinyal untuk memutus ikatan, menghapus branch lokalnya, atau mengirim ulang bila penghapusannya keliru.
Perawatan Berkala #
Referensi usang jarang mengganggu di hari yang sama — ia mengotori perlahan. Karena itu sapuan paling baik dijadikan kebiasaan, bukan tindakan darurat:
git config fetch.prune trueKonfigurasi fetch.prune membuat setiap fetch otomatis menyapu, sehingga daftar origin/* tidak pernah jauh tertinggal dari kenyataan. Tanpa konfigurasi itu, pola manual yang lazim: git fetch --prune setiap kali mulai bekerja, dan git remote show origin saat inventarisasi — misalnya pekanan atau sebelum rapat perencanaan, saat daftar cabang dipakai sebagai peta pekerjaan tim. Rincian kedua perintah terdokumentasi di dokumentasi git fetch
dan dokumentasi git remote
.
| Situasi | Perintah tepat | Efek |
|---|---|---|
| Mulai hari kerja, ingin kabar terbaru | git fetch --prune | ambil perkembangan + sapu referensi mati |
| Sekadar curiga ada cabang usang | git remote show origin | diagnosis tanpa mengubah apa pun |
| Sudah tahu yang harus disapu | git remote prune origin | sapuan saja |
| Ingin selalu bersih tanpa kebiasaan | git config fetch.prune true | semua fetch ikut menyapu |
Daftar penunjuk yang bersih menuntaskan urusan cermin. Tapi arus utama kolaborasi belum selesai: sampai titik ini push kita selalu lancar — dan itulah momen paling berbahaya untuk percaya bahwa push selalu begitu. Chapter berikutnya mereproduksi skenario yang paling sering membingungkan pemula: push yang ditolak.