'git pull origin mybranch' yerel mybranch N taahhütlerini başlangıç ​​noktasından önce bırakır. Neden?


92

git pullAnlamadığım garip bir şey gözlemledim .

Cuma günü yerel bir şubede çalıştım. onu arayalım mybranch. Bürodan çıkmadan önce (benim github repo olan) kökenli onu itti: git push origin mybranch.

Dün evde, pullşubemi dizüstü bilgisayarıma aldım, biraz daha kodlama yaptım ve sonra değişikliklerimi github'a (başlangıç) geri gönderdim.

Şimdi tekrar işteyim ve değişiklikleri dünden iş makineme çekmeye çalıştım (hafta sonu iş yerimin yerel deposundaki hiçbir şeyi değiştirmedim):

git pull origin mybranch

bu, hızlı ileri birleştirme işlemine neden oldu, bu iyi. Sonra bir yaptım git statusve şöyle dedi:

# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)

Huh? Hafta sonu bile dokunmadığım ve başlangıç ​​noktasından yeni çıktığım halde nasıl 6 taahhüt önde olabilir? Bu yüzden a koştum git diff origin/mybranchve farklar tam olarak uzaktan aldığım 6 değişiklikti.

Bunu yalnızca şunu çalıştırarak "düzeltebilirim" git fetch origin:

From git@github.com:me/project
af8be00..88b0738  mybranch -> origin/mybranch

Görünüşe göre, yerel depomda bazı referans nesneleri eksikti, ama bu nasıl olabilir? Demek istediğim, bir çekme zaten bir getirme yapıyor ve o dal dışında hiçbir şey üzerinde çalışmadım, bu yüzden a git fetch originve git fetch origin mybranchaynı sonucu almalı mı?

Bunun git pull originyerine her zaman kullanmalı mıyım git pull origin branchname?

Kafam karıştı.


Bunu ben de fark ettim; a git pushda çözecek gibi görünecektir ("her şey güncel" olarak rapor edilir).
Ben James

4
git config --get-regexp br.*yapılandırmanızın yerel bir şubenin başka bir şubeyi takip edip etmediğini size söyleyebilir
VonC

3
git config branch.master.remote yourGitHubRepo.gitWorkRepo yazıp (bir sonraki aşamada git pull origin) durumun 'ileride' uyarısıyla devam edip etmediğini kontrol edebilir misiniz ?
VonC

ayarlanmadı (boş çıktı). ama git remote show originbana kaynağın GitHub depomu işaret ettiğini gösteriyor, bu yüzden sorun olmaz sanırım?
Matthias

1
git remote tek başına (GitHub repo için doğru adresi göstermek) yeterli değildir . A'dan sonra bir " Your branch is ahead" uyarı mesajı almaktan kaçınmak için git pull, önce bir dal için uzak adı da tanımlamanız gerekir . Bu git config branch.master.remote yourGitHubRepo.gityüzden önerim: yazın , ardından a git pullve a'yı deneyin ve git statussorunun devam edip etmediğine bakın.
VonC

Yanıtlar:


115

git pullgit fetchaçıkça getirilen kafaları (veya birleştirmek için yapılandırılmış uzak dal hiçbiri yoksa) geçerli dalla birleştirmeden önce uygun parametrelerle çağrılar .

Sözdizimi: git fetch <repository> <ref>burada <ref>sadece iki nokta üst üste olmayan bir dal adı, belirtilen uzaktaki tüm izlenen dalların standart bir getirmesini yapmayan, bunun yerine sadece adlandırılmış dalı içine alan 'tek vuruşlu' bir getirmedir FETCH_HEAD.

Güncelleme: 1.8.4'ten beri Git sürümleri için, getirmesini istediğiniz referansı izleyen bir uzaktan izleme dalı varsa, izleme dalı şimdi tarafından güncellenecektir fetch. Bu değişiklik, önceki davranışın neden olduğu kafa karışıklığını önlemek için özel olarak yapılmıştır.

Gerçekleştirdiğinizde git pull <repository> <ref>, FETCH_HEADyukarıdaki gibi güncellenir, ardından teslim aldığınız ürünle birleştirilir HEADancak uzak deponun standart izleme dallarının hiçbiri güncellenmez (Git <1.8.4). Bu, yerel olarak uzak şubenin önündeymişsiniz gibi göründüğü anlamına gelir , oysa aslında onunla güncelsiniz.

Kişisel olarak her zaman git fetchtakip git merge <remote>/<branch>ediyorum çünkü birleştirmeden önce zorunlu güncellemelerle ilgili herhangi bir uyarı görüyorum ve ne birleştirdiğimi önizleyebiliyorum. Yaptığımdan git pullbiraz daha fazla kullanırsam, git pullçoğu parametresiz bir düz yapardım zamanın, güvenerek branch.<branch>.remoteve branch.<branch>.merge'doğru şeyi yapma'.


4
+1 Bu gerçekten iyi bir açıklama! Açıklamanın 'git yardım
getirme'nin


1
Öyleyse , getirme standart izleme dallarını güncelleyeceği için bir git fetchsonra git pull <repository> <ref>sorunu çözer miydi? Ayrıca, bu yanıt için teşekkürler, mantıklı
gelmeye

1
Ben de bu konuyla karşılaştım ve git fetchardından yapmanız gerekir git merge origin/master master.
user1027169

3

git remote -v showMenşe geldiğinde ne geri döner?

Kaynak github'ı gösteriyorsa, durum güncel olmalı ve herhangi bir uzak depodan önce olmamalıdır. En azından Git1.6.5 ile hızlı bir test için kullanıyorum.

Her neyse, bundan kaçınmak için, ana dalın uzak deposunu açıkça tanımlayın:

$ git config branch.master.remote yourGitHubRepo.git

sonra a git pull origin master, ardından git statusa temiz bir durum döndürmelidir (ileride yok).
Neden? çünkü get getirme kaynağı yöneticisi (git çekme kaynağı yöneticisine dahil edilmiştir) sadece güncellenmez FETCH_HEAD( Charles Bailey'nin yanıtında açıkladığı gibi ), aynı zamanda yerel Git deponuzdaki "uzak ana dalı" da günceller.
Bu durumda, yerel yöneticiniz artık uzak ana yöneticiden "önde" görünmeyecektir.


Bunu bir git1.6.5 ile test edebilirim:

İlk önce bir çalışma noktası oluşturuyorum:

PS D:\git\tests> cd pullahead
PS D:\git\tests\pullahead> git init workrepo
Initialized empty Git repository in D:/git/tests/pullahead/workrepo/.git/
PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo firstContent > afile.txt
PS D:\git\tests\pullahead\workrepo> git add -A 
PS D:\git\tests\pullahead\workrepo> git commit -m "first commit"

Çıplak bir depo oluşturarak bir GitHub reposunu simüle ediyorum (herhangi bir yerden push alabilen bir repo)

PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone --bare workrepo github

Github deposuna (uzaktan kumanda olarak eklendi) ittiğim çalışma depoma bir modif ekliyorum

PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo aModif >> afile.txt
PS D:\git\tests\pullahead\workrepo> git ci -a -m "a modif to send to github"
PS D:\git\tests\pullahead\workrepo> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo> git push github

GitHub'dan klonlanmış, içinde birkaç değişiklik yaptığım ve GitHub'a gönderilen bir ev deposu oluşturuyorum:

PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone github homerepo
PS D:\git\tests\pullahead> cd homerepo
PS D:\git\tests\pullahead\homerepo> type afile.txt
firstContent
aModif

PS D:\git\tests\pullahead\homerepo> echo aHomeModif1  >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a first home modif"
PS D:\git\tests\pullahead\homerepo> echo aHomeModif2  >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a second home modif"
PS D:\git\tests\pullahead\homerepo> git push github

Daha sonra ilk deney için çalışma raporunu klonladım

PS D:\git\tests\pullahead\workrepo4> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo2
Initialized empty Git repository in D:/git/tests/pullahead/workrepo2/.git/
PS D:\git\tests\pullahead> cd workrepo2
PS D:\git\tests\pullahead\workrepo2> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo2> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
 * branch            master     -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
 afile.txt |  Bin 46 -> 98 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)

Bu depoda, git statüsü, ' origin' ' nin önünde olan ustan bahsediyor :

PS D:\git\tests\pullahead\workrepo5> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

Ancak bu yalnızca origingithub değildir:

PS D:\git\tests\pullahead\workrepo2> git remote -v show
github  d:/git/tests/pullahead/github (fetch)
github  d:/git/tests/pullahead/github (push)
origin  D:/git/tests/pullahead/workrepo (fetch)
origin  D:/git/tests/pullahead/workrepo (push)

Ancak diziyi github'a bir orijini olan (veya hiç menşei olmayan, sadece uzak bir 'github' tanımlı) bir depoda tekrarlarsam durum temizdir:

PS D:\git\tests\pullahead\workrepo2> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo4
PS D:\git\tests\pullahead> cd workrepo4
PS D:\git\tests\pullahead\workrepo4> git remote rm origin
PS D:\git\tests\pullahead\workrepo4> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo4> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
 * branch            master     -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
 afile.txt |  Bin 46 -> 98 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)
PS D:\git\tests\pullahead\workrepo4> git status
# On branch master
nothing to commit (working directory clean)

Ben sadece olsaydı originüzerinde işaretleme github, statusgit1.6.5 için temiz olacaktır.
Daha önceki gitler için 'ileriye' bir uyarı olabilir, ancak yine de, git config branch.master.remote yourGitHubRepo.gitaçıkça tanımlanmış bir kişi , Git'in ilk sürümlerinde bile bunu halledebilmelidir.


Bu konuyu incelemeye zaman ayırdığınız için teşekkürler. Uzak kaynak zaten GitHub depomu gösteriyor. Bu projeyi bir GitHub url'sinden klonladım ve yerel ana şubem orijin / ana şubeyi izliyor. Mybranch'a gelince, onu orijin / şubemden oluşturduğumdan oldukça eminim, bu da onu otomatik olarak takip etmelidir. Ama yine de sorun bu olabilir mi? Yerel şubemin aslında menşei / şubemi takip etmediğini mi? Not: git 1.6.1 kullanıyorum (MacPorts üzerinden).
Matthias

Yerel bir şubenin başka bir şubeyi izlediğini görmeme izin veren bir git komutu var mı? Adam sayfalarında bulamıyorum.
Matthias

Hangi uzak şubelerle takip edildiğini görebilirsiniz git remote show origin.
Ted Percival

2

originKullanarak tüm uzaktan kumandanızı ( orijinal klonunuzla birlikte gelenler hariç) eklemeye dikkat ediyor musunuz git remote add NAME URL? Git config'e yeni eklendiklerinde bu hatayı gördüm.


Depoyu klonlarken bunu yaptım. Ancak bunu her dalda yapmadım. Örneğin, dalım için önce kökeninden, sonra alacağım git checkout -b mybranch origin/mybranch. Git-branch'ın man sayfasına göre, origin / mybranch başlangıç ​​noktasıdır ve ayrıca --track için şunu belirtir: "... Her zaman aynı yukarı akış dalından yeni dala çekiyorsanız bunu kullanın ve "git pull <repository> <refspec>" i açıkça kullanmak istemiyorsanız. Başlangıç ​​noktası uzak dal olduğunda bu davranış varsayılandır. "
Matthias
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.