Buat cabang Git yang ada melacak cabang jarak jauh?

3535

Saya tahu cara membuat cabang baru yang melacak cabang jarak jauh, tetapi bagaimana cara membuat cabang yang ada melacak cabang jarak jauh?

Saya tahu saya bisa mengedit .git/configfile, tetapi tampaknya harus ada cara yang lebih mudah.

Pat Notz
sumber
26
Seperti disebutkan di bawah, untuk cabang yang ada, Anda dapat menggunakan git push -u origin branch-name.
Zags
3
Jika cabang lokal adalah cabang saat ini, dan cabang lokal belum melacak jarak jauh, git pullakan sering memberikan pesan bermanfaat tentang perintah yang tepat untuk mengatur informasi pelacakan
billrichards
57
Sangat menjengkelkan ketika seseorang sedang belajar git untuk ditampilkan tautan ke dokumentasi git. Dokumentasi itu tampaknya ditulis untuk orang-orang yang sudah tahu apa yang mereka lakukan dengan git.
Felipe Alvarez
9
pada Git 2.10 pertama Anda harus checkout ke cabang lokal yang dimaksud dan kemudian melakukan inigit branch --set-upstream-to origin/<branch>
Mahdi Javaheri
2
--set-upstreammenghasilkan kesalahan: fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead.begitu git branch --set-upstream-to origin/<branch name>juga perintah saat ini yang berfungsi.
Super Jade

Jawaban:

4270

Diberikan cabang foodan remote upstream:

Pada Git 1.8.0:

git branch -u upstream/foo

Atau, jika cabang lokal foobukan cabang saat ini:

git branch -u upstream/foo foo

Atau, jika Anda ingin mengetikkan perintah yang lebih panjang, ini sama dengan dua di atas:

git branch --set-upstream-to=upstream/foo

git branch --set-upstream-to=upstream/foo foo

Pada Git 1.7.0:

git branch --set-upstream foo upstream/foo

Catatan:

  • Semua perintah di atas akan menyebabkan cabang lokal foountuk melacak cabang foojarak jauh dari jarak jauh upstream.
  • Sintaksis lama (1.7.x) ditinggalkan karena sintaksis baru (1.8+). Sintaks baru ini dimaksudkan untuk menjadi lebih intuitif dan lebih mudah diingat.
  • Mendefinisikan cabang upstream akan gagal ketika dijalankan terhadap remote yang baru dibuat yang belum diambil. Dalam hal ini, jalankan git fetch upstreamsebelumnya.

Lihat juga: Mengapa saya harus melakukan `--set-upstream` sepanjang waktu?

Dan Moulding
sumber
124
Apakah "hulu" nama remote? yaitu apa yang kebanyakan akan memanggil "asal" secara default?
Andrew Vit
172
@Andrew: Ya. git branch --set-upstream master origin/masterakan sama dengan apa yang secara otomatis dilakukan ketika Anda mengkloning repositori.
Dan Moulding
62
Pada catatan yang terkait, menambahkan ini ke gitconfig Anda luar biasa: "[push] default = pelacakan" ini akan membuatnya sehingga dorongan akan masuk ke tempat yang sama dengan yang menarik berasal dari :)
jpswain
61
Saya mendapatkan "fatal: Bukan nama objek yang valid: 'asal / master'."
joachim
84
git push -u origin foo via
Cotton
236

Anda dapat melakukan hal berikut (dengan asumsi Anda diperiksa pada master dan ingin mendorong ke master cabang jarak jauh):

Atur 'jarak jauh' jika Anda belum memilikinya

git remote add origin ssh://...

Sekarang konfigurasikan master untuk diketahui untuk dilacak:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Dan dorong:

git push origin master
Paul Hedderly
sumber
itu benar-benar diperlukan remote dan cabang di dorong? Maksud saya, Anda hanya memerlukannya jika cabang yang Anda periksa bukan yang ingin Anda tekan, bukan?
Doppelganger
5
Ya - tetapi dari memori Anda mungkin harus eksplisit untuk dorongan pertama. Tentu saja dapat dengan mudah diuji ... :)
Paul Hedderly
+1 Ini adalah jawaban untuk pengguna Windows yang terjebak dengan "pratinjau" msysgit yaitu pra 1.8. Terima kasih untuk itu.
John
3
Ini satu-satunya jawaban yang berhasil untuk saya. Ketika saya mencoba jawaban yang diterima, untuk mengatur remote hulu untuk cabang yang ada, saya punya: error: the requested upstream branch 'upstream/master' does not exist.
Steve K
4
@ SeveK itu kemungkinan besar karena hulu Anda dipanggil origindan tidak upstream.
umläute
160

