Git, GitHub'dan belirli bir dalı çeker


631

Birden fazla şubesi olan bir projem var. Onları GitHub'a itiyorum ve şimdi başka biri proje üzerinde çalışıyor, şubelerini GitHub'dan çekmem gerekiyor. Ustada iyi çalışıyor. Ama birisinin bir şube oluşturduğunu söyle xyz. Nasıl şube indirebiliriz xyzGitHub ve şube içine birleştirme xyzon my localhost?

Aslında cevabım burada: Git'teki dalları it ve çek

Ama "! [Reddedildi" "hatası alıyorum ve" hızlı ilerlemiyor "hakkında bir şey alıyorum.

Herhangi bir öneri?


3
çalıştırdığınız gerçek komut nedir?
Alex N.10

1
'Hızlı ileri alma' mesajı ile başarısız olabilen getirme. Uzaktan izleme kolunu (orijin / xyz) değiştirdiniz mi veya şube uzak depoda yeniden sarıldı / yeniden mi yazıldı? " git fetch origin --force" Kullanmanız gerekiyor , ancak yapmadan önce lütfen belgeleri okuyun.
Jakub Narębski

Yanıtlar:


758

Ama "! [Reddedildi" "hatası alıyorum ve" hızlı ilerlemiyor "hakkında bir şey alıyorum

Bunun nedeni Git'in dallardaki değişiklikleri mevcut master'ınıza birleştirememesidir. Diyelim ki şubeyi kontrol masterettiniz ve uzak şubede birleştirmek istiyorsunuz other-branch. Bunu yaptığınızda:

$ git pull origin other-branch

Git temelde bunu yapıyor:

$ git fetch origin other-branch && git merge other-branch

Yani, a pullsadece fetcha'yı izler merge. Ancak, pull-ing, Git olacak sadece birleştirme other-branch eğer bir gerçekleştirebilirsiniz hızlı ileri birleştirme. Bir hızlı ileri birleştirme içine birleştirme çalıştığınız il başkanı bir olduğu bir birleştirme olduğunu soyundan Birleştirmek istediğiniz şube başkanı. Örneğin, bu geçmiş ağacınız varsa, birleştirme other-branchhızlı ileri bir birleşmeye neden olur:

O-O-O-O-O-O
^         ^
master    other-branch

Ancak bu olurdu değil ileri sarma birleştirme be:

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

Sorununuzu çözmek için, ilk getir uzaktan şube:

$ git fetch origin other-branch

Ardından mevcut şubenizle birleştirin (bunu varsayacağım master) ve birleştirme çakışmalarını düzeltin:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

Hayır, sorun birleştirme adımıyla değil getirme ile ilgilidir.
Jakub Narębski

3
Normalde, uzaktan kumandalar, hızlı ileri alma işlemiyle sonuçlanmasa bile getirmeler zorlanacak şekilde ayarlanır, bu nedenle OP her zamanki yapılandırmada bir şey değiştirmedikçe getirme işleminde gerçekleşmemelidir. Hızlı ileri alma getirme veya birleştirme sırasında ortaya çıkabilir . Sorunun kesinlikle birleştirme değil, getirme olduğunu söyleyen şey nedir?
mipadi

Bu adımları izliyorum (getirme, birleştirme). Git bana yapacak bir şey olmadığını söylüyor. Taahhüt etmeye çalıştığımda, hızlı ileriye doğru inilti.
Jean Jordaan

1
@mipadi Jean ile aynı sorunu yaşadım ve uzaktan kumandanın bahsettiğim varsayılan olmayan şekilde kurulduğunu söyleyemem, sorunumu çözdüğümü söyleyebilirim git fetch -f! Teşekkürler!
cregox

1
Bu, uzak dalı xzyyerel mastersoruyla birleştirir; bu, orijinal sorunun ima ettiği şey değildir; "Xyz dalını GitHub'dan nasıl alabilir ve localhost'umdaki xyz dalına nasıl birleştirebilirim?"
user5359531

301

Uzak dallarınızı açıkça takip edin ve basit bir git pullşekilde istediğinizi yapın:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

İkincisi yerel bir işlemdir.

Ya da çatalla ilgili GitHub belgelerine daha fazla uymak :

git branch -f new_local_branch_name upstream/remote_branch_name

39
'Geçerli bir nesne adı değil:' origin / remote_branch_name 'alırsanız, önce' git fetch origin 'yapın.
Martin Konicek

130

Bir dalı aşağıdaki komutlarla bir şubeye çekebilirsiniz.

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

Ana şubedeyken, önce aşağıdaki gibi bir şubeye de ödeme yapabilirsiniz:

git checkout -b xyz

Bu, master'dan yeni bir dal "xyz" oluşturur ve doğrudan denetler.

Sonra şunları yaparsınız:

git pull origin xyz

Bu, yeni dalı yerel xyzşubenize çeker .


1
Mükemmel! Ben sadece sözdizimi bilmiyordum: git pull {repo} {remotebranchname}: {localbranchname}. Soru, eğer bu çekiş işe yaramazsa (belki biri şubeyi güncelledi ve birleştirme çakışmaları olurdu) seçeneklerim nelerdir?
Costa

7
Bunu aşağı indiriyorum, çünkü uzak dalı geçerli dalınıza (örn. Ana) birleştirmeye çalışıyor. Çoğu insanın yapmak istediği bu değildir ve OP'nin istediği bu değildir. @Mohit'in cevabı doğru seçimdir.
Phrogz

1
Phrogz - Git'in son sürümlerinde bu davranış değişmiş gibi görünüyor. Bunu daha önce kullandım ve çok iyi çalıştı.
Pawan

88

En iyi yol:

git checkout -b <new_branch> <remote repo name>/<new_branch>

1
Github'da yeni bir "dev" dalı oluşturduktan ve yukarıdakileri denedikten sonra şu hata iletisini aldım: "fatal: origin / dev bir taahhüt değil ve ondan bir 'dev' dalı oluşturulamıyor" Çözüm " Bradley Flood'un aşağıdaki çözümü uyarınca getirin ve sonra mohit'in cevabını tekrar çalıştırın.
TomEberhard

46

git fetch en son şube listesini alacak.

Şimdi yapabilirsin git checkout MyNewBranch

Tamamlandı :)


Daha fazla bilgi için dokümanlara bakın: git fetch


37

Sorunu tam olarak anladığımdan emin değilim, ancak mevcut bir dalı çekmek şu şekilde yapılır (en azından benim için çalışıyor :)

git pull origin BRANCH

Bu, yerel şubenizin başlangıç ​​/ ŞUBE dışında oluşturulduğunu varsayar.


15

Bu, uzak dalı diğerine birleştirmeden önce almama yardımcı oldu:

git fetch repo xyz:xyz
git checkout xyz

8

Basitçe söylemek gerekirse, Şubeyi GitHub'dan çekmek istiyorsanız the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want

3
git pull <gitreponame> <branchname>

Genellikle kodunuza yalnızca repo atanmışsa, gitreponame kaynak olur.

Biri yerel, diğeri uzaktan kumanda gibi iki repo üzerinde çalışıyorsanız, repo'nun listesini git remote -v'den kontrol edebilirsiniz. . bu, geçerli kodunuza kaç repo atandığını gösterir.

BranchName karşılık gelen gitreponame içinde olmalıdır.

repo eklemek veya kaldırmak için aşağıdaki iki komutu kullanabilirsiniz

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>

2

ayrıca yapabilirsin

git pull -r origin master

varsa birleştirme çakışmalarını düzelt

git rebase --continue

-r rebase içindir. Bu sizi şube yapısından

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

için

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

Bu daha temiz bir geçmişe yol açacaktır. Not: Diğer dalınızı başlangıç ​​noktasına (veya başka bir uzaktan kumandaya) ittiyseniz, yeniden dalmadan sonra dalınızı zorla itmeniz gerekebilir.

git push -f origin other-branch

1

yaptım

git branch -f new_local_branch_name origin/remote_branch_name

Onun yerine

git branch -f new_local_branch_name upstream/remote_branch_name

@İnnaM tarafından önerildiği gibi. Akış yukarı sürümü kullandığımda, 'ölümcül: Geçerli bir nesne adı değil:' akış yukarı / uzak_branch_adı '' yazdı. Ben yapmadım git fetch originYorum önerildiği gibi, ancak bunun yerine basitçe değiştirilmesi upstreamile origin. Sanırım eşdeğerler.


0

şubeyi GitHub'dan çekmek için kullanabilirsiniz

git checkout --track origin/the-branch-name

Şube adının tamamen aynı olduğundan emin olun.

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.