Yerel şube, yerel izleme dalı, uzak şube ve uzaktan izleme dalı arasındaki farklar nelerdir?


158

Git'i kullanmaya yeni başladım ve farklı dallar arasında gerçekten kafam karıştı. Birisi aşağıdaki dal türlerinin ne olduğunu anlamama yardımcı olabilir mi?

  • yerel şubeler
  • yerel takip şubeleri
  • uzak dallar
  • uzaktan izleme şubeleri

Onların arasındaki fark ne? Ve birbirleriyle nasıl çalışırlar?

Hızlı bir demo kodu sanırım gerçekten yardımcı olacaktır.

Yanıtlar:


123

Bir yerel şube yalnızca (yerel kullanıcı) görebileceğiniz bir dalıdır. Yalnızca yerel makinenizde bulunur.

git branch myNewBranch        # Create local branch named "myNewBranch"

Bir uzaktan şube (çoğu durumda uzak bir yere bir şube olduğunu origin). Yeni oluşturulan yerel şube itebilir myNewBranchiçin origin. Şimdi diğer kullanıcılar izleyebilir.

git push -u origin myNewBranch   # Pushes your newly created local branch "myNewBranch"
                                 # to the remote "origin".
                                 # So now a new branch named "myNewBranch" is
                                 # created on the remote machine named "origin"

Bir uzaktan izleme şube uzak şube yerel kopyasıdır. Ne zaman myNewBranchitilir originyukarıdaki komutunu kullanarak, adlı bir uzaktan izleme şube origin/myNewBranchmakinenizde oluşturulur. Bu uzaktan izleme şube uzak şube izler myNewBranchüzerinde origin. Uzaktan izleme şubenizi veya kullanarak uzak şubeyle senkronize olacak şekilde güncelleyebilirsiniz .git fetchgit pull

git pull origin myNewBranch      # Pulls new commits from branch "myNewBranch" 
                                 # on remote "origin" into remote tracking
                                 # branch on your machine "origin/myNewBranch".
                                 # Here "origin/myNewBranch" is your copy of
                                 # "myNewBranch" on "origin"

Bir yerel izleme şube bir olan yerel şube başka bir şube izlenmesidir. Böylece taahhütleri diğer şubeye / şubeden itebilirsiniz. Yerel izleme şubeleri çoğu durumda bir uzaktan izleme şubesini izler. Eğer yerel bir şube bastığınız zaman originkullanılarak git push commandbir ile -u(yukarıda gösterildiği gibi) seçeneği, yerel şube kurmak myNewBranchuzaktan izleme şube izlemek için origin/myNewBranch. Bunu kullanmak git pushve git pullitmek veya çekmek için bir yukarı akış belirtmeden gereklidir .

git checkout myNewBranch      # Switch to myNewBranch
git pull                      # Updates remote tracking branch "origin/myNewBranch"
                              # to be in sync with the remote branch "myNewBranch"
                              # on "origin".
                              # Pulls these new commits from "origin/myNewBranch"
                              # to local branch "myNewBranch which you just switched to.

Yerel izleme dalı tanımı için, uzaktan kumandaya ittikten sonra yerel bir şube ile aynı değil mi?
mskw

2
@ mskw Hayır, yerel bir izleme dalı ve bir yerel (izleme dışı) şube ilişkilendirme açısından farklılık gösterir. Yerel bir dal, hiçbir dalla ilişkili DEĞİLDİR. Sadece yerel makinenizde ayrı bir şube var. Yerel bir izleme dalı, uzak bir izleme dalıyla ilişkilendirilir. Böylece taahhütleri birbirine doğru itebilirsiniz.
SNce

196

İşte uzun cevap.

Uzak:

Git'i birlikte kullanıyorsanız, muhtemelen taahhütlerinizi diğer makinelerle veya konumlarla senkronize etmeniz gerekir. Git'in terminolojisinde her makineye veya konuma uzaktan kumanda denir ve her birinin bir veya daha fazla dalı olabilir. Çoğu zaman, sadece bir tanesine sahip olacaksınız origin. Tüm uzaktan kumandaları listelemek için şunu çalıştırın git remote:

$ git remote
bitbucket
origin

Bu uzak adların hangi konumlar için kısayol olduğunu, git remote -vşunları çalıştırarak görebilirsiniz :