Saya melakukan ini sebagai efek samping dari mendorong dengan -uopsi seperti pada

$ git push -u origin branch-name

Opsi panjang yang setara adalah --set-upstream.

The git-branchperintah juga mengerti --set-upstream, namun penggunaannya dapat membingungkan. Versi 1.8.0 memodifikasi antarmuka.

git branch --set-upstreamsudah usang dan dapat dihapus dalam waktu yang relatif jauh. git branch [-u|--set-upstream-to]telah diperkenalkan dengan urutan argumen yang lebih waras.

...

Memang tergoda untuk mengatakan git branch --set-upstream origin/master, tapi itu memberitahu Git untuk mengatur cabang "asal / master" lokal untuk berintegrasi dengan cabang yang saat ini diperiksa, yang sangat tidak mungkin apa yang dimaksud pengguna. Opsi ini sudah tidak digunakan lagi; gunakan opsi baru --set-upstream-to(dengan pendek dan manis -u) sebagai gantinya.

Katakanlah Anda memiliki foocabang lokal dan ingin ia memperlakukan cabang dengan nama yang sama dengan hulu. Wujudkan ini dengan

$ git branch foo
$ git branch --set-upstream-to=origin/foo

atau hanya

$ git branch --set-upstream-to=origin/foo foo
Greg Bacon
sumber
1
Ini adalah solusi yang jauh lebih baik
Nils_e
--set-upstream-to=...hanya apa yang saya cari.
Richard
54

Anda mungkin menemukan git_remote_branchalat ini berguna. Ini menawarkan perintah sederhana untuk membuat, menerbitkan, menghapus, melacak & mengubah nama cabang jarak jauh. Salah satu fitur yang bagus adalah Anda dapat meminta grbperintah untuk menjelaskan perintah git apa yang akan dijalankannya.

grb explain create my_branch github
# git_remote_branch version 0.3.0

# List of operations to do to create a new remote branch and track it locally:
git push github master:refs/heads/my_branch
git fetch github
git branch --track my_branch github/my_branch
git checkout my_branch
James Mead
sumber
3
grb adalah permata ruby ​​yang dapat diakses seperti yang dijelaskan pada github mereka
mcabrams
6
OP mengajukan pertanyaan tentang Git sendiri. Jadi jangan memperkenalkan alat baru mungkin akan lebih baik.
zeekvfu
grb adalah alias untuk git-rebase pada instalasi macOS saya. Saya tidak melakukan ini :)
Ben Sinclair
53

Sebenarnya untuk jawaban yang diterima untuk bekerja:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa
landak
sumber
Cabang lokal sudah melacak cabang, jadi kita dapat mengasumsikan repo jarak jauh sudah ditambahkan.
Doppelganger
Dopplerganger: Lihat komentar joachim untuk jawaban yang diterima. Pokoknya asumsi mudah berbeda - itu yang membuat semuanya jadi menarik;)
Hedgehog
44

Saya percaya bahwa pada awal Git 1.5.x Anda bisa membuat cabang lokal $BRANCHmelacak cabang terpencil origin/$BRANCH, seperti ini.

Mengingat itu $BRANCHdan origin/$BRANCHada, dan saat ini Anda belum check-out $BRANCH(beralih jika sudah), lakukan:

git branch -f --track $BRANCH origin/$BRANCH

Ini dibuat ulang $BRANCHsebagai cabang pelacakan. The -fkekuatan penciptaan meskipun $BRANCHada sudah. --trackopsional jika standar yang biasa ada (yaitu, parameter git-config branch.autosetupmergebenar).

Catatan, jika origin/$BRANCHbelum ada, Anda dapat membuatnya dengan mendorong lokal Anda $BRANCHke repositori jarak jauh dengan:

git push origin $BRANCH

Diikuti oleh perintah sebelumnya untuk mempromosikan cabang lokal menjadi cabang pelacakan.

wu-lee
sumber
1
git push origin $BRANCHadalah apa yang saya cari.
Pengguna
Setelah mencoba segala macam solusi, termasuk menyiapkan upstream seperti dijelaskan di atas tidak ada yang berhasil. Yang ingin saya lakukan adalah menarik 1 komit baru ke cabang lokal saya dari yang jauh dan saya tidak mengatur pelacakan pada awalnya. Perintah git branch -f --track $BRANCH origin/$BRANCHmelakukan trik.
DemitryT
38

1- memperbarui meta-data lokal Anda menggunakan: git fetch --all

masukkan deskripsi gambar di sini

2- tunjukkan cabang jarak jauh dan lokal Anda menggunakan: git branch -a , lihat Screenshot berikut

