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:

bash
git push

Output yang Dihasilkan (di clone siti):

text
To /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-cermin/proyek-utama.git
   bf0d4bd..4371f61  main -> main

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

bash
git status

Output yang Dihasilkan:

text
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
bash
git log --oneline origin/main

Output yang Dihasilkan:

text
bf0d4bd Buat README toko

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

bash
git fetch origin

Output yang Dihasilkan:

text
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-cermin/proyek-utama
   bf0d4bd..4371f61  main       -> origin/main

Baris rentang bf0d4bd..4371f61 main -> origin/main mencatat pergeseran si cermin. Bandingkan ketiga penunjuk setelahnya:

bash
git log --oneline origin/main

Output yang Dihasilkan:

text
4371f61 Tambah daftar produk
bf0d4bd Buat README toko
bash
git log --oneline main

Output yang Dihasilkan:

text
bf0d4bd Buat README toko

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

bash
git diff main origin/main

Output yang Dihasilkan:

text
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
+- gula

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

bash
ls .git/refs/remotes/origin

Output yang Dihasilkan:

text
main

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

bash
git switch origin/main

Output yang Dihasilkan:

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

bash
git switch --detach origin/main

Output yang Dihasilkan:

text
HEAD is now at 4371f61 Tambah daftar produk

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

bash
git switch main

Output yang Dihasilkan:

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