$ git remote -v
bitbucket git@bitbucket.org:flimm/example.git (fetch)
bitbucket git@bitbucket.org:flimm/example.git (push)
origin git@github.com:Flimm/example.git (fetch)
origin git@github.com:Flimm/example.git (push)

Her uzaktan kumandanın altında bir dizin vardır git/refs/remotes/:

$ ls -F .git/refs/remotes/
bitbucket/ origin/

Makinenizdeki şubeler:

TLDR: yerel makinenizde üç tür şubeniz vardır: yerel izleme olmayan şubeler, yerel izleme şubeleri ve uzaktan izleme şubeleri. Uzak bir makinede, sadece bir tür dalınız var.

1. Yerel şubeler

Makinenizdeki tüm yerel şubelerin bir listesini çalıştırarak görüntüleyebilirsiniz git branch:

$ git branch
master
new-feature

Her yerel şubenin altında bir dosya vardır .git/refs/heads/:

$ ls -F .git/refs/heads/
master new-feature

Makinenizde iki tür yerel şube vardır: izlemeyen yerel şubeler ve yerel şubeleri izleme.

1.1 Takip etmeyen yerel şubeler

Takip etmeyen yerel şubeler başka herhangi bir şubeyle ilişkilendirilmez. Koşarak bir tane oluşturursunuz git branch <branchname>.

1.2. Yerel şubeleri izleme

İzleme yerel şubeleri, genellikle bir uzaktan izleme şubesi olan başka bir şubeyle ilişkilendirilir. Koşarak bir tane oluşturursunuz git branch --track <branchname> [<start-point>].

Yerel şubelerinizden hangilerinin şubeleri takip ettiğini görebilirsiniz git branch -vv:

$ git branch -vv
master      b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message

Bu komutun çıktısından, yerel dalın masteruzaktan izleme dalını izlediğini origin/masterve yerel dalın new-featurehiçbir şey izlemediğini görebilirsiniz.

Hangi şubelerin şubeleri takip ettiğini görmenin bir başka yolu da bir göz atmaktır .git/config.

Yerel şubeleri izlemek faydalıdır. Onlar çalışmasına izin git pullve git pushkullanma yukarı hangi dal belirtmeden,. Şube başka bir şubeyi izlemek üzere ayarlanmamışsa, bunun gibi bir hata alırsınız:

$ git checkout new-feature
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream new-feature <remote>/<branch>

2. Uzaktan izleme dalları (hala makinenizde)

Makinenizdeki tüm uzaktan izleme dallarının bir listesini çalıştırarak görüntüleyebilirsiniz git branch -r:

$ git branch -r
bitbucket/master
origin/master
origin/new-branch

Her uzaktan izleme şubesinin altında bir dosya vardır .git/refs/<remote>/:

$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│   └── master
└── origin/
    ├── master
    └── new-branch

Uzaktan izleme dallarınızı, uzak makinelerin içerdiği yerel önbellek olarak düşünün. Sen kullanarak uzaktan izleme dalları güncelleyebilir git fetch, hangi git pullperde arkasında kullanır.

Bir uzaktan izleme şubesine ait tüm veriler makinenizde yerel olarak (önbellek gibi) saklansa da, yine de yerel şube olarak adlandırılmaz. (En azından ben böyle demezdim!) Sadece uzaktan izleme dalı denir.

Uzak makinedeki şubeler:

Tüm uzak dalları (yani uzak makinedeki dalları) aşağıdakileri çalıştırarak görüntüleyebilirsiniz git remote show <remote>:

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:Flimm/example.git
  Push  URL: git@github.com:Flimm/example.git
  HEAD branch: master
  Remote branches:
    io-socket-ip            new (next fetch will store in remotes/origin)
    master                  tracked
    new-branch              tracked
  Local ref configured for 'git pull':
    master     merges with remote master
    new-branch merges with remote new-branch
  Local ref configured for 'git push':
    master     pushes to master     (up to date)
    new-branch pushes to new-branch (fast-forwardable)

Bu git remotekomut, uzak makineyi ağları hakkında şubeleri hakkında sorgular. Yerel makinenizdeki uzaktan izleme dallarını güncellemez, bunun için git fetchveya kullanın git pull.

Çıktıdan, uzak makinede var olan tüm dalları "Uzak dallar" başlığına bakarak görebilirsiniz ("eski" olarak işaretlenmiş satırları yoksayın).

Uzak makinede oturum açabilir ve dosya sisteminde dosya bulabilirseniz, altındaki tüm dallara göz atabilirsiniz refs/heads/.

