Başka birinin deposundan uzak dal nasıl çekilir


266

GitHub'da barındırılan ve birisi çatallanmış bir projem var. Çatallarında yeni bir dal "foo" oluşturdular ve bazı değişiklikler yaptılar. "Foo" larını repo'mda "foo" olarak da adlandırılan yeni bir şubeye nasıl çekebilirim?

Bana bir talepte bulunabileceklerini anlıyorum, ama bu süreci kendim başlatmak istiyorum.

Aşağıdakileri varsayalım:

  1. Projemi çatalladıkları için her iki depomuz da aynı 'tarihi' paylaşıyor
  2. GitHub projelerinin benimkinden çatallandığını göstermesine rağmen, yerel depomda bu kişinin projesine herhangi bir referans yok. Onlarınkini uzaktan kumanda olarak eklemem gerekir mi?
  3. Henüz "foo" adında bir şubem yok - bunu önce kendim oluşturmam gerekip gerekmediğini bilmiyorum.
  4. Bunun kesinlikle efendime değil, ayrı bir şubeye çekilmesini istiyorum.

Yanıtlar:


349
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

Bu foo, uzak dalı izleyerek yerel bir şube kuracaktır coworker/foo. İş arkadaşınız bazı değişiklikler yaptığında, bunları kolayca çekebilirsiniz:

git checkout foo
git pull

Yorumlara yanıt:

Harika :) Ve bu dalda kendi değişikliklerimi yapmak istersem, "foo" dan ikinci bir yerel şube "bar" oluşturmalı ve doğrudan "foo" yerine orada çalışmalı mıyım?

Tavsiye etmeme rağmen yeni bir şube oluşturmanıza gerek yok. Doğrudan fooiş arkadaşınızın da şubenizi çekmesini isteyebilirsiniz . Ancak bu dal zaten var ve şubenizin foobir akış yukarı dalı olarak kurulması gerekiyor:

git branch --set-upstream foo colin/foo

varsayalım colinki deponuz (iş arkadaşlarınızın deposuna bir uzak) benzer şekilde tanımlanmıştır:

git remote add colin git://path/to/colins/repo.git

3
Çok hızlıydı :) git://Yerine, diğer kişinin GitHub depo sayfasındaki URL'yi kullanması gerektiğini eklemek isteyebilirsiniz //path/to/coworkers/repo.git. (Cevabımı çok yavaş yapan şey buydu;))
Mark Longair

Harika :) Ve bu dalda kendi değişikliklerimi yapmak istersem, "foo" dan ikinci bir yerel şube "bar" oluşturmalı ve doğrudan "foo" yerine orada çalışmalı mıyım?
Colin O'Dell

Yoksa doğrudan "foo" umda çalışmak ve daha sonra değişikliklerini çekmek / birleştirmek güvenli midir? Buradaki en iyi uygulama hangisidir?
Colin O'Dell

1
Mükemmel, tam da aradığım şey :) Yardımınız için teşekkürler !!
Colin O'Dell

1
3 dakika içinde güzel cevap!
Tieme

103

Hayır, uzaktan kumanda olarak eklemenize gerek yoktur. Bu hantal ve her seferinde yapılacak bir acı olurdu.

Taahhütlerini almak:

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch

Bu, onlar için ournameforbrancholanla tamamen aynı adlı bir yerel şube oluşturur theirbranch. Soru örneği için son argüman olurdu foo:foo.

:ournameforbranchKendi şubelerinizden biriyle çelişmeyen bir isim düşünmek rahatsız ediciyse not kısmı daha fazla bırakılabilir. Bu durumda, çağrılan bir başvuru FETCH_HEADkullanılabilir. Şunları yapabilirsiniz git log FETCH_HEADkendi kaydedilmesini sonra gibi şeyler yapmak görmek için cherry-pickedonların kaydedilmesini seçmenin kiraz.

Onları geri itmek:

Çoğu zaman, bir şeylerini düzeltmek ve hemen geri itmek istersiniz . Bu da mümkün:

git fetch git@github.com:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push git@github.com:theirusername/reponame.git HEAD:theirbranch

Çalışan Eğer müstakil devlet sizi endişelendiriyor, elbette bir dal kullanarak oluşturmak :ournameforbranchve değiştirme FETCH_HEADve HEADyukarıda ournameforbranch.


2
Bunun için teşekkür ederiz, hem siz hem de diğer kişi aynı şekilde adlandırılmış şubelere sahipseniz (varsayılan masterşube gibi ) diğer yanıt çalışmaz
İş

2
Github hesabınızla ilişkili SSH anahtarı gibi bir şey yoksa bu yöntemin işe yaramayacağını belirtmek gerekir, bkz. Stackoverflow.com/questions/12940626
Przemek D

repolarına zorlayabilmeniz için ortak çalışan olarak eklenmenize gerek yok mu?
Tatlım

@ Kesinlikle! Zorlama, uzak uçta zorlamak için gerekli izinlere sahip olduğunuzu varsayar. Aynı şekilde getirme de yolun erişilebilir olduğunu varsayar.
antak

Eğer çalıştırırsanız git branch -m newbranchbu müstakil halde iken, git onun kafayı ve Repo artık geçerli değil diyerek başlayacak. git initdüzeltmek ve "newbranch" adlı şube ile daha önce veya daha az bulunduğunuz duruma geri koymak gibi görünüyor.
Ian Hickson

14

Antak'ın cevabı:

git fetch git@github.com:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

sana verir:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Sonra (Przemek D'nin tavsiyelerine uyarak) kullanın

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>

6

Aşağıda, başka bir kullanıcının çatalından PR dalını kontrol etmek için GitHub ile çalışan güzel bir çözüm var. Çekme isteği kimliğini (GitHub'ın PR başlığıyla birlikte görüntülediği) bilmeniz gerekir.

Misal:

Senin güvensiz kod Tespit 8.
Alice 1'e taahhüt birleşmek istiyor your_repo:masterdanher_repo:branch

git checkout -b <branch>
git pull origin pull/8/head

Uzaktan kumandanızı farklıysa değiştirin origin.
Yerine 8doğru çekme istek kimliği ile.


2
Bu daha fazla oy gerekiyor. pe3rfectly çalışır ve en çok oy alan cevap ile alıyordu "ölümcül: Uzaktan ref bulunamadı" hata kaçındı. Teşekkürler!
Michael Romrell

2 satır kolay kod. Bunu paylaştığın için teşekkürler! Bundan daha tatlı olan tek şey, güncellemeleri kolay bir şekilde çekme isteğine geri getirmektir.
klewis

4

GitHub'ın önceki cevaplara göre yeni bir seçeneği var, sadece komut satırlarını PR'dan kopyalayın / yapıştırın:

  1. MergeVeya Squash and mergedüğmesini görmek için PR'ın altına gidin
  2. Sağdaki bağlantıyı tıklayın: view command line instructions
  3. Adım 1'in sağındaki Kopyala simgesine basın
  4. Komutları terminalinize yapıştırın

2

Çatallı repo korunuyorsa, doğrudan itemezsiniz ve amacınız foolarında değişiklik yapmaksa, şube foolarını deponuza şu şekilde almanız gerekir:

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

Artık foo'nun yerel bir kopyası var ve bununla ilişkili yukarı akış yok. Değişiklik yapabilir (veya etmeyebilir) ve sonra foo'yu kendi uzak repoma gönderebilirsin.

git push --set-upstream origin foo

Şimdi foo GitHub'daki deponuzda ve yerel foo'nuz onu izliyor. Eğer foo'da değişiklik yapmaya devam ederse, onların getirisini yapabilir ve foo'nuzla birleşebilirsiniz.

git checkout foo 
git fetch protected_repo
git merge protected_repo/foo
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.