Chapter Upstream Branch membedah ikatan antara branch lokal dan cabang remotenya; satu pertanyaan praktis masih menggantung: lewat pintu apa saja ikatan itu terpasang? git clone hanya memasangnya untuk branch awal — cabang fitur lain yang lahir di remote tidak punya salinan lokal, dan push eksplisit saja tidak cukup membuat branch lokal bermitra. Chapter ini memetakan seluruh pintu pelacakan: dari yang otomatis penuh, yang sengaja dinonaktifkan, sampai pemasangan eksplisit lewat git branch --set-upstream-to.

Cabang Remote yang Belum Kita Pegang #

Lab kita memakai pola yang sudah akrab: bare repository proyek-utama.git sebagai titik temu, lalu dua clone — Budi dan Siti. Sebuah clone penyemai mengisi main dengan dua commit lalu dihapus, sehingga kedua clone Budi dan Siti mulai dari titik yang sama. Siti kemudian membuat branch fitur, menambahkan berkas diskon.md, dan mengirimkannya:

bash
git push -u origin fitur

Output yang Dihasilkan (di clone siti):

text
To /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-tracking/proyek-utama.git
 * [new branch]      fitur -> fitur
branch 'fitur' set up to track 'origin/fitur'.

Alamat pada keluaran adalah jalur sandbox di mesin pengujian — di komputer lain menyesuaikan lokasi direktori masing-masing, dan hash yang muncul sepanjang chapter ini juga akan berbeda karena bergantung pada isi dan waktu commit. Baris * [new branch] mengabarkan kelahiran fitur di remote. Budi belum memiliki apa pun dari itu — clone-nya hanya mengenal main. Satu git fetch origin memperkenalkan cabang baru itu kepada salinan Budi:

bash
git fetch origin

Output yang Dihasilkan:

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

Daftar cabang sisi remote kini memuat nama itu:

bash
git branch -r

Output yang Dihasilkan:

text
  origin/HEAD -> origin/main
  origin/fitur
  origin/main

Tiga baris, tiga makna. origin/fitur dan origin/main adalah salinan penunjuk hasil fetch; origin/HEAD -> origin/main menandai cabang default yang ditunjuk remote — penanda ini ikut disalin git clone dan hanya itu yang didapatnya, bukan salinan lokal fitur. Mengedit di clone Budi tetap mustahil sampai ada branch lokal yang menampungnya.

Berpindah ke Branch Remote dengan Otomatisasi DWIM #

Cara paling natural: menyebut nama fitur kepada git switch:

bash
git switch fitur

Output yang Dihasilkan:

text
branch 'fitur' set up to track 'origin/fitur'.
Switched to a new branch 'fitur'

Dua baris itu adalah hasil pola yang disebut DWIM (do what I mean): Budi tidak punya branch lokal bernama fitur, tetapi origin/fitur ada, jadi Git membuat branch lokal fitur pada commit yang sama, langsung memasang pelacakan ke origin/fitur, lalu berpindah ke sana. Baris branch 'fitur' set up to track 'origin/fitur'. persis kalimat yang dulu dicetak git push -u di chapter git push — pintu berbeda, ikatan yang sama. Bukti lengkapnya:

bash
git branch -vv

Output yang Dihasilkan:

text
* fitur 2403817 [origin/fitur] Tambah halaman diskon
  main  62362be [origin/main] Tambah daftar produk

Kedua branch lokal kini berupstream. Budi bekerja seperti biasa — memperluas isi diskon.md, commit, lalu memeriksa keadaan:

bash
git status

Output yang Dihasilkan:

text
On branch fitur
Your branch is ahead of 'origin/fitur' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

git status membandingkan fitur terhadap origin/fitur tanpa diminta — dan push polos pun hidup:

bash
git push

Output yang Dihasilkan:

text
To /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-tracking/proyek-utama.git
   2403817..f6c094b  fitur -> fitur

Cabang Lokal Bernama Beda tanpa Pelacakan #

Kadang kita ingin branch lokal bernama lain dari cabang remotenya — misalnya menyingkat nama panjang, atau menampung dua variasi dari satu cabang remote. Sisi fitur boleh disalin ke branch lokal diskon tanpa ikatan, dengan flag --no-track:

bash
git switch -c diskon --no-track origin/fitur

Output yang Dihasilkan:

text
Switched to a new branch 'diskon'

Perhatikan apa yang tidak tercetak: tidak ada baris set up to track. Konsekuensinya terbaca langsung:

bash
git branch -vv

Output yang Dihasilkan:

text
* diskon f6c094b Perluas halaman diskon
  fitur  f6c094b [origin/fitur] Perluas halaman diskon
  main   62362be [origin/main] Tambah daftar produk

Baris diskon berdiri tanpa tanda kurung siku — git status tidak tahu membandingkannya dengan apa, git pull dan git push polos akan menolak menebak, persis penolakan yang kita lihat di chapter Upstream Branch . Tanpa --no-track, perintah git switch -c diskon origin/fitur justru memasang pelacakan secara otomatis.

Memasang Mitra Secara Eksplisit dengan –set-upstream-to #

Pintu terakhir sekaligus paling serbaguna: pasang ikatan kapan pun, atas nama branch mana pun, dengan git branch --set-upstream-to=<remote>/<cabang> <branch-lokal>:

bash
git branch --set-upstream-to=origin/fitur diskon

Output yang Dihasilkan:

text
branch 'diskon' set up to track 'origin/fitur'.

Nama lokal dan nama remote boleh berbeda — Git tidak mensyaratkan kembar, dan bentuk umum git branch --set-upstream-to=origin/main main bekerja dengan kalimat konfirmasi yang sama. Perintah ini juga jalan untuk mengalihkan mitra: branch yang sudah berupstream boleh diarahkan ke cabang remote lain, berguna saat cabang di remote di-rename. Bukti pemasangannya:

bash
git branch -vv

Output yang Dihasilkan:

text
* diskon f6c094b [origin/fitur] Perluas halaman diskon
  fitur  f6c094b [origin/fitur] Perluas halaman diskon
  main   62362be [origin/main] Tambah daftar produk

Memutus dan Memasang Kembali #

Sisi kebalikannya sudah kita coba di chapter Upstream Branch ; di sini kita ulangi bentuknya pada main dalam dua perintah. git branch --unset-upstream mencabut mitra branch yang disebut — keluarannya sunyi:

bash
git branch --unset-upstream main

Output yang Dihasilkan:

text

Bukti cabutnya terbaca dari git branch -vv:

bash
git branch -vv

Output yang Dihasilkan:

text
* diskon f6c094b [origin/fitur] Perluas halaman diskon
  fitur  f6c094b [origin/fitur] Perluas halaman diskon
  main   62362be Tambah daftar produk

Baris main kehilangan kurung sikunya, sementara diskon dan fitur tetap terikat. Pemasangan kembali memakai bentuk eksplisit paling kanonik:

bash
git branch --set-upstream-to=origin/main main

Output yang Dihasilkan:

text
branch 'main' set up to track 'origin/main'.
bash
git branch -vv

Output yang Dihasilkan:

text
* diskon f6c094b [origin/fitur] Perluas halaman diskon
  fitur  f6c094b [origin/fitur] Perluas halaman diskon
  main   62362be [origin/main] Tambah daftar produk

Peta Lengkap Cara Mengatur Pelacakan #

Seluruh pintu yang kita lewati sepanjang section ini dirangkum dalam satu tabel:

PintuPerintahKapan dipakai
git clone(otomatis untuk branch awal)menggandakan repository baru
git push -u origin main(otomatis saat push pertama)branch lokal belum ada di remote
git push --set-upstream origin fitur(otomatis saat push ditolak)push polos ditolak karena tanpa upstream
git switch fiturDWIM: buat lokal + trackingbranch ada di remote, belum ada lokal
git switch -c diskon origin/fiturbuat lokal dari remote, dengan trackingingin nama lokal berbeda
git switch -c diskon --no-track origin/fiturtanpa trackingsengaja bebas dari ikatan
git branch --set-upstream-to=origin/fitur diskonpasang atau alihkan mitrakapan saja, termasuk mengubah mitra lama
git branch --unset-upstreamputus ikatanmelepas ikatan yang tak lagi relevan

Rincian tiap bentuk terdokumentasi di dokumentasi git branch dan dokumentasi git switch .

Dengan tabel ini, ikatan branch lokal ke cabang remote sudah sepenuhnya dalam kendali kita. Namun seluruh tabel itu menyebut satu entitas yang belum pernah dibedah tuntas: origin/fitur sendiri — apakah cerminnya selalu segar, kapan bergerak, dan boleh tidak kita commit langsung ke sana? Chapter berikutnya mengangkat entitas itu ke meja pembedah.