masukkan deskripsi gambar di sini

3 - beralih ke cabang target, yang ingin Anda tautkan dengan remote: using

git checkout branchName

contoh:

masukkan deskripsi gambar di sini

4- Tautkan cabang lokal Anda ke cabang jarak jauh menggunakan:

cabang git --set-upstream-ke nameOfRemoteBranch

NB: nameOfRemoteBranch : untuk menyalin dari output langkah 2 "git branch -r"

Contoh penggunaan:

masukkan deskripsi gambar di sini

Monsif EL AISSOUSSI
sumber
1
Jawabannya paling mudah dan sederhana.
vibs2006
25

Pastikan Anda menjalankan:

git config push.default tracking

untuk dapat mendorong masalah gratis

romanlv
sumber
1
Ini bisa nyaman. Kami dapat mencatat, bagaimanapun, bahwa menurut git-config(1)halaman buku panduan, trackingadalah sinonim dari upstream.
FooF
23

Mengedit .git/configmungkin cara termudah dan tercepat. Lagi pula, itulah yang dilakukan perintah Git untuk menangani cabang jarak jauh.

Jika Anda tidak ingin mengotori file dengan tangan (dan itu tidak sulit untuk dilakukan), Anda selalu dapat menggunakannya git configuntuk melakukannya ... tapi sekali lagi, itu hanya akan mengedit .git/configfile.

Tentu saja ada cara untuk secara otomatis melacak cabang jarak jauh ketika menggunakan git checkout(dengan melewati --trackflag, misalnya), tetapi perintah ini bekerja dengan cabang baru , bukan yang sudah ada.

mipadi
sumber
18

Singkatnya

git branch --set-upstream yourLocalBranchName origin/develop

Ini akan membuat yourLocalBranchNametrek Anda disebut cabang jarak jauh develop.

MadNik
sumber
1
@Quincy Periksa jawaban greg - gunakan git push -u origin branch(atau --set-upstream-to) sebagai gantinya
Tobias Kienzler
@ MadNik, apa perbedaan antara --set-upstreamdan --track? Saya tidak begitu mengerti mengapa saya harus menggunakan salah satunya.
Acumenus
15

Untuk 1.6.x, itu bisa dilakukan menggunakan alat git_remote_branch :

grb track foo upstream

Itu akan menyebabkan Git membuat footrek upstream/foo.

wik
sumber
12

Saya menggunakan perintah berikut (Misalkan nama cabang lokal Anda adalah "branch-name-local" dan nama cabang jarak jauh adalah "branch-name-remote"):

$ git branch --set-upstream-to=origin/branch-name-remote branch-name-local

Jika cabang lokal dan jauh memiliki nama yang sama, maka lakukan saja hal berikut:

$ git branch --set-upstream-to=origin/branch-name branch-name
yrazlik
sumber
Anda membalikkan "nama cabang" dan "asal / nama cabang" di baris perintah. Hulu datang sebelum lokal.
maharvey67
@ Maharvey67 kamu benar, terima kasih. Diedit jawabannya.
yrazlik
Ini emas, terima kasih, juga karena tidak ada opsi dalam jawaban yang diterima yang ok ketika Anda memiliki garis miring dalam nama cabang
JBoy
8

Di sini, menggunakan githubdan git version 2.1.4, lakukan saja:

$ git clone [email protected]:user/repo.git

Dan remote datang oleh itelsef, bahkan jika tidak ditautkan secara lokal:

$ git remote show origin

* remote origin
  Fetch URL: [email protected]:user/repo.git
  Push  URL: [email protected]:user/repo.git
  HEAD branch: master
  Remote branches:
    develop tracked         <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    master  tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Tapi tentu saja, masih belum ada cabang lokal:

$ git branch
* master                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Lihat? Sekarang jika Anda hanya checkout develp, itu akan melakukan keajaiban secara otomatis:

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'

Begitu mudah!


Ringkasan. Jalankan saja 2 perintah ini:

$ git clone [email protected]:user/repo.git
$ git checkout develop
Dr Beco
sumber
1
Contoh yang sangat baik dari use case identik saya. Meskipun tidak ada tanda-tanda cabang 'berkembang' lokal, ketika saya memeriksa cabang 'mengembangkan' cabang itu muncul dan secara ajaib diatur untuk melacak cabang 'berkembang' dari daerah asal. Saya menghargai contoh dan penjelasan langkah demi langkah!
ElliotPsyIT
8

Gunakan Opsi '--track'

  • Setelah git pull:

    git checkout --track <remote-branch-name>

  • Atau:

    git fetch && git checkout <branch-name>

