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:
- Uzak depodaki şube:
refs/heads/branchBdiğer deponun içinde
- Sizin uzaktan izleme şube :
refs/remotes/remoteR/branchBin your repo
- Kendi şube:
refs/heads/branchBiç sizin 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
git fetch origin an-other-branchgetirilen ipucunu depolarFETCH_HEAD, ancak saklamazorigin/an-other-branch(yani, normal 'uzaktan izleme dalı'). Yani, biri yapılabilirgit 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 ).