Bir Uzaktan İzleme Dalından nasıl 'git getirme' ve 'git birleştirme' ('git çekme' gibi)


111

Git'te bazı uzaktan izleme şubeleri kurdum, ancak onları 'git fetch' ile güncelledikten sonra bunları yerel şubede birleştiremeyecek gibi görünüyorum.

Örneğin, 'diğer-dal' adında bir uzak şubem olduğunu varsayalım. Bunu yerel olarak bir izleme dalı olarak kurdum

git branch --track an-other-branch origin/an-other-branch

Çok uzak çok iyi. Ancak bu dal güncellenirse (genellikle ben makineyi hareket ettirip o makineden devreye alarak) ve onu orijinal makinede güncellemek istersem, getir / birleştir ile sorun yaşıyorum:

git fetch origin an-other-branch
git merge origin/an-other-branch

Bunu ne zaman yapsam, 'Zaten güncel' mesajı alıyorum ve hiçbir şey birleşmiyor.

Ancak, bir

git pull origin an-other-branch

her zaman beklediğiniz gibi günceller.

Ayrıca git diff çalıştırılıyor

git diff origin/an-other-branch

farklılıklar olduğunu gösteriyor, bu yüzden söz dizimimin yanlış olduğunu düşünüyorum.

Neyi yanlış yapıyorum?

DÜZENLEME [2010-04-09]: Birkaç kez kontrol ettim ve kesinlikle farklı bir şubede değilim. Benim 'git getirme' ve ardından bir 'git birleştirme' (yukarıda gösterildiği gibi) git çekme ile aynı şeyi mi yapmalı? Git durumunun vb. Sonuçlarını gösteren bazı iş akışları alacağım.

Yanıtlar:


170

Bir şube getirmezseniz, tüm bir uzaktan kumanda alırsınız:

git fetch origin
git merge origin/an-other-branch

8
Daha fazla ayrıntı: git fetch origin an-other-branchgetirilen ipucunu depolar FETCH_HEAD, ancak saklamaz origin/an-other-branch(yani, normal 'uzaktan izleme dalı'). Yani, biri yapılabilir git fetch origin an-other-branch && git merge FETCH_HEAD, ancak bunu @Gareth'in söylediği gibi yapmak daha iyidir (ya da sadece git pull kullanın ).
Chris Johnsen

yani eğer köken 1000 şubeye sahipse, hepsi için uzak bir şube olursunuz?
Gauthier

4
Elbette. Benimkine 1000 şubeli bir uzak depo eklersem ve uzaktan kumandanın hangi şubelerine sahip olduğunu sorarsam, bana 1000'in tamamını versen iyi olur
Gareth

olacaktır git merge origin/an-other-branchbirleştirme origin/an-other-branchonu izlemek için ayarlanmış tüm yerel kola? nasıl tek bir yerel şubeyle birleşebilirim?
ampfibient

1
Öyleyse git pull(argümansız) ne yapar - hangi dalı birleştirir? Mevcut şubeye karşılık gelen uzaktan izleme şubesini birleştiriyor mu ?
The Red Pea

69

Yalnızca bir dal seçmek: fetch/ merge vs. pull

İnsanlar genellikle size "getirme" ile "birleştirme" yi ayırmanızı tavsiye eder. Bunun yerine diyorlar:

    git pull remoteR branchB

Bunu yap:

    git fetch remoteR
    git merge remoteR branchB

Bahsetmedikleri şey, böyle bir getirme komutunun aslında tüm dalları uzak depodan alacağıdır, bu çekme komutunun yaptığı şey değildir . Uzak depoda binlerce şubeniz varsa ancak hepsini görmek istemiyorsanız, bu belirsiz komutu çalıştırabilirsiniz:

    git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
    git branch -a  # to verify
    git branch -t branchB remoteR/branchB

Tabii ki, bunu hatırlamak gülünç derecede zor, bu yüzden tüm dalları .git/configalmaktan gerçekten kaçınmak istiyorsanız , ProGit'te açıklandığı şekliyle değiştirmek daha iyidir.

