Sepanjang section ini nama origin/main terus muncul di keluaran git status, git fetch, dan git branch -vv — tetapi entitas itu sendiri belum pernah dibedah. Kesalahpahaman paling umum pemula: mengira origin/main adalah jendela live ke remote, selalu menampilkan kondisi terkini. Kenyataannya berbeda: origin/main adalah penunjuk lokal yang hanya bergeser ketika kita menjalankan fetch atau push. Chapter ini membuktikannya dengan dua clone dan satu remote, lalu menjawab pertanyaan penutupnya: boleh tidak kita bekerja langsung di origin/main.
Tiga Penunjuk untuk Satu Nama main #
Kolaborasi kita selalu melibatkan tiga penunjuk bernama main: branch lokal di clone Budi, penunjuk origin/main yang juga hidup di clone Budi, dan branch main yang asli berada di remote. Hubungan ketiganya tergambar begini:
Diagram ini membaca: fetch menyalin posisi branch di remote ke origin/main; merge atau rebase (keduanya dirangkum git pull) membawa isi origin/main turun ke branch lokal; push menggeser branch di remote — dan karenanya juga menyalin kembali posisi barunya ke origin/main milik pengirim. Perhatikan bahwa tidak ada satu pun panah dari remote ke branch lokal: keduanya tidak pernah bersentuhan langsung, origin/main selalu menjadi perantara.
Lab-nya kecil: bare repository proyek-utama.git, Budi meng-clone yang masih kosong, membuat commit pertama, lalu mengirimnya dengan git push -u origin main. Siti meng-clone setelahnya sehingga keduanya sejajar. Siti kemudian memperluas README.md dan mengirim hasilnya:
git pushOutput yang Dihasilkan (di clone siti):
To /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-cermin/proyek-utama.git
bf0d4bd..4371f61 main -> mainRemote kini satu commit di depan Budi. Pertanyaannya: apakah origin/main di clone Budi ikut maju dengan sendirinya?
Cermin yang Tidak Memutakhirkan Sendiri #
Budi belum menjalankan apa pun sejak terakhir bekerja. Dua perintah berikut dijalankan tanpa fetch — dan keduanya boleh mengejutkan:
git statusOutput yang Dihasilkan:
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree cleangit log --oneline origin/mainOutput yang Dihasilkan:
bf0d4bd Buat README tokogit status berkata up to date, dan riwayat origin/main masih berhenti di commit lama — padahal remote sudah maju. Ini bukan bug: status dan origin/main sama-sama membaca catatan lokal, dan catatan itu hanya segar sampai interaksi terakhir Budi dengan remote. Cermin berhenti memantulkan begitu kita berhenti melihatnya. Sekarang Budi menarik kabar:
git fetch originOutput yang Dihasilkan:
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-cermin/proyek-utama
bf0d4bd..4371f61 main -> origin/mainBaris rentang bf0d4bd..4371f61 main -> origin/main mencatat pergeseran si cermin. Bandingkan ketiga penunjuk setelahnya:
git log --oneline origin/mainOutput yang Dihasilkan:
4371f61 Tambah daftar produk
bf0d4bd Buat README tokogit log --oneline mainOutput yang Dihasilkan:
bf0d4bd Buat README tokoorigin/main sudah maju ke posisi remote; main lokal diam di tempat — inilah bukti fetch menggerakkan cermin, bukan pekerjaan kita. Selisih isinya bisa kita telaah tanpa menyentuh branch lokal:
git diff main origin/mainOutput yang Dihasilkan:
diff --git a/README.md b/README.md
index 7fa6a57..a9c3a7e 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,5 @@
# Toko Budi
+
+## Produk
+- kopi
+- gulaDiff ini membandingkan isi README.md pada main terhadap versi di origin/main — persis pemeriksaan yang dianjurkan sebelum memutuskan pull di chapter git fetch
.
Penunjuk yang Hidup di Repository Kita #
Bukti fisiknya cuma satu folder. Seluruh salinan penunjuk tersimpan di dalam .git clone Budi:
ls .git/refs/remotes/originOutput yang Dihasilkan:
mainSatu berkas bernama main — isinya hash commit. Tidak ada koneksi jaringan yang mengawasi berkas itu; hanya fetch dan push yang menulisnya. Nama-nama origin/* sendiri lahir dari aturan refspec pada konfigurasi remote — baris fetch = +refs/heads/*:refs/remotes/origin/* yang kita saksikan di chapter Upstream Branch
— yang memetakan setiap branch di remote ke salinan origin/-nya. Konsep remote-tracking branch dibahas lebih jauh di bab Remote Branches
buku Pro Git.
Bukan Tempat untuk Commit #
Karena origin/main tampak seperti branch biasa di berbagai keluaran, pemula kerap mencoba menempatinya:
git switch origin/mainOutput yang Dihasilkan:
fatal: a branch is expected, got remote branch 'origin/main'
hint: If you want to detach HEAD at the commit, try again with the --detach option.Git menolaknya dengan tegas: penunjuk remote bukan branch lokal yang bisa ditempati. Justru penolakan inilah yang menjaga cermin tetap konsisten — bayangkan bila commit bisa ditanam langsung ke origin/main: salinan lokal dan branch di remote akan berbunyi beda tanpa ada pertukaran data. Bila maksud kita sekadar melihat isi titik itu, --detach adalah pintunya:
git switch --detach origin/mainOutput yang Dihasilkan:
HEAD is now at 4371f61 Tambah daftar produkHEAD kini terlepas dari branch apa pun dan berdiri pada commit cermin — mode detached HEAD. Komit di keadaan ini tidak menempel pada branch mana pun dan mudah tergantung tak berjangkar; cara aman memergoki dan menyelamatkannya dibahas di chapter Menangani Detached HEAD . Kembali ke dunia kerja cukup menyebut nama branch:
git switch mainOutput yang Dihasilkan:
Previous HEAD position was 4371f61 Tambah daftar produk
Switched to branch 'main'
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)Baris behind 'origin/main' by 1 commit menegaskan kembali posisi ketiga penunjuk: main tertinggal satu commit dari cerminnya sendiri, dan Git menawarkan git pull untuk menutup jarak.
Cermin origin/* kini kita pahami utuh: penunjuk lokal, digerakkan fetch dan push, bukan tempat commit. Persoalan rumah tangganya menyusul — apa yang terjadi pada salinan-salinan ini ketika branch di remote dihapus, dan bagaimana menyapunya? Jawabannya di chapter Remote Branch Management
.