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:

bash
git fetch origin

Output yang Dihasilkan:

text
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/fitur
bash
git branch -r

Output yang Dihasilkan:

text
  origin/HEAD -> origin/main
  origin/banner
  origin/fitur
  origin/main

Baris 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:

bash
git push origin --delete banner

Output yang Dihasilkan (di clone siti):

text
To /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-prune/proyek-utama.git
 - [deleted]         banner

Penghapusan 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:

bash
git fetch origin

Output yang Dihasilkan:

text

Tidak ada satu baris pun — tidak ada perkembangan baru untuk diambil. Sunyi bukan berarti bersih:

bash
git branch -r

Output yang Dihasilkan:

text
  origin/HEAD -> origin/main
  origin/banner
  origin/fitur
  origin/main

origin/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:

bash
git remote show origin

Output yang Dihasilkan:

text
* 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:

bash
git remote prune origin

Output yang Dihasilkan:

text
Pruning origin
URL: /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-prune/proyek-utama.git
 * [pruned] origin/banner

git 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:

bash
git branch -r

Output yang Dihasilkan:

text
  origin/HEAD -> origin/main
  origin/fitur
  origin/main

Menyapu 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:

bash
git fetch --prune

Output yang Dihasilkan:

text
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-prune/proyek-utama
 - [deleted]         (none)     -> origin/fitur

Flag --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:

bash
git branch -r

Output yang Dihasilkan:

text
  origin/HEAD -> origin/main
  origin/main

Kedua 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:

bash
git branch -vv

Output yang Dihasilkan (di clone siti):

text
* banner b4522c1 [origin/banner: gone] Tambah banner promo
  fitur  bf2d88e [origin/fitur: gone] Tambah halaman promo
  main   bf0d4bd [origin/main] Buat README toko

Anotasi [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:

bash
git config fetch.prune true

Konfigurasi 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 .

SituasiPerintah tepatEfek
Mulai hari kerja, ingin kabar terbarugit fetch --pruneambil perkembangan + sapu referensi mati
Sekadar curiga ada cabang usanggit remote show origindiagnosis tanpa mengubah apa pun
Sudah tahu yang harus disapugit remote prune originsapuan saja
Ingin selalu bersih tanpa kebiasaangit config fetch.prune truesemua 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.