Git checkout --track orijin / branş ve git checkout -b branş orijin / branş arasındaki fark


209

Uzak bir dalı değiştirmek ve izlemek için bu iki komut arasındaki farkı bilen var mı?

git checkout -b branch origin/branch
git checkout --track origin/branch

Bence her ikisi de uzak şubeyi takip ediyor, böylece şubedeki değişikliklerimi başlangıç ​​noktasına itebiliyorum, değil mi?

Pratik farklılıklar var mı ??

Teşekkürler!

Yanıtlar:


282

İki komut da aynı etkiye sahiptir ( Robert Siemer'in işaret ettiği cevabı sayesinde ).

Pratik fark, farklı adlı yerel bir şube kullanıldığında ortaya çıkar :

  • git checkout -b mybranch origin/abranchyaratacak mybranchve takip edecekorigin/abranch
  • git checkout --track origin/abranchabranchfarklı bir ada sahip bir şube değil , sadece ' ' oluşturur .

(Yani, yorumladı olarak tarafından Sebastian Graf yerel şube eğer, değil zaten var.
Öyle olsaydı, sen gerekir git checkout -B abranch origin/abranch)


Not: Git 2.23 (Q3 2019) ile yeni komut kullanılırgit switch :

git switch -c <branch> --track <remote>/<branch>

Şube birden çok uzaktan kumandada bulunuyorsa ve bunlardan biri checkout.defaultRemoteyapılandırma değişkeni tarafından adlandırılmışsa , <branch>tüm uzaktan kumandalar arasında benzersiz olmasa bile, bunu ayırma amacıyla kullanacağız . Belirsiz ancak 'başlangıç' uzaktan kumandasında varsa , uzak dalları her zaman oradan kontrol
etmek için ayarlayın .checkout.defaultRemote=origin<branch>

İşte, ' -c' yeni ' -b'.


İlk olarak, bir arka plan: İzleme , yerel bir şubenin yukarı akışını uzak bir şubeye ayarladığı anlamına gelir:

# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.merge refs/heads/branch

git checkout -b branch origin/branch niyet:

  • branchtarafından başvurulan noktaya oluşturma / sıfırlama origin/branch.
  • şube oluşturma branch(ile git branch) ve uzaktan izleme kolunu izleme origin/branch.

Yerel bir dal uzaktan izleme daldan başlatıldığında, Git şube (özellikle kurar branch.<name>.remoteve branch.<name>.mergeyapılandırma kayıt) böylece git pulluygun uzaktan izleme daldan birleştirilecek.
Bu davranış, genel branch.autosetupmergeyapılandırma bayrağıyla değiştirilebilir . Bu ayar --trackve --no-trackseçenekleri kullanılarak geçersiz kılınabilir ve daha sonra git dalı kullanılarak değiştirilebilir --set-upstream-to.


Ve git checkout --track origin/branchaynı şeyi yapacaktır git branch --set-upstream-to):

 # or, since 1.7.0
 git branch --set-upstream upstream/branch branch
 # or, since 1.8.0 (October 2012)
 git branch --set-upstream-to upstream/branch branch
 # the short version remains the same:
 git branch -u upstream/branch branch

Ayrıca, ' branch' için akış yukarı da yerleştirir .

(Not: git1.8.0 kullanımdan kaldırılacak git branch --set-upstreamve onunla değiştirilecektir git branch -u|--set-upstream-to: bkz. Git1.8.0-rc1 anonsu )


Yerel bir şube için kayıtlı bir yukarı şubeye sahip olmak:

  • için git söyle içinde iki kola arasındaki ilişkiyi gösterir git statusvegit branch -v .
  • yeni dal teslim alındığında yukarı akıştan alınacak git pull argüman olmadan yönlendirir .

Daha fazla bilgi için bkz. " Mevcut bir git dalını uzak bir dal izini nasıl yaparsınız? "


1
@VonC Ek bilgi olarak bahsettiğiniz küçük ayrıntıyı arıyordum. Benim durumumda, neden bazı şubelerimin bana izin verdiğini merak git pullederken, bazı şubeler uzak bir dalın çekilmesini isteyecekti. İlk kez, branch.<BNAME>.remote=origineşinizin oluşturduğu uzak bir dalı kontrol ederseniz, git'in devam edip yerel gitconfig'e eklediği ortaya çıkıyor. Bu daha sonra yayınlamanızı sağlar git pull. Ancak, dalı oluşturan sizseniz, git checkout -b BNAMEgit -of tabii ki- bilmiyor. Bu yüzden uzaktan kumandasını belirtmelisiniz.
batilc