Loukan ElKadi
sumber
7

Untuk membuat cabang baru, kita bisa menggunakan perintah berikut

 git checkout --track -b contoh asal / contoh 
Untuk cabang yang sudah dibuat untuk membuat tautan antara jarak jauh kemudian dari cabang itu gunakan perintah di bawah ini

 git branch -u origin / remote-branch-name

jithu reddy
sumber
5

Ini bukan jawaban langsung untuk pertanyaan ini, tetapi saya ingin meninggalkan catatan di sini untuk siapa saja yang mungkin memiliki masalah yang sama dengan saya ketika mencoba mengkonfigurasi cabang hulu.

Berhati-hatilah terhadap push.default .

Dengan versi git yang lebih lama, default-nya cocok , yang akan menyebabkan perilaku yang sangat tidak diinginkan jika Anda miliki, misalnya:

Pelacakan "master" cabang lokal ke asal / master

Cabang terpencil "upstream" pelacakan ke hulu / master

Jika Anda mencoba "git push" ketika berada di cabang "upstream", dengan pencocokan push.default git secara otomatis akan mencoba menggabungkan "master" cabang lokal menjadi "upstream / master", menyebabkan banyak kekacauan.

Ini memberi lebih banyak perilaku waras:

git config --global push.default hulu

Tom Mettam
sumber
Anda tidak meninggalkan ini dengan sia-sia. Terima kasih.
stefgosselin
4

Dengan cara yang agak terkait saya mencoba menambahkan cabang pelacakan jarak jauh ke cabang yang ada, tetapi tidak memiliki akses ke repositori jarak jauh pada sistem di mana saya ingin menambahkan cabang pelacakan jarak jauh (karena saya sering mengekspor salinan dari ini repo via sneakernet ke sistem lain yang memiliki akses untuk mendorong ke remote itu). Saya menemukan bahwa tidak ada cara untuk memaksa menambahkan cabang jarak jauh pada lokal yang belum diambil (jadi lokal tidak tahu bahwa cabang ada pada jarak jauh dan saya akan mendapatkan kesalahan:) the requested upstream branch 'origin/remotebranchname' does not exist.

Pada akhirnya saya berhasil menambahkan cabang jarak jauh baru yang sebelumnya tidak dikenal (tanpa mengambil) dengan menambahkan file kepala baru di .git/refs/remotes/origin/remotebranchnamedan kemudian menyalin ref (eyeballing adalah tercepat, lumpuh seperti itu ;-) dari sistem dengan akses ke asal repo ke workstation (dengan repo lokal tempat saya menambahkan cabang jarak jauh aktif).

Setelah itu selesai, saya bisa menggunakannya git branch --set-upstream-to=origin/remotebranchname

Ville
sumber
3

atau hanya dengan:

beralih ke cabang jika Anda belum memilikinya:

[za]$ git checkout branch_name

Lari

[za]$ git branch --set-upstream origin branch_name
Branch origin set up to track local branch brnach_name by rebasing.

dan Anda siap untuk:

 [za]$ git push origin branch_name

Anda dapat melihat file konfigurasi untuk melihat apa yang melacak apa dengan menjalankan:

 [za]$ git config -e

Sangat menyenangkan mengetahui hal ini, ini menunjukkan cabang mana yang dilacak dan mana yang tidak. :

  [za]$ git remote show origin 
zee
sumber
0

Bagi siapa pun, seperti saya, hanya ingin menyinkronkan nama cabang lokal Anda dengan nama cabang jarak jauh, berikut ini adalah perintah praktis:

git branch -u origin/$(git rev-parse --abbrev-ref HEAD)
Konstantinos
sumber
0

Untuk menghindari mengingat apa yang perlu Anda lakukan setiap kali Anda menerima pesan:

Silakan tentukan cabang mana yang ingin Anda gabungkan. Lihat git-pull (1)
untuk detailnya.
.....

Anda dapat menggunakan skrip berikut yang menetapkan asal sebagai hulu untuk cabang saat ini Anda berada.

Dalam kasus saya, saya hampir tidak pernah menetapkan sesuatu selain asal sebagai default upstream . Saya juga hampir selalu menyimpan nama cabang yang sama untuk cabang lokal dan jauh. Jadi yang berikut ini cocok untuk saya:

#!/bin/bash
# scriptname: git-branch-set-originupstream
current_branch="$(git branch | grep -oP '(?<=^\* )(.*)$')"
upstream="origin/$current_branch"
git branch -u "$upstream"
Marinos An
sumber
-1

Ini juga akan berhasil

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
Abhi
sumber