Siti menyelesaikan daftar produk toko, sementara git status di clone Budi tetap berkata up to date — status hanya membaca catatan terakhir yang Git ketahui. Pertanyaannya: bagaimana kita melihat perkembangan di titik temu tanpa langsung mengaduk branch lokal? Jawabannya adalah git fetch: perintah yang mengunduh perkembangan remote ke salinan penunjuk origin/main, membiarkan branch lokal dan working tree kita sepenuhnya tak tersentuh. Chapter ini menjalankan demo intinya dengan dua orang dan satu remote, lalu membuktikan sifat itu baris demi baris.

Dua Clone dan Satu Titik Temu #

Panggungnya persis pola chapter Konsep Remote : repository bare proyek-utama.git, Budi meng-clone-nya, membuat commit pertama, dan mengirimkannya dengan git push -u origin main (dibedah tuntas di chapter git push ). Setelah pusat terisi, giliran Siti meng-clone — ketiganya berbagi satu commit awal. Siti kemudian memperbarui README.md dan mengirim hasilnya — di sandbox, identitas Siti disuntik lewat git -c agar satu repo bisa memuat dua penulis:

bash
git -c user.name="Siti Rahma" -c user.email="[email protected]" commit -m "Tambah daftar produk"
git push

Output yang Dihasilkan (di clone siti):

text
To /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-fetch/proyek-utama.git
   2bd3e21..0c691c3  main -> main

Baris 2bd3e21..0c691c3 main -> main memberitahu bahwa main di remote maju dari commit 2bd3e21 ke 0c691c3. Remote kini satu commit di depan Budi — dan Budi belum tahu apa-apa.

Menjalankan fetch dari Sisi Budi #

Budi mengambil perkembangan itu tanpa menyentuh pekerjaannya sendiri:

bash
git fetch origin

Output yang Dihasilkan:

text
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-fetch/proyek-utama
   2bd3e21..0c691c3  main       -> origin/main

Tiga baris ini padat makna. Baris From ... menyebut sumber pengambilan — alamat remote yang tersimpan, ditampilkan tanpa akhiran .git. Baris terakhir memuat arah pembaruan: main -> origin/main berarti penunjuk main di sisi remote telah disalin ke penunjuk origin/main milik Git lokal, dari posisi 2bd3e21 maju ke 0c691c3. Perlu ditegaskan: branch main lokal tidak ada di daftar itu — fetch hanya memutakhirkan salinan penunjuk, itulah sebabnya ia selalu aman dijalankan kapan saja.

Bukti Fetch Tidak Menyentuh Branch Lokal #

Klaim “aman” tadi sebaiknya dibuktikan, bukan dipercaya. Kita bandingkan posisi kedua penunjuk setelah fetch:

bash
git log --oneline main

Output yang Dihasilkan:

text
2bd3e21 Buat README toko
bash
git log --oneline origin/main

Output yang Dihasilkan:

text
0c691c3 Tambah daftar produk
2bd3e21 Buat README toko

Riwayat main lokal masih berhenti di commit lama, sementara origin/main sudah memuat commit Siti — dua penunjuk kini berbeda posisi dalam satu repository. Working tree ikut membuktikan hal yang sama:

bash
cat README.md

Output yang Dihasilkan:

text
# Toko Budi

Isi berkas di meja kerja Budi tetap versi lama — daftar produk Siti belum “turun” ke berkas mana pun. Status merangkum keadaan ini:

bash
git status

Output yang Dihasilkan:

text
On branch main
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean

Baris Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded. adalah laporan perbandingan main terhadap origin/main — sinyal tertinggal satu commit, dan petunjuknya menyebut git pull sebagai jalan memperbaruinya (chapter git pull ). Bentuk peta lengkapnya terlihat dalam satu layar:

bash
git log --oneline --decorate --all

Output yang Dihasilkan:

text
0c691c3 (origin/main) Tambah daftar produk
2bd3e21 (HEAD -> main) Buat README toko

Memeriksa Commit yang Belum Kita Punya #

Fetch menghadiahi kita jendela inspeksi sebelum memutuskan apa pun. Rentang main..origin/main menampilkan commit yang ada di origin/main tetapi belum ada di main — persis “apa yang terlewat”:

bash
git log --oneline main..origin/main

Output yang Dihasilkan:

text
0c691c3 Tambah daftar produk

