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:
git -c user.name="Siti Rahma" -c user.email="[email protected]" commit -m "Tambah daftar produk"
git pushOutput yang Dihasilkan (di clone siti):
To /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-fetch/proyek-utama.git
2bd3e21..0c691c3 main -> mainBaris 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:
git fetch originOutput yang Dihasilkan:
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-fetch/proyek-utama
2bd3e21..0c691c3 main -> origin/mainTiga 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:
git log --oneline mainOutput yang Dihasilkan:
2bd3e21 Buat README tokogit log --oneline origin/mainOutput yang Dihasilkan:
0c691c3 Tambah daftar produk
2bd3e21 Buat README tokoRiwayat 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:
cat README.mdOutput yang Dihasilkan:
# Toko BudiIsi berkas di meja kerja Budi tetap versi lama — daftar produk Siti belum “turun” ke berkas mana pun. Status merangkum keadaan ini:
git statusOutput yang Dihasilkan:
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 cleanBaris 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:
git log --oneline --decorate --allOutput yang Dihasilkan:
0c691c3 (origin/main) Tambah daftar produk
2bd3e21 (HEAD -> main) Buat README tokoMemeriksa 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”:
git log --oneline main..origin/mainOutput yang Dihasilkan:
0c691c3 Tambah daftar produkSatu 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:
git fetch origin mainOutput yang Dihasilkan:
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/mainDua 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
):
git fetch --allOutput yang Dihasilkan:
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:
git fetch originOutput yang Dihasilkan:
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-fetch/proyek-utama
* [new branch] fitur-banner -> origin/fitur-bannerPenanda * [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:
git branch -rOutput yang Dihasilkan:
origin/fitur-banner
origin/mainKemudian banner dibatalkan dan Siti menghapus cabang itu dari remote:
git push origin --delete fitur-bannerOutput yang Dihasilkan (di clone siti):
To /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-fetch/proyek-utama.git
- [deleted] fitur-bannerPenunjuk 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:
git fetch --pruneOutput yang Dihasilkan:
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-a/latihan-fetch/proyek-utama
- [deleted] (none) -> origin/fitur-bannerPenanda - [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:
| Situasi | Pilihan tepat | Alasan |
|---|---|---|
| Ingin tahu apa yang baru dikirim rekan | git fetch | inspeksi origin/main dan rentang main..origin/main sudah memadai |
| Ingin branch aktif sejajar dengan remote | git pull | perubahan harus benar-benar digabungkan ke branch lokal |
| Masih memegang suntingan setengah jadi | git fetch | fetch tidak menyentuh branch lokal maupun working tree |
| Ingin memastikan push akan berjalan mulus | git fetch | bandingkan posisi main dan origin/main setelah fetch |
| Skrip/CI membaca riwayat secara otomatis | git fetch | branch 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
.