Perintah git fetch mengunduh commit dan referensi baru dari remote tanpa mengubah pekerjaan yang sedang berjalan. Hasil unduhannya diletakkan pada branch pelacak remote, sehingga isi remote dapat diperiksa dan diputuskan dengan tenang sebelum disatukan. Topik ini membahas perilaku fetch, cara meninjau commit yang baru tiba, dan perbedaannya dengan git pull yang langsung menyatukan.
Fetch mengunduh tanpa menyatukan#
Fetch memperbarui dua hal saja, yaitu objek commit dari remote dan penunjuk branch pelacak seperti origin/main. Working directory, staging area, dan branch lokal tidak disentuh sama sekali, sehingga perintah ini aman dijalankan kapan saja, termasuk di tengah pekerjaan yang belum selesai. Sifat inilah yang membuat fetch menjadi kebiasaan pagi hari yang sehat: lihat dulu apa yang terjadi di remote, baru putuskan.
Lanjutkan skenario topik Push pada keadaan yang lebih sederhana. Budi mengirim satu commit ke pusat, Citra mengambil salinannya, menambah commit, lalu mengirim. Sisi Budi tidak tahu apa-apa sampai fetch dijalankan.
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"rm -rf /tmp/lab-pusat.git /tmp/lab-budi /tmp/lab-citra
git init --bare /tmp/lab-pusat.git
git init -b main /tmp/lab-budi
cd /tmp/lab-budi
git config user.name "Budi"
git config user.email "[email protected]"
printf "Panduan proyek.\n" > panduan.md
git add panduan.md
git commit -m "Panduan proyek"
git remote add origin /tmp/lab-pusat.git
git push -u origin main
cd /tmp
git clone -q lab-pusat.git lab-citra
cd lab-citra
git config user.name "Citra"
git config user.email "[email protected]"
printf "Panduan proyek.\nBab rilis.\n" > panduan.md
git commit -am "Tambah bab rilis"
git push -q
cd /tmp/lab-budi
git fetchhint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /tmp/lab-pusat.git/
Initialized empty Git repository in /tmp/lab-budi/.git/
[main (root-commit) f4ac75f] Panduan proyek
1 file changed, 1 insertion(+)
create mode 100644 panduan.md
To /tmp/lab-pusat.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
warning: remote HEAD refers to nonexistent ref, unable to checkout
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
panduan.md
nothing added to commit but untracked files present (use "git add" to track)
error: src refspec refs/heads/master does not match any
error: failed to push some refs to '/tmp/lab-pusat.git'Keluaran fetch merangkum pergerakan origin/main dari commit lama ke commit baru, dan tidak ada baris yang menyebut perubahan berkas lokal karena memang tidak ada yang diubah. Apabila remote tidak memiliki yang baru, keluaran fetch kosong, dan itu punya makna yang sama, yaitu kondisi lokal selaras dengan informasi terbaru.
Meninjau commit yang baru tiba#
Commit yang diunduh dapat ditinjau sebelum disatukan, dan notasi dua titik kembali berperan di sini dengan origin/main sebagai salah satu sisinya.
git status
git log --oneline main..origin/mainOn branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree cleanStatus menyatakan branch lokal berada di belakang satu commit dan menyebut bahwa perbedaannya masih dapat diselesaikan dengan fast-forward, sedangkan log menampilkan commit yang baru tiba. Isi perubahannya dapat dibaca dengan git diff main origin/main atau git show 7c9e1a3 tanpa menyentuh pekerjaan lokal sama sekali.
Penyatuan dilakukan setelah peninjauan, dan keadaan di atas memenuhi syarat fast-forward sehingga caranya paling ringkas adalah git merge --ff-only origin/main, yang menolak apabila ternyata riwayat lokal sudah bergerak sendiri.
git merge --ff-only origin/main
git statusAlready up to date.
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree cleanFetch dan pull dalam satu tabel#
Perbedaan keduanya sering dianggap rumit, padahal definisinya lurus: git pull adalah git fetch diikuti penyatuan. Pilihan di antara keduanya adalah pilihan waktu penyatuan.
| Aspek | git fetch | git pull |
|---|---|---|
| Mengunduh commit remote | ya | ya |
| Menyatukan ke branch lokal | tidak | ya, dengan merge atau rebase |
| Mengubah working directory | tidak | ya |
| Risiko pada pekerjaan yang menggantung | tidak ada | perpindahan bisa ditolak |
| Waktu yang tepat | meninjau dulu | ketika keputusan sudah jelas |
Kebiasaan yang seimbang adalah fetch teratur dan pull yang sadar: fetch kapan pun untuk tetap terinformasi, dan pull saat benar-benar siap menyatukan, setelah isi commit remote dipahami. Bagi yang ingin satu langkah, konfigurasi perilaku pull dapat diatur agar selalu rebase atau selalu merge, dan pembahasannya ada pada topik tentang pull.
Ringkasan#
git fetchmengunduh commit dan memperbarui branch pelacak remote tanpa menyentuh pekerjaan lokal.- Commit yang baru tiba ditinjau melalui
git log main..origin/maindangit diff main origin/mainsebelum disatukan. git merge --ff-only origin/mainmenyatukan dengan aman ketika selisihnya masih dapat fast-forward.git pulladalah fetch diikuti penyatuan, sehingga pilihan di antara keduanya adalah pilihan kapan penyatuan dilakukan.
Referensi#
- git-fetch — Git Documentation — rujukan perilaku fetch dan bentuk keluarannya.
- Git Basics - Working with Remotes — Pro Git — bagian Fetching and Pulling pada Pro Git.