Satu commit Siti itulah seluruh perbedaan antara kedua penunjuk. Kita bisa menelaahnya dulu dengan git show origin/main, memeriksa berkasnya dengan git diff main origin/main, atau membiarkannya mengendap dulu — semua keputusan ada di tangan kita, bukan di tangan perintah. Inilah filosofi fetch: pisahkan kegiatan mengambil informasi dari kegiatan menggabungkan perubahan.

Ragam Bentuk fetch #

Siti kembali menambah satu commit dan mengirimkannya. Budi kali ini menyebut nama cabang secara eksplisit:

bash
git fetch origin main

Output yang Dihasilkan:

text
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-fetch/proyek-utama
 * branch            main       -> FETCH_HEAD
   0c691c3..db294c6  main       -> origin/main

Dua baris pembaruan muncul: baris * branch main -> FETCH_HEAD menandai bahwa snapshot cabang main juga ditampung ke penunjuk sementara FETCH_HEAD, dan baris rentang main -> origin/main tetap memutakhirkan salinan penunjuk tetapnya. Tanpa nama remote, git fetch polos sudah cukup: ia mengambil dari remote milik upstream branch aktif — pada clone kita, origin. Flag --all memperluas jangkauan ke seluruh remote sekaligus, berguna saat satu repository berhubungan dengan lebih dari satu titik temu (pola dua remote di chapter git remote ):

bash
git fetch --all

Output yang Dihasilkan:

text

Tidak satu baris pun tercetak — semua remote sudah mutakhir pada salinan kita, dan sunyi adalah kabar baiknya. Ragam bentuk fetch lainnya terdokumentasi di dokumentasi git fetch .

Menyapu Penunjuk yang Terbengkalai dengan –prune #

Fase terakhir melibatkan cabang sampingan: Siti membuat branch fitur-banner, menambahkan berkas banner.md, dan mengirimkannya. Ketika Budi melakukan fetch, penunjuk cabang itu lahir sebagai cabang baru karena belum pernah dikenal salinan Budi:

bash
git fetch origin

Output yang Dihasilkan:

text
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-fetch/proyek-utama
 * [new branch]      fitur-banner -> origin/fitur-banner

Penanda * [new branch] menandai kelahiran origin/fitur-banner — bentuk yang sama dengan yang kita temui saat fetch pertama di chapter Menambahkan Remote . Penunjuk itu kini ikut terlihat di daftar cabang sisi remote:

bash
git branch -r

Output yang Dihasilkan:

text
  origin/fitur-banner
  origin/main

Kemudian banner dibatalkan dan Siti menghapus cabang itu dari remote:

bash
git push origin --delete fitur-banner

Output yang Dihasilkan (di clone siti):

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

Penunjuk origin/fitur-banner di sisi Budi kini menunjuk cabang yang sudah tidak ada — fetch biasa tidak menyentuhnya. Flag --prune menyapu bersih penunjuk yang masa cabangnya telah berakhir:

bash
git fetch --prune

Output yang Dihasilkan:

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

Penanda - [deleted] (none) -> origin/fitur-banner mencatat sapuan tersebut. Pengelolaan salinan penunjuk yang lebih penuh — termasuk kapan prune layak dijadikan kebiasaan — dibahas pada chapter Remote Branch Management .

Kapan Cukup fetch, Kapan Perlu pull #

Fetch hanya mengisi salinan penunjuk — kadang itu memang tujuannya, kadang kita butuh branch lokal ikut maju. Tabel berikut memetakan situasi yang paling sering dijumpai:

SituasiPilihan tepatAlasan
Ingin tahu apa yang baru dikirim rekangit fetchinspeksi origin/main dan rentang main..origin/main sudah memadai
Ingin branch aktif sejajar dengan remotegit pullperubahan harus benar-benar digabungkan ke branch lokal
Masih memegang suntingan setengah jadigit fetchfetch tidak menyentuh branch lokal maupun working tree
Ingin memastikan push akan berjalan mulusgit fetchbandingkan posisi main dan origin/main setelah fetch
Skrip/CI membaca riwayat secara otomatisgit fetchbranch aktif tidak boleh bergeser di tengah pekerjaan lain

Baris kedua adalah satu-satunya situasi yang menuntut penggabungan — dan pada Git modern, git pull polos justru menuntut satu keputusan lagi: merge atau rebase.

Fetch mengisi gudang informasi, namun branch main Budi masih tertinggal satu commit. Perintah yang mengambil sekaligus menggabungkan — beserta dua jalan penggabungannya, merge dan rebase — menanti di chapter git pull .