Neden her zaman `` set-upstream '' yapmam gerekiyor?


1468

Git'te yeni bir şube oluşturuyorum:

git branch my_branch

İtin:

git push origin my_branch

Şimdi birisinin sunucuda bazı değişiklikler yaptığını ve bunu çekmek istediğimi söyleyin origin/my_branch. Yaparım:

git pull

Ama anladım:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

İşe yarayabileceğimi öğrendim:

git branch --set-upstream my_branch origin/my_branch

Ama bunu neden oluşturduğum her dal için yapmam gerekiyor? Ben iterseniz açık değil mi my_branchiçine origin/my_branch, o zaman çekin isteyeyim origin/my_branchiçine my_branch? Bunu varsayılan davranış haline nasıl getirebilirim?


21
Varsayılan değeri, branch.autosetupmergeyeni bir dal için yukarı akış yapılandırmasının yalnızca uzaktan izleme dalından bir dal oluşturulduğunda otomatik olarak ayarlandığı anlamına gelir (örn. <remote-name>/<branch-name>) (Bkz. Git-config (1) ). Muhtemelen mevcut yerel şubelerden şubeler oluşturuyorsunuz. Doğrudan bir uzak dalın ucundan etkili bir şekilde dallıyorsanız (yerel bir dalda olmasına rağmen), git branch my_branch <remote-name>/<branch-name>yukarı akış yapılandırmasını otomatik olarak ayarlamak için kullanabilirsiniz .
Chris Johnsen

20
Bilginize, --set-upstreamseçenek kullanımdan kaldırıldı. Bunun yerine --trackveya --set-upstream-tokullanmalısınız.
Sean the Bean

139
eğer --set-upstreamitiraz edildi, o zaman belki git Devs çalıştırdığınızda görüntülenen alır yardım iletiden kaldırmak gerekir git pushhiçbir seçenekleri ile ve hiçbir yukarı ayarlanır?
Christopher Hunter

17
@ChristopherHunter Yorumunuzdan bu yana bir yıldan fazla geçti ve hala bunu söylüyor. Sadece özensiz bir geri bildirim mi yoksa belki de cahil olduğumuz şeyleri etrafında tutmak için teknik olarak akıllıca bir neden var mı?
Konrad Viltersten

15
@ChristopherHunter git branch --set-upstreamkullanımdan kaldırıldı. git push --set-upstreamdeğil.
Brian Gordon

Yanıtlar:


1538

İçin sözdizimi hatırlamaya bağlı değildir bir kısayol, git branch --set-upstream 1 yapmaktır:

git push -u origin my_branch

... o dalı ilk kez ittiğinizde. Veya geçerli dalı aynı ada sahip bir şubeye itmek için (takma ad için kullanışlıdır):

git push -u origin HEAD

Sadece bir -ukez kullanmanız gerekir ve bu da şubenizle şube arasındaki ilişkiyi originaynı şekilde kurar git branch --set-upstream.

Şahsen, şubenizle uzaktan kumandadaki bir ilişki arasında bu ilişkiyi kurmak iyi bir şey. Bu kurallar sadece bir utanç için farklı git pushvegit pull .


1 Kulağa aptalca gelebilir, ancak varsayılan dalı olduğunu varsayarak geçerli dalı belirtmeyi çok sık unuttum - öyle değil ve sonuçlar en kafa karıştırıcı :)

2012-10-11 Güncellemesi : Görünüşe göre yanlış anlamayı kolay bulan tek kişi ben değilim! Von 1.8 sayesinde git 1.8.0'ın daha belirgin olduğunu ortaya koyuyor git branch --set-upstream-to, ki bu da şubede iseniz aşağıdaki gibi kullanılabilir my_branch:

git branch --set-upstream-to origin/my_branch

... veya kısa seçenekle:

git branch -u origin/my_branch

Bu değişiklik ve bunun gerekçesi, git 1.8.0, sürüm adayı 1 için sürüm notlarında açıklanmıştır :

Söylemek cazipti git branch --set-upstream origin/master, ancak Git'e yerel şubeye origin/master, şu anda teslim alınmış şubeyle entegre olacak şekilde düzenlenmesini söyler , bu da 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.


95
Ayrıca -u, ilk kez bastığınızda unutsanız bile , itmeyi o bayrakla tekrar çalıştırabileceğinizi ve izlemeye başlayacağını unutmayın.
Henrik N

70
Bunların hiçbiri git push ifadesinin argüman kullanılmadan kullanılma durumunu karşılamamaktadır. Yeni şubemi ilk kez uzaktan kumandaya taşırken 'git push -u origin my-branch' u hatırlamam gerekiyor.
Pagan Karl

