Mevcut bir Git dalını uzak bir dal izliyor mu?


3535

Uzak dalları izleyen yeni bir dalın nasıl yapıldığını biliyorum, ancak mevcut bir dalı uzak bir dalın izini nasıl oluştururum?

Sadece .git/configdosyayı düzenleyebileceğimi biliyorum , ama daha kolay bir yol olmalı gibi görünüyor.


26
Aşağıda belirtildiği gibi, mevcut bir dal için kullanabilirsiniz git push -u origin branch-name.
Zags

3
Yerel şube geçerli şube ise ve yerel şube zaten bir uzaktan kumandayı takip etmiyorsa git pull, genellikle izleme bilgilerini ayarlamak için uygun komut hakkında yararlı mesajlar sağlar
billrichards

57
Birisinin git belgelerine bir bağlantı gösterilmesini öğrenmek için can sıkıcı bir durum. Bu belgelerin git ile ne yaptığını zaten bilen insanlar için yazılmış gibi görünüyor .
Felipe Alvarez

9
Git 2.10 itibariyle ilk önce planlanan yerel şubeye gidip bunu yapmalısınızgit branch --set-upstream-to origin/<branch>
Mehdi Javaheri

2
--set-upstreambir hata üretir: fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead.böylece git branch --set-upstream-to origin/<branch name>çalışır akım komuttur.
Süper Yeşim

Yanıtlar:


4270

Bir şube foove uzaktan kumanda verildiğinde upstream:

Git 1.8.0'dan itibaren:

git branch -u upstream/foo

Veya, yerel şube foogeçerli şube değilse:

git branch -u upstream/foo foo

Veya daha uzun komutlar yazmak isterseniz, bunlar yukarıdaki ikiye eşdeğerdir:

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

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

Git 1.7.0 itibariyle:

git branch --set-upstream foo upstream/foo

Notlar:

  • Yukarıdaki komutların tümü yerel şubenin foouzak şubeyi foouzaktan izlemesine neden olur upstream.
  • Eski (1.7.x) sözdizimi, yeni (1.8+) sözdizimi lehine kullanımdan kaldırılmıştır. Yeni sözdiziminin daha sezgisel ve hatırlanması daha kolay olması amaçlanmıştır.
  • Önceden getirilmemiş olan yeni oluşturulan uzaktan kumandalara karşı çalıştırıldığında bir yukarı akış dalı tanımlamak başarısız olur. Bu durumda, git fetch upstreamönceden çalıştırın .

Ayrıca bakınız: Neden her zaman `` yukarı akış '' yapmam gerekiyor?


124
"Akış yukarı" uzaktan kumandanın adı mı? yani en çok varsayılan olarak "orijin" olarak adlandırır.
Andrew Vit

172
@Andrew: Evet. git branch --set-upstream master origin/masterbaşlangıçta bir havuzu klonladığınızda otomatik olarak yapılana eşdeğer olur.
Dan Moulding

62
İlgili bir notta, bunu gitconfig dosyasına eklemek harika: "[push] default = tracking" bu, itmelerin geldiği yerden aynı yere gitmesini sağlar :)
jpswain

61
"Ölümcül: Geçerli bir nesne adı değil:" origin / master ".
joachim

84
git push -u origin foo via
Pamuk

236

Aşağıdakileri yapabilirsiniz (master'da teslim alındığınızı ve uzak bir şube yöneticisine göndermek istediğinizi varsayarsak):

Henüz sahip değilseniz 'uzaktan kumandayı' ayarlayın

git remote add origin ssh://...

Şimdi master'ı takip etmek için yapılandırın:

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

Ve itin:

git push origin master

gerçekten uzaktan kumanda ve şube itmek gerekir? Yani, sadece teslim alınmış şubeniz itmek istediğiniz dal değilse, buna ihtiyacınız var değil mi?
Doppelganger

5
Evet - ancak bellekten ilk basış için açık olmanız gerekebilir. Elbette kolayca test edilebilir ... :)
Paul Hedderly

+1 Bu msysgit "önizleme" ile 1.8 'den takılmış Windows kullanıcıları için cevaptır. Bunun için teşekkürler.
John