Kopya kağıdı:

  • İzleme veya izleme dışı bir yerel şubeyi güvenle silmek için:

    git branch -d <branchname>
    
  • İzleme veya izleme dışı bir yerel dalı silmek için zorla:

    git branch -D <branchname>
    
  • Bir uzaktan izleme kolunu silmek için:

    git branch -rd <remote>/<branchname>
    
  • Yeni bir yerel izleme dışı şube oluşturmak için:

    git branch <branchname> [<start-point>]
    
  • Yeni bir yerel izleme dalı oluşturmak için: ( <start-point>Belirtilirse ve şunun gibi bir uzaktan izleme dalıysa origin/foobar, --trackbayrağın otomatik olarak dahil edildiğini unutmayın)

    git branch --track <branchname> [<start-point]
    

    Misal:

    git branch --track hello-kitty origin/hello-kitty
    
  • Uzak makinedeki bir dalı silmek için:

    git push --delete <remote> <branchname>
    
  • Eski olan, yani uzak makinedeki karşılık gelen dalların artık bulunmadığı tüm uzaktan izleme dallarını silmek için:

    git remote prune <remote>
    

Bazı komutlarda kullandığınızı <remote>/<branch>ve diğer komutları, fark etmiş olabilirsiniz <remote> <branch>. Örnekler: git branch origin/hello-kittyve git push --delete origin hello-kitty.

Keyfi gibi görünebilir, ancak eğik çizgi ne zaman ve ne zaman boşluk kullanılacağını hatırlamanın basit bir yolu vardır. Eğik çizgi kullanırken, kendi makinenizdeki bir uzaktan izleme şubesine başvuruyorsunuz, boşluk kullanırken aslında ağ üzerindeki uzak makinedeki bir şubeyle ilgileniyorsunuz.


Git ödeme -b mynewbranch: Şubeyi oluşturup gibi bir cmd şubeye gitmek için kullanacağı
Zeta

Ben boşluk ve eğik çizgi arasındaki fark son noktasını sevdi!
aderchox

12

Yerel şube:

Makinenizde çalışabileceğiniz ve taahhütte bulunabileceğiniz bir şube. Bu dalları ile listeleyebilirsiniz git branch.

Yerel Şube (Takipli):

Uzak bir dala karşılık gelecek şekilde yapılandırılmış sıradan bir yerel dal. Bu yeteneği gibi Benfits sahiptir git pullve git pushdepo ve şube adı belirtmek gerek kalmadan. İzleme ayrıca git statusşubenizin uzaktan kumandanın önünde veya arkasında olduğunda sizi bilgilendirir.

Uzak Şube:

Yalnızca uzak bir depodaki bir dal - tipik olarak GitHub vb. Bir sunucuda.

Uzaktan Takip Şube:

Uzak bir dalın yerel bir kopyası. Bu dal asla düzenlenmemelidir. Amacı, uzak bir dalın mevcut durumunu takip etmektir. Uzaktan izleme dalları ile görüntülenebilir git branch -rve genellikle benzer bir şeye benzeyebilir origin/master(repo adı, ardından eğik çizgi ve şube adı gelir). Koşu git fetch, uzaktan izleme kollarını ilgili uzak kolların durumunu yansıtacak şekilde güncelleyecektir.

git branch -avvmakinemde hangi dalların, hangi dalların uzaktan kumandada olduğunu ve her birinde en son taahhütleri hızlı bir şekilde görüntülemek için kişisel favorim. -aBütün dallar gösterilmesi gereken kısmı belirtir (uzaktan ve yerel). vAyrıntılı bitiş stand 'ın (son gösterir karma ve mesajı taahhüt). @Flimm, ikincisinin vhangi yerel şubenin hangi uzaktan kumandayı izlediğiyle ilgili bilgi eklediğine işaret ettiği için .


1
Yerel izleme ve uzaktan izleme dalları arasındaki farkı anlamıyorum - birincisi kökene, ikincisi uzak makineye karşılık gelir. ama bunlar aynı şey değil mi? Bu genellikle github'da olan repo değil mi?
akantoword

1
@akantoword Cevabı biraz açıklığa kavuşturmak için güncelledim. Temel olarak uzaktan izleme dalı, uzak şubenin çalışmak için tasarlanmamış yerel bir kopyasıdır. İzlemeli yerel bir şube çalışmak içindir.
Eric Mathison
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.