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:
git push -u origin fiturOutput yang Dihasilkan (di clone siti):
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:
git fetch originOutput yang Dihasilkan:
From /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-tracking/proyek-utama
* [new branch] fitur -> origin/fiturDaftar cabang sisi remote kini memuat nama itu:
git branch -rOutput yang Dihasilkan:
origin/HEAD -> origin/main
origin/fitur
origin/mainTiga 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:
git switch fiturOutput yang Dihasilkan:
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:
git branch -vvOutput yang Dihasilkan:
* fitur 2403817 [origin/fitur] Tambah halaman diskon
main 62362be [origin/main] Tambah daftar produkKedua branch lokal kini berupstream. Budi bekerja seperti biasa — memperluas isi diskon.md, commit, lalu memeriksa keadaan:
git statusOutput yang Dihasilkan:
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 cleangit status membandingkan fitur terhadap origin/fitur tanpa diminta — dan push polos pun hidup:
git pushOutput yang Dihasilkan:
To /home/z/my-project/tutorial-extracted/work/sandbox/remote-repository/part-b/latihan-tracking/proyek-utama.git
2403817..f6c094b fitur -> fiturCabang 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:
git switch -c diskon --no-track origin/fiturOutput yang Dihasilkan:
Switched to a new branch 'diskon'Perhatikan apa yang tidak tercetak: tidak ada baris set up to track. Konsekuensinya terbaca langsung:
git branch -vvOutput yang Dihasilkan:
* diskon f6c094b Perluas halaman diskon
fitur f6c094b [origin/fitur] Perluas halaman diskon
main 62362be [origin/main] Tambah daftar produkBaris 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>:
git branch --set-upstream-to=origin/fitur diskonOutput yang Dihasilkan:
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:
git branch -vvOutput yang Dihasilkan:
* diskon f6c094b [origin/fitur] Perluas halaman diskon
fitur f6c094b [origin/fitur] Perluas halaman diskon
main 62362be [origin/main] Tambah daftar produkMemutus 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:
git branch --unset-upstream mainOutput yang Dihasilkan:
Bukti cabutnya terbaca dari git branch -vv:
git branch -vvOutput yang Dihasilkan:
* diskon f6c094b [origin/fitur] Perluas halaman diskon
fitur f6c094b [origin/fitur] Perluas halaman diskon
main 62362be Tambah daftar produkBaris main kehilangan kurung sikunya, sementara diskon dan fitur tetap terikat. Pemasangan kembali memakai bentuk eksplisit paling kanonik:
git branch --set-upstream-to=origin/main mainOutput yang Dihasilkan:
branch 'main' set up to track 'origin/main'.git branch -vvOutput yang Dihasilkan:
* diskon f6c094b [origin/fitur] Perluas halaman diskon
fitur f6c094b [origin/fitur] Perluas halaman diskon
main 62362be [origin/main] Tambah daftar produkPeta Lengkap Cara Mengatur Pelacakan #
Seluruh pintu yang kita lewati sepanjang section ini dirangkum dalam satu tabel:
| Pintu | Perintah | Kapan 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 fitur | DWIM: buat lokal + tracking | branch ada di remote, belum ada lokal |
git switch -c diskon origin/fitur | buat lokal dari remote, dengan tracking | ingin nama lokal berbeda |
git switch -c diskon --no-track origin/fitur | tanpa tracking | sengaja bebas dari ikatan |
git branch --set-upstream-to=origin/fitur diskon | pasang atau alihkan mitra | kapan saja, termasuk mengubah mitra lama |
git branch --unset-upstream | putus ikatan | melepas 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.