3
Benim için işe yarayan tek cevap bu. Ben kabul cevabı çalıştığımda varolan şube için yukarı uzaktan ayarlamak, I got: error: the requested upstream branch 'upstream/master' does not exist.
Steve K

4
@SteveK bu büyük olasılıkla yukarı akışınız çağrıldı origin, değil upstream.
umläute

160

Bunu, olduğu gibi -useçenekle itmenin bir yan etkisi olarak yapıyorum

$ git push -u origin branch-name

Eşdeğer uzun seçenek --set-upstream .

git-branchKomut ayrıca anlar --set-upstream, ancak kullanımı kafa karıştırıcı olabilir. Sürüm 1.8.0 arayüzü değiştirir.

git branch --set-upstream kullanımdan kaldırılmıştır ve nispeten uzak bir gelecekte kaldırılabilir. git branch [-u|--set-upstream-to]akılcı bir argüman sırası ile tanıtılmıştır.

...

Söylemek cazipti git branch --set-upstream origin/master, ama bu Git'e yerel şubeye "başlangıç ​​/ ana konum" u halihazırda kullanıma alınmış şubeyle entegre olacak şekilde düzenlemesini söyler, ki bu kullanıcının ne anlama geldiği pek olası değildir. Seçenek kullanımdan kaldırılmıştır; bunun yerine yeni --set-upstream-to(kısa ve tatlı -u) seçeneğini kullanın.

Yerel bir fooşubeniz olduğunu ve şubeye yukarı akışla aynı adla davranmasını istediğinizi varsayalım. Bunun gerçekleşmesini sağlayın

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

ya da sadece

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

1
Bu çok daha iyi bir çözüm imo
Nils_e

--set-upstream-to=...tam da aradığım şeydi.
Richard

54

git_remote_branchAracı faydalı bulabilirsiniz . Uzak dalları oluşturmak, yayınlamak, silmek, izlemek ve yeniden adlandırmak için basit komutlar sunar. Güzel bir özellik, grbkomuttan hangi git komutlarını çalıştıracağını açıklamasını isteyebilmenizdir .

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


6
OP, Git'in kendisi hakkında soru soruyor. Yani yeni bir araç tanıtmak muhtemelen daha iyi olurdu.
zeekvfu

grb, macOS kurulumumda git-rebase için bir takma addır. Bunu ben yapmadım :)
Ben Sinclair

53

Aslında çalışmanın kabul edilen cevabı için:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa

Yerel şube zaten bir şubeyi izliyordu, bu nedenle uzak repo'nun zaten eklendiğini varsayabiliriz.
Doppelganger

Dopplerganger: Joachim'in kabul edilen cevaba yaptığı yoruma bakınız. Her neyse varsayımlar kolayca farklı - şeyleri bu kadar ilginç kılan şey;)
Kirpi

44

Git 1.5.x kadar erken bir zamanda, yerel bir şubeyi $BRANCHuzak bir şubeyi takip edebileceğinize inanıyorumorigin/$BRANCH bu gibi .

Bu göz önüne alındığında $BRANCHve origin/$BRANCHvar olduğunda ve şu anda teslim almadıysanız $BRANCH(varsa geçiş yapın) şunları yapın:

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

Bu $BRANCHbir izleme dalı olarak yeniden yaratılır . -fKuvvetler rağmen yaratma $BRANCHzaten mevcut. --trackolağan varsayılanlar yerinde ise isteğe bağlıdır (yani, git-config parametresibranch.autosetupmerge true).

Eğer Not origin/$BRANCHhenüz var olmayan, yerel iterek oluşturabilir $BRANCHUzak depo ile içine:

git push origin $BRANCH

Yerel şubeyi izleme şubesine tanıtmak için önceki komutu izler.


1
git push origin $BRANCHaradığım şey buydu.
Kullanıcı

Yukarıda açıklandığı gibi bir yukarı akış kurmak da dahil olmak üzere her türlü çözümü denedikten sonra hiçbir şey işe yaramadı. Tek yapmak istediğim, uzak şubeden yerel şubeme 1 yeni taahhüt kazandırmaktı ve başlangıçta izlemeyi kurmadım. Komut git branch -f --track $BRANCH origin/$BRANCHhile yapar.
DemitryT

38

1- kullanarak yerel meta verilerinizi güncelleyin: git fetch --all

resim açıklamasını buraya girin

2- kullanarak uzak ve yerel şubeleri göstermek: git branch -a , aşağıdaki ekran görüntüsüne bakın

resim açıklamasını buraya girin

3- Uzaktan kumandayla bağlamak istediğiniz hedef şubeye geçin:

git ödeme şube adı

misal :

resim açıklamasını buraya girin

4- Yerel şubenizi aşağıdakileri kullanarak uzak bir şubeye bağlayın:

git branch - set-upstream-to nameOfRemoteBranch

Not: nameOfRemoteBranch : "git branch -r" adım 2'nin çıktısından kopyalamak için

Kullanım örneği:

resim açıklamasını buraya girin


1
Çoğunlukla kolay ve basit bir cevap.
vibs2006

25

Koştuğunuzdan emin olun:

git config push.default tracking

sorunsuzca itebilme


1
Bu uygun olabilir. Bununla birlikte, git-config(1)manuel sayfaya göre , trackingeşanlamlı bir eş anlamlı olduğunu belirtebiliriz upstream.
FooF

23

Düzenleme .git/configmuhtemelen en kolay ve en hızlı yoldur. Uzak dalları işlemek için Git komutları zaten bunu yapıyor.

Dosyayı elle elle yapmak istemiyorsanız (ve bunu yapmak o kadar da zor değil), her zaman git configbunu yapmak için kullanabilirsiniz ... ama yine de, bu .git/configzaten dosyayı düzenleyecektir .

Elbette, uzak bir dalı kullanırken git checkout( --trackörneğin bayrağı geçirerek) otomatik olarak izlemenin yolları vardır , ancak bu komutlar mevcut olanlarla değil, yeni dallarla çalışır .


18

Kısacası

git branch --set-upstream yourLocalBranchName origin/develop

Bu, yourLocalBranchNameparkurunuzu uzak şube olarak adlandırır develop.


1
Kontrol @Quincy Greg'in cevabı kullanımını - git push -u origin branch(veya --set-upstream-toonun yerine)
Tobias Kienzler

@MadNik, --set-upstreamve arasındaki fark --tracknedir? Neden birini diğerinin üzerinde kullanmam gerektiğini tam olarak anlamıyorum.
Acumenus

15

1.6.x için git_remote_branch aracı kullanılarak yapılabilir :

grb track foo upstream

Bu Git'in fooizini sürmesine neden olur upstream/foo.


12

Aşağıdaki komutu kullanıyorum (Yerel şube adınızın "şube-adı-yerel" ve uzak şube adının "şube-adı-uzak" olduğunu varsayalım):

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

Hem yerel hem de uzak dallar aynı ada sahipse, aşağıdakileri yapın:

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

Komut satırında "dal adı" ve "kökeni / dal adı" terimlerini geri çevirdiniz. Memba yerelden önce gelir.
maharvey67

@ maharvey67 haklısın, teşekkürler. Cevabı düzenledi.
yrazlik


8

Burada, githubve kullanarak git version 2.1.4, sadece şunu yapın:

$ git clone git@github.com:user/repo.git

Ve uzaktan kumandalar, yerel olarak bağlı olmasalar bile kendileri tarafından gelir:

$ git remote show origin

* remote origin
  Fetch URL: git@github.com:user/repo.git
  Push  URL: git@github.com: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)

Ama elbette, hala yerel bir şube yok:

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

Görmek? Şimdi sadece develp'i kontrol ederseniz, sihri otomatik olarak yapacak:

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

Çok kolay!


Özet. Sadece bu 2 komutu çalıştırın:

$ git clone git@github.com:user/repo.git
$ git checkout develop

1
Aynı kullanım durumuma mükemmel bir örnek. Yerel bir 'geliştirme' dalı belirtisi olmamasına rağmen, 'geliştirme' dalını kontrol ettiğimde, dal ortaya çıkar ve uzak dalın 'gelişmesini' kökünden izlemek için sihirli bir şekilde ayarlanır. Adım adım örnek ve açıklama için teşekkür ederiz!
ElliotPsyIT

8

'--Track' Seçeneğini Kullan

  • Sonra git pull:

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

  • Veya:

    git fetch && git checkout <branch-name>


7

Yeni şube oluşturmak için aşağıdaki komutu kullanabiliriz

 git checkout --track -b örnek kaynak / örnek 
Önceden oluşturulmuş dalın uzak ile daha sonra o daldan arasında bağlantı oluşturması için aşağıdaki komutu kullanın

 git branch -u başlangıç ​​noktası / uzak dal adı


5

Bu, bu soruya doğrudan bir cevap değil, ancak bir yukarı akış dalı yapılandırmaya çalışırken benimle aynı sorunu yaşayan herkes için burada bir not bırakmak istedim.

Push.default'a karşı dikkatli olun .

Daha eski git sürümlerinde, varsayılan eşleme vardı , bu da varsa, istenmeyen davranışlara neden olabilir, örneğin:

Menşe / master'a yerel şube "master" takibi

Yukarı akış / master için uzak dal "yukarı akış" takibi

"Yukarı akış" dalındayken "git push" komutunu denerseniz , push.default eşleşmesi ile git otomatik olarak yerel "master" dalını "upstream / master" ile birleştirmeye çok fazla kaosa neden olur.

Bu daha aklı başında davranış sağlar:

git config - global push.default yukarı akış


Bunu boşuna bırakmadın. Teşekkürler.
stefgosselin

4

Biraz ilgili bir şekilde, var olan bir şubeye bir uzaktan izleme dalı eklemeye çalışıyordum, ancak o uzaktan izleme şubesini eklemek istediğim sistemdeki o uzak depoya erişemedim (çünkü bunun bir kopyasını sık sık dışa aktarıyorum sneakernet üzerinden o uzaktan kumandaya gönderme erişimine sahip başka bir sisteme repo). Henüz getirilmemiş yerel bir uzak şube eklemek zorlamak için hiçbir yolu olmadığını buldum (bu yüzden yerel şube uzaktan var olduğunu bilmiyordum ve ben hata alırdım:) the requested upstream branch 'origin/remotebranchname' does not exist.

Sonunda yeni bir kafa dosyası ekleyerek .git/refs/remotes/origin/remotebranchnameve sonra ref'yi kopyalayarak yeni, önceden bilinmeyen uzak dalı (getirmeden) eklemeyi başardım (göz küresi en hızlıydı, olduğu gibi topal ;-) menşe erişimi olan sistemden iş istasyonuna repo (uzak dalı eklediğim yerel repo ile).

Bu yapıldıktan sonra, git branch --set-upstream-to=origin/remotebranchname


3

veya basitçe:

zaten içinde değilseniz şubeye geçin:

[za]$ git checkout branch_name

Çalıştırmak

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

ve şunları yapmaya hazırsınız:

 [za]$ git push origin branch_name

Alawys, neyi çalıştırarak neyin takip edildiğini görmek için yapılandırma dosyasına göz atabilirsiniz:

 [za]$ git config -e

Bunu bilmek güzel, hangi dalların takip edildiğini ve hangilerinin takip edilmediğini gösterir. :

  [za]$ git remote show origin 

0

Benim gibi yerel şube adınızı uzak şube adıyla senkronize etmek isteyen herkes için kullanışlı bir komut:

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

0

Mesajı her aldığınızda ne yapmanız gerektiğini hatırlamamak için:

Lütfen hangi şubeyle birleştirmek istediğinizi belirtin. Ayrıntılar için git-pull'a (1)
bakın.
.....

Bulunduğunuz dal için başlangıç ​​noktasını başlangıç ​​noktası olarak ayarlayan aşağıdaki komut dosyasını kullanabilirsiniz .

Benim durumumda, neredeyse hiçbir zaman varsayılan yukarı akış olarak kökenden başka bir şey ayarlamamıştım . Ayrıca neredeyse her zaman yerel ve uzak şube için aynı şube adını tutuyorum. Böylece aşağıdakiler bana uyar:

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

-1

Bu da işe yarar

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.