@batilc "Eğer ilk defa, akranınızın oluşturduğu uzak bir dalı kontrol ediyorsanız,"; evet, git-scm.com/docs/git-checkout okunurken , şunu görüyorum: " If <branch>bulunamadı, ancak tam olarak bir uzaktan kumandada ( <remote>adı) eşleşen bir ada sahip bir izleme dalı var $ git checkout -b <branch> --track <remote>/<branch>"
VonC

@VonC Bunun için daha iyi bir yapılandırma buldum. kurma branch.autoSetupMergeiçin alwaysbiz ne konuştuğunu basitçe gerçekleştirir. Bu ayar varsayılan olarak yapılır true, yani izleme yalnızca uzak bir dal kontrol edilirken gerçekleştirilir. trueyerel olarak oluşturulan şubeler için izlemeyi kurmaz.
batilc

@batilc katılıyorum. Her zaman kullanma eğilimindeyim, açıkça izlemeyi ayarlamayı tercih ettiğim için, ancak sizin durumunuzda bu doğru ayar olmalıdır.
VonC

1
"git branch --set-upstream-to upstream / branch" doğru sözdizimi değil. şöyle olmalıdır: "git branch --set-upstream-upstream / branch branch"
maharvey67

33

Hiç fark yok!

1) git checkout -b branch origin/branch

Hiçbir yoksa --trackve hiçbir --no-track, --trackvarsayılan olarak kabul edilir. Varsayılan ayar ile değiştirilebilir branch.autosetupmerge.

Aslında, 1) gibi davranır git checkout -b branch --track origin/branch.

2) git checkout --track origin/branch

“Kolaylık olması”, --trackolmadan -bima -bve argüman -btahmin edilmektedir “dal” olarak. Tahmin, yapılandırma değişkeni tarafından yönlendirilir remote.origin.fetch.

Aslında, 2) gibi davranır git checkout -b branch --track origin/branch.

Gördüğünüz gibi fark yok.

Ama daha da iyi olur:

3) git checkout branch

git checkout -b branch --track origin/branch"dal" henüz mevcut değilse, ancak "başlangıç ​​/ dal" 1 değerine eşittir .


Her üç komut da "dal" ın yukarı akışını "başlangıç ​​/ dal" olarak ayarlar (veya başarısız olur).

Memba referans noktası olarak kullanılır argüman-az git status, git push, git mergeve böylece git pull(varsayılan ya da hemen hemen varsayılan olan (bu şekilde yapılandırılmışsa)).

Örneğin git status, eğer yapılandırılmışsa, yukarı akışta ne kadar geride veya ileride olduğunuzu söyler.

git pushVarsayılan olarak geçerli şube ust baş itmek üzere yapılandırılmış 2 Git 2.0 beri.

1 “köken” sadece uzaktan sahip “dal” ise ... ve
2 varsayılan ( “basit” olarak adlandırılır) da hem şube isimleri eşit olabilmesi için zorlar


5

Kitap , bu komutların aynı etkiyi verdiğini gösteriyor:

Basit durum az önce gördüğünüz, git checkout -b [dal] [remotename] / [dal] ile çalışan örnektir. Git 1.6.2 veya sonraki bir sürümüne sahipseniz, --track stilini de kullanabilirsiniz:

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

Uzak daldan farklı bir ada sahip bir yerel dal ayarlamak için, farklı bir yerel dal adına sahip ilk sürümü kolayca kullanabilirsiniz:

$ git checkout -b sf origin/serverfix

Bu özellikle bash veya oh-my-zsh git tamamlamalarınız origin/serverfixsizin için adı çekebiliyorsa - sadece ekleyin --track(veya -t) ve yolunuza devam edin.


-1

Bu komutla yeni bir şube oluşturamazsınız

git checkout --track origin/branch

sahnelenmemiş değişiklikleriniz varsa.

İşte örnek:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/App.js

no changes added to commit (use "git add" and/or "git commit -a")

// TRY TO CREATE:

$ git checkout --track origin/new-branch
fatal: 'origin/new-branch' is not a commit and a branch 'new-branch' cannot be created from it

Ancak, git checkout -bkomutla aşamalı olmayan değişikliklerle kolayca yeni bir şube oluşturabilirsiniz :

$ git checkout -b new-branch
Switched to a new branch 'new-branch'
M       src/App.js

her iki komutun da mevcut bir uzak dalı izlemek için olduğunu unutmayın ( origin/branch)
yorch

@Yeşil Yaptığınız test origin/new-branchyerine origin/branch. Bunun farkında mısın?
Robert Siemer
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.