Ha?

Tüm bunların en iyi açıklaması ProGit, Git Internals - The Refspec'in 9-5.Bölümünde ( veya github aracılığıyla ). Bunu Google üzerinden bulmak inanılmaz derecede zor.

Öncelikle bazı terminolojiyi temizlememiz gerekiyor. Uzaktan şube izleme için genellikle dikkat edilmesi gereken 3 farklı dal vardır:

  1. Uzak depodaki şube: refs/heads/branchBdiğer deponun içinde
  2. Sizin uzaktan izleme şube : refs/remotes/remoteR/branchBin your repo
  3. Kendi şube: refs/heads/branchBsizin repo

Uzaktan izleme dalları (giriş refs/remotes) salt okunurdur. Bunları doğrudan değiştirmezsiniz. Kendi şubenizi değiştirirsiniz ve ardından uzak depodaki ilgili şubeye itersiniz. Sonuç, refs/remotesuygun bir çekme veya getirme işlemine kadar size yansıtılmaz . Bu ayrımı git man sayfalarından anlamak benim için zordu, çünkü yerel şubenin ( refs/heads/branchB) .git/configtanımlandığında uzaktan izleme şubesini "izlediği" söylendi branch.branchB.remote = remoteR.

'Referansları' C ++ işaretçileri olarak düşünün. Fiziksel olarak, SHA özetleri içeren dosyalardır, ancak temelde sadece commit ağacına işaretçilerdir. git fetchcommit-ağacınıza birçok düğüm ekleyecektir, ancak git'in hangi işaretçileri hareket ettireceğine nasıl karar vereceği biraz karmaşıktır.

Başka bir cevapta belirtildiği gibi , hiçbiri

    git pull remoteR branchB

ne de

    git fetch remoteR branchB

hareket ederdi refs/remotes/branches/branchBve ikincisi kesinlikle hareket edemez refs/heads/branchB. Ancak ikisi de hareket ediyor FETCH_HEAD. (Sen olabilir catiçeride bu dosyalardan herhangi birini .git/. Onlar değiştirdiğinizde görmek için) Ve git mergesevk edecektir FETCH_HEADolurken ayarı MERGE_ORIG, vb


1
Git Internals'a olan bağlantınızın bu aynı soruya bir bağlantı olduğunun farkında mısınız?
Shahbaz

9

Birleşirken yerelde olduğunuza emin misiniz an-other-branch?

git fetch origin an-other-branch
git checkout an-other-branch
git merge origin/an-other-branch

Başka bir açıklaması :

birleştirmeye çalıştığınız şubedeki tüm değişiklikler, şu anda bulunduğunuz şubeyle zaten birleştirilmiştir.
Daha spesifik olarak, birleştirmeye çalıştığınız dalın mevcut şubenizin bir ebeveyni olduğu anlamına gelir.

uzak depodan tek bir taahhütle öndeyseniz, bu güncel olmayan uzak depodur, siz değilsiniz.

Ama sizin durumunuzda, eğer git pullişe yarıyorsa, bu sadece doğru dalda olmadığınız anlamına gelir.


3

Git çekme aslında bir combo araçtır: git fetch (değişiklikleri alır) ve git merge (bunları mevcut kopyanızla birleştirerek) çalıştırır.

Doğru şubede olduğunuza emin misiniz?


Bence OP farklı. şube, bana olur.
Chaklader Asfak Arefe

1

komutlar şunlardır:

git fetch origin
git merge origin/somebranch somebranch

Bunu ikinci satırda yaparsanız:

git merge origin somebranch

yerel yöneticiyi mevcut şubenizle birleştirmeye çalışacaktır.

Soru, anladığım kadarıyla, zaten yerel olarak getirilmiş olmanız ve şimdi şubenizi aynı şubenin en sonuncusu ile birleştirmek istemenizdi .

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.