19
Bu sözdizimini de hatırlamaktan nefret ediyorum, bu yüzden aşağıdaki takma adı oluşturdum:alias gpo="git push --set-upstream origin $(git branch | awk '/^\* / { print $2 }')"
lillialexis

99
Bu iyi, ama yine de OP'nin şikayetinin geçerli olduğunu düşünüyorum. Yerel bir şube başlatıyorsunuz, üzerinde çalışıyorsunuz, paylaşmak için başlangıca itiyorsunuz (argüman olmadan); neden akıntıyı kurmasın ki? Bazı nedenlerden ötürü, yeni bir kolu uzaktan kumandayı iterken yukarı akış kurmak DEĞİLDİR?
GaryO

23
Tamamen dev zaman değmez. Neden sadece otomatik olarak yapmıyor?
sudo

1346

Bunu daha az yazarak yapabilirsiniz. İlk olarak, itme şeklinizi değiştirin:

git config --global push.default current

Bu origin my_branchparçayı çıkarır , böylece şunları yapabilirsiniz:

git push -u

Bu, aynı adı taşıyan uzak dalı oluşturur ve izler.


4
Git , yeni oluşturulan depoda yeni oluşturulan dal için originçalışırken nasıl çıkarım yapabilir git push -u? Deponun klonlandığı varsayımı mevcut dalın uzaktan kumandasına ayarlanmış mı origin?
Piotr Dobrogost

73
Bu varsayılan değer olmalıdır. Git'teki pek çok şey, daha iyi varsayılanlarla gönderilirse daha kullanıcı dostu olabilir.
phreakhead

13
'Akım'ın aynı şeyi yapmak için' basit 'kullanmaktan biraz güvensiz olduğunu unutmayın, bkz. Stackoverflow.com/questions/23918062/…
Air

30
Öyle, ama sonra denediğinizde pullnereden belirtmeniz gerekecek. Başlangıç -uve yerel repo arasındaki şube izlemeyi kurar.
Zamith

7
Marjinal olarak uygun olsa da, bu hala ilk ve tek için farklı bir komutun çalıştırılmasını zorunlu kılar push- bu da bu sorunun tüm noktasını yener. Kısacası, iyi bir cevap yok. Git geliştiricilerinin, bu Garip Kullanıcı eXperience'in (AUX) yaygın topluluk muhalefeti karşısında tutulması konusunda ısrar etmeleri ... aydınlatıcıdır. Ve cesaret kırıcı. (Çoğunlukla cesaret kırıcı.)
Cecil Curry

87

Basitçe yapabilirsiniz

git checkout -b my-branch origin/whatever

ilk başta. Eğer ayarlarsanız branch.autosetupmergeya branch.autosetuprebasekadar (en sevdiğim) always(varsayılan true), my-branchotomatik olarak izler origin/whatever.

Bkz git help config.


5
Bu "ölümcül: Yollar güncellenemez ve aynı zamanda 'dalım' dalına geçilemez."
Pagan Karl

12
Bu arada, genellikle sadece git checkout -t origin/whatever, whateveryeni şube adı olarak da seçerim . Çok uygun!
cdunn2001

2
@cdunn Bu ideal, ancak pek tutarlı değil. Bayrak -u/ olarak adlandırılmalıdır --set-upstream.
Tobu

1
git checkout -t origin/whateveryeni bir şube oluşturmaya çalışırken benim için çalışmıyor:fatal: Cannot update paths and switch to branch 'whatever' at the same time.
wisbucky

1
git checkout -b my-branch origin/whateverAyrıca aynı hata var (yerel veya uzak olmayan yeni bir şube oluşturmaya çalışıyorum): fatal: Cannot update paths and switch to branch 'whatever' at the same time.
wisbucky

81

Bu Fuck için en yaygın kullanımım .

$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

Ayrıca, terminalinize küfür sözcükleri yazmak eğlenceli.


Bu nedenle Windows'a (veya en azından git-bash) taşınması gerekir.
BrianHVB

1
Bu küçük keşif günümü yeni yaptı. teşekkür ederim
Ivan Durst

Muhteşem araç, teşekkürler!
Yurii

81

Yukarı akış daha kolay iki şekilde ayarlanabilir. İlk olarak dalı oluşturduğunuzda:

git branch -u origin/my-branch

veya bir şube oluşturduktan sonra bu komutu kullanabilirsiniz.

git push -u origin my-branch

Ayrıca, tek bir komutta dal oluşturabilir, teslim alabilir ve akış yukarı ayarlayabilirsiniz:

git checkout -b my-branch -t origin/my-branch

Kişisel tercihim bunu iki adımlı bir komutla yapmaktır:

git checkout -b my-branch
git push -u origin my-branch

1
Mükemmel cevap! Her iki yaygın kullanım durumunu da ele alır. Koştuktan sonra değişiklikleri aşağı çekmek için git branch -u origin/my-branchkoşabilirim git pull.
Benjamin Atkin

2
"git checkout -b şubem -t kaynağım / şubem" bu henüz 'başlangıç ​​/ şubem' yoksa çalışmaz.
Spongman

1
Aslında git checkout -t origin/my-brancholmadan yapabilirsiniz -b my-branch, sadece my-branchyerel şube adı için otomatik olarak çıkarım yapar. Bununla birlikte, @Spongman'ın da belirttiği gibi, origin/my-branchilk yoksa bu komut çalışmaz .
wisbucky

Evet, @wisbucky ile çalışacak, -t iyi çalışıyor. Şahsen olsa da, bu cevabı yazdıktan iki yıl sonra bile, hala -b ve push -u ile iki satıra bölünmeyi tercih ediyorum. Daha açık ve uzak olmadığımda ödeme - b hata yok
denerken

2
git push -u origin/my-branchbenim için başarısız olur fatal: 'origin/my-branch' does not appear to be a git repository. Bu çalışıyor:git push -u origin my-branch
stason

48

Kullanabilirsiniz:

git config - global branch.autosetupmerge her zaman

her yeni dal oluşturduğunuzda veya ödeme yaptığınızda akış yukarı dalı birbirine bağlar.

Bkz. Https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

Bu branch.autosetuprebase, daha fazla rebase odaklı bir iş akışı izlerseniz de çalışır , ancak ne yaptığınızı bilmediğiniz sürece bunu kullanmayın, çünkü çekme davranışınızı varsayılan olarak yeniden başlatacak, bu da garip sonuçlara neden olabilir.


8
Çalışmıyor, hala --set-upstreammesajı alıyorum
Dorian

2
@Dorian, Şube oluşturmadan önce bunu ayarlamanız gerekir. Bkz. Stackoverflow.com/a/9753268/263998
cdunn2001

8
ama bu aynı şube ile uzaktan kumanda olarak izleme şube belirlemez, ancak itmek ne zaman geçerli yerel şubesine .. yani yeni şube .. oluşturmadan önce oldu YEREL dalına itmek için çalışacağız
Arnold Roa

1
Bu, varsayılandan daha garip davranışlara sahiptir. İşi bir şubeye dayandırırsanız, gerçekten garip davranır.
Beefster

1
Bu ayara dikkat edin !! Ayarladıktan sonra bu davranışı elde edersiniz. 1. konumuna geçin master. 2. Çalıştırın git checkout -b new_branch. 3. Bu şubeye bir taahhüt ekleyin. 4. git push origin new_branch. Bu da bu taahhüdü mastermenşe dalına (denilen menşe dalına değil) iternew_branch .
stwr667

38

Bu arada, geçerli dalı aynı ada sahip bir uzaktan kumandaya itme kısayolu:

$ git push -u origin HEAD

22

Şahsen bu takma adı bash'da kullanıyorum

~ / .gitconfig dosyasında

[alias]
    pushup = "!git push --set-upstream origin $(git symbolic-ref --short HEAD)"

ve ~ / .bashrc veya ~ / .zshrc dosyasında

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"

1
Ben sadece .gitconfig hcange gerekiyordu, o git pushupzaman her zaman geçerli dalı başlangıç ​​noktasına iter komutu kullanabilirsiniz . Ben her zaman sadece kullanabilirsiniz git pushupyerine git push👍
thespacecamel

18

Aşağıdakiler işe yaramazsa:

git config --global push.default current

Ayrıca projenizin yerel yapılandırmasını da güncellemelisiniz, çünkü projenizde yerel git yapılandırmaları olabilir:

git config --local push.default current

2
Daha fazla açıklama harika olurdu. İlk satır ne yapar?
papillon

3
Bu cevap meşru hissettiren cevaptır. Takma ad önerenlerin hepsi aptal çözümlerdir. Uzun komut dizilerini ezberlemeyi haklı çıkaranlar da bilgiçlik taslayanlar.
MarkHu

10

Ayrıca git çek komutunu hangi uzak dalı çekeceğini (hata iletisinde bahsedildiği gibi) açıkça söyleyebilirsiniz:

git pull <remote-name> <remote-branch>

Bununla birlikte, dikkatli olun: farklı bir daldaysanız ve açık bir çekiş yaparsanız, çektiğiniz refspec bulunduğunuz dalla birleştirilir!


10

Değeri ne olursa olsun, uzaktan kumandada zaten var olan bir dalı (ör. Origin / somebranch) izlemeye çalışıyorsanız, ancak henüz yerel olarak kontrol etmediyseniz, şunları yapabilirsiniz:

$ git checkout --track origin/somebranch

Not: '-t', '--track' seçeneğinin kısaltılmış sürümüdür.

Bu, aynı ilişkiyi derhal başlatır.


5
Aslında şubeye ödeme yapabilirsiniz. Yani git checkout somebrancheşdeğerdir.
Zamith

2
@Zamith Bu sadece git fetchönceden arama yaptıktan sonra çalışmıyor mu ?
Walter Roman

1
Hemen değil ama evet, sen istediğim zaman olur yerel repo, o dal bir başvuru olması gerekiyor git fetchya git pull. Yine de bunu bir sorun olarak görmedim.
15'te Zamith

10
git branch --set-upstream-to=origin/master<branch_name>

9

Git'in takma adını Git'i her seferinde Git'ten yapıştırmak / yapıştırmak yerine kullanıyorum: https://gist.github.com/ekilah/88a880c84a50b73bd306

Kaynak aşağıda kopyalandı (bunu ~/.gitconfigdosyanıza ekleyin ):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"

7

Aşırı ayrıntılı sözdizimi olmadan bunun üstesinden gelebilecek gerçekten iyi bir takma ad oluşturabilirsiniz.

Aşağıdaki takma adı var ~/.gitconfig:

po = "!git push -u origin \"$(git rev-parse --abbrev-ref HEAD)\""

Yeni bir dalda taahhütte bulunduktan sonra, sadece komutu yazarak yeni dalınızı itebilirsiniz:

git po

neden po? push origin? bu birden çok kez yapılırsa ne olur?
Arnold Roa

Evet, itme kaynağındaki gibi. Birden çok kez çalıştırılırsa hiçbir şey olmaz. Ayrıca git push -fayarlanmış bir takma adım var git pf, bu yüzden orijin itildikten sonra bunu kullanıyorum.
123

djanowski'nin yorumuna bakın , doğrudan kullanabilirsinizHEAD
arhak

3

Birlikte çalışan bir takma ad arayanlar için git pullşunu kullanıyorum:

alias up="git branch | awk '/^\\* / { print \$2 }' | xargs -I {} git branch --set-upstream-to=origin/{} {}"

Şimdi ne zaman alırsanız alın:

$ git pull
There is no tracking information for the current branch.
...

Sadece koş:

$ up
Branch my_branch set up to track remote branch my_branch from origin.
$ git pull

Ve gitmekte iyisin


2

Çünkü git, farklı dalları farklı "yukarı akış" depolarına itme / çekme yeteneğine sahiptir. Aynı dalı itmek ve çekmek için ayrı depolar bile kullanabilirsiniz. Bu dağıtılmış, çok seviyeli bir akış oluşturabilir, bunun Linux çekirdeği gibi projelerde yararlı olduğunu görebiliyorum. Git aslında bu projede kullanılmak üzere üretildi.

Sonuç olarak, şubenizin hangi repoyu izlemesi gerektiği konusunda varsayımda bulunmaz.

Öte yandan, çoğu kişi git'i bu şekilde kullanmaz, bu nedenle varsayılan bir seçenek için iyi bir durum olabilir.

Git genellikle oldukça düşük seviyelidir ve sinir bozucu olabilir. Yine de GUI'ler vardır ve hala kabuktan kullanmak istiyorsanız yardımcı komut dosyaları yazmak kolay olmalıdır.



0

legitBu sorun nedeniyle yeniden keşfedildi (yalnızca OS X). Dallanma sırasında kullandığım tek şey şu iki komuttur:

legit publish [<branch>] Belirtilen dalı uzaktan kumandaya yayınlar. (diğer adı: pub)

legit unpublish <branch> Belirtilen dalı uzaktan kumandadan kaldırır. (diğer adı: unp)

SublimeGitlegit varsayılan olarak destek ile birlikte gelir , bu da tüm dallanma rutinini Ctrl-b'ye basmak kadar kolay hale getirir.


0

Biz phabricator kullanıyoruz ve git kullanarak itmiyoruz. Linux / mac üzerinde çalışan bash takma adı oluşturmak zorunda kaldım

vim ~/.bash_aliases

new_branch() {
    git checkout -b "$1"
    git branch --set-upstream-to=origin/master "$1"
}

kayıt etmek

source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull

0

Burada, her push için çalıştırılması güvenli olan git push için bir bash takma adı ve ilk itme için yukarı akış ayarı ve daha sonra normal itme yapmak arasında otomatik olarak geçiş yapacak.

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

Orijinal Mesaj

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.