GitHub çatallı havuzunu nasıl güncelleyebilirim?


3604

Kısa süre önce bir projeyi çatalladım ve birkaç düzeltme uyguladım. Daha sonra kabul edilen bir çekme isteği oluşturdum.

Birkaç gün sonra başka bir katılımcı tarafından başka bir değişiklik yapıldı. Yani çatalım bu değişikliği içermiyor.

Bu değişikliği çatalıma nasıl alabilirim? Katkıda bulunacak başka değişikliklerim olduğunda çatalımı silmeli ve yeniden oluşturmam gerekir mi? Yoksa bir güncelleme düğmesi var mı?


120
Bu, github kullanıcı arayüzünden de yapılabilir. [Bu afişe] [1] kredi vermek istiyorum. [1]: stackoverflow.com/a/21131381/728141
Mike Schroll

2
Bu konuda başka bir iyi blog yazısı - GitHub Çatal Güncellenme
Arup Rakshit

3
Bunu Github yardım makalelerinde buldum
Pranav


İşte iki github hesabı kullanarak bunu yapan bir video demosu youtube.com/watch?v=kpE0gTX4ycE
lifebalance

Yanıtlar:


3980

Çatallı deponuzun yerel klonuna, orijinal GitHub deposunu "uzak" olarak ekleyebilirsiniz. ("Uzaktan kumandalar", depoların URL'lerinin takma adlarına benzer - originörneğin bir tanesidir.) Ardından, bu yukarı akış deposundan tüm dalları alabilir ve yukarı akış sürümü üzerinde çalışmaya devam etmek için çalışmanızı yeniden başlatabilirsiniz. Şuna benzeyen komutlar açısından:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

Ana dalınızın geçmişini yeniden yazmak istemiyorsanız (örneğin, başkaları onu klonlamış olabilir), son komutu yerine koymalısınız git merge upstream/master. Ancak, olabildiğince temiz olan daha fazla çekme isteği yapmak için, muhtemelen yeniden temellendirmek daha iyidir.


Şubenizi yeniden oluşturduysanız, Push'u upstream/masterGitHub'daki kendi çatallı deponuza itmek için zorlamanız gerekebilir. Bunu şu şekilde yaparsınız:

git push -f origin master

Sadece -filk kez tamir edildikten sonra kullanmanız gerekir .


94
Çatalınız sadece github'da bulunduğundan ve github'un web arayüzü üzerinden birleştirme yapmak için araçları olmadığından, doğru cevap yukarı akış birleştirmesini yerel olarak yapmak ve değişiklikleri çatalınıza geri itmektir.
Tim Keating

29
İşte github ile çalışırken bulduğum harika bir öğretici: gun.io/blog/how-to-github-fork-branch-and-pull-request
Tim Keating

50
Hızlı bir not, temiz durumla başladığınızdan emin olmak için kendi ana dalınızı yeniden oluşturmak yerine, muhtemelen ayrı bir dal üzerinde çalışmanız ve bundan bir talepte bulunmanız gerekir. Bu, ustanızı gelecekteki herhangi bir birleştirme için temiz tutar ve -fsürümünüzü klonlayabilen herkesi karıştıran geçmişi yeniden yazmak zorunda kalmaz.
Mateusz Kowalczyk

11
Rebase komutu yerine, aşağıdakileri kullandım: git merge --no-ff upstream/masterBu şekilde taahhütleriniz artık üstte değil.
Steckdoserich

52
Başka bir Git hatası. Bu araçların dağıtılmış işbirliğini desteklemesi gerekiyorsa, temel bir iş akışı gerçekleştirmek neden bu kadar zor? 4 milyon kişi ve 2200 upvot, aracın başarısız olduğu anlamına geliyor. 'Uzak "Bir orijinal GitHub depo ekleyebilir' -?? o çatal sırasında yapılmazsa Neden Neden biri bile bu ilgisi var ne yani bu araç hakkında bozuldu?
JWW

740

Mayıs 2014'ten itibaren, doğrudan GitHub'dan bir çatalı güncellemek mümkündür. Bu hala Eylül 2017 itibariyle çalışıyor, ancak kirli bir taahhüt tarihine yol açacak.

  1. GitHub'da çatalını aç.
  2. Tıklayın Pull Requests.
  3. Tıklayın New Pull Request. Varsayılan olarak GitHub orijinali çatalınızla karşılaştırır ve herhangi bir değişiklik yapmadıysanız karşılaştırılacak hiçbir şey olmamalıdır.
  4. Click switching the basebu bağlantıyı görürseniz. Aksi takdirde, base forkaçılır menüyü manuel olarak çatalınıza ve head forkyukarı akış yönünde ayarlayın. Şimdi GitHub çatalınızı orijinal ile karşılaştırır ve en son değişiklikleri görmeniz gerekir. resim açıklamasını buraya girin
  5. Create pull requestve çekme isteğinize tahmin edilebilir bir ad atayın (ör Update from original.).
  6. Sayfasına ilerleyin Merge pull request, ancak henüz hiçbir şeyi tıklamayın.

Şimdi üç seçeneğiniz var, ancak her biri temiz olmayan bir taahhüt geçmişine yol açacak.

  1. Varsayılan, çirkin bir birleştirme taahhüdü oluşturur.
  2. Açılır menüyü tıklayıp "Squash and merge" seçeneğini seçerseniz, araya giren tüm taahhütler bir tanesine sıkıştırılır. Bu çoğu zaman istemediğiniz bir şeydir.
  3. Tıklarsanız Rebase and merge, bütün kaydedilmesini, orijinal PR sizin PR bağlanacaktır "ile" yapılacaktır ve GitHub gösterecektir This branch is X commits ahead, Y commits behind <original fork>.

Yani evet, GitHub web kullanıcı arayüzünü kullanarak repo'yu akış yukarı ile güncel tutabilirsiniz, ancak bunu yapmak taahhüt geçmişinizi somutlaştıracaktır. Stick komut satırı yerine - bu kolay.


19
Bu bir kez harika çalıştı. Bu işlem ikinci kez aynı şekilde çalışmadı: "Tabanı değiştirme" bağlantısı gösterilmedi. Ve "Bir çekme isteği oluşturmak için tıklayın" tuşuna bastığımda, SOURCE repo'da bir PR yarattı. İstediğim DEĞİL ..
javadba

29
Hala çalışıyor (Marchi 2015), "Tabanı değiştirmek" bağlantısı artık orada değil. "Base" açılır menüsünü değiştirmeniz gerekir, böylece her iki çatal işaret ve daha sonra "İstediğiniz yere götürecek" depolar arasında karşılaştır "istemi alırsınız.
mluisbrown

8
Nisan 2015. Çalışır. Teşekkürler. "Üssüne geçiyorum". Ancak, 6. adım "Çekme isteği oluştur" -> yorum girin -> "Çekme isteği oluştur" idi. Orijinalinden 1 taahhüt ile sonuçlanır.
cartland

5
@cartland (ya da diğerleri) - evet, "Bu şube 1 taahhütten öte ..." diyor Bu endişelenecek bir şey mi? Bu mesajdan kurtulmak mümkün mü?
RenniePet

11
sadece güncelleme veya senkronizasyon düğmesi ile daha iyi olmaz mıydı!
transformatör

456

GitHub'ın çatal senkronizasyonu ile ilgili resmi belgesi :

Çatal senkronizasyonu

Kurulum

Senkronize edebilmeniz için, yukarı akış deposuna işaret eden bir uzaktan kumanda eklemeniz gerekir. Başlangıçta çatallandığınızda bunu yapmış olabilirsiniz.

İpucu: Çatalınızı senkronize etmek, yalnızca deponun yerel kopyasını günceller; GitHub'daki havuzunuzu güncellemez.

$ git remote -v
# List the current remotes
origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

$ git remote add upstream https://github.com/otheruser/repo.git
# Set a new remote

$ git remote -v
# Verify new remote
origin    https://github.com/user/repo.git (fetch)
origin    https://github.com/user/repo.git (push)
upstream  https://github.com/otheruser/repo.git (fetch)
upstream  https://github.com/otheruser/repo.git (push)

Senkronize ediliyor

Deponuzu yukarı akışla senkronize etmek için iki adım gerekir: önce uzaktan kumandadan getirmeniz, ardından istediğiniz dalı yerel şubenizle birleştirmeniz gerekir.

getiriliyor

Uzak depodan getirilmesi, şubelerini ve ilgili taahhütlerini getirecektir. Bunlar, yerel şubenizde özel şubeler altında saklanır.

$ git fetch upstream
# Grab the upstream remote's branches
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
 * [new branch]      master     -> upstream/master

Şimdi yukarı akış ana dalını yerel bir dalda, yukarı akış / ana depoda sakladık

$ git branch -va
# List all local and remote-tracking branches
* master                  a422352 My local commit
  remotes/origin/HEAD     -> origin/master
  remotes/origin/master   a422352 My local commit
  remotes/upstream/master 5fdff0f Some upstream commit

birleştirme

Şimdi yukarı akış deposunu getirdik, değişikliklerini yerel şubemizle birleştirmek istiyoruz. Bu, şubemizi yerel değişikliklerimizi kaybetmeden yukarı akışla senkronize edecektir.

$ git checkout master
# Check out our local master branch
Switched to branch 'master'

$ git merge upstream/master
# Merge upstream's master into our own
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

Yerel şubenizde benzersiz bir taahhüt yoksa git yerine "hızlı ileri sarma" gerçekleştirir:

$ git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

İpucu: GitHub'dan üzerinde depoyu güncellemek isterseniz talimatları burada


1
Bu, yerel çatalımı günceller, ancak Github.com'daki çatalım hala "43 işlem gerçekleştiriyor" diyor. Ana değişiklikleri Github.com çatalımla birleştirmek için kendime bir çekme isteği oluşturmak için lobzik tekniğini kullanmak zorunda kaldım.
Michael McGinnis

11
@MichaelMcGinnis Yerel olarak birleştikten sonra, değişikliklerinizi github'a aktarmanız gerekir. git push origin master
jumpnett

1
İtmek için akıllı olabilir --follow-tags: stackoverflow.com/a/26438076/667847
kenny

1
Bunu tüm şubeler için ayrı ayrı yapmalıyım git merge upstream/master, daha sonra şube geliştirmek ve kontrol etmek için kontrol etmeliyimgit merge upstream/develop
Shobi

stackoverflow.com/a/14074925/470749 bana yardımcı oldu çünkü Permission denied (publickey). fatal: Could not read from remote repository.Facebook'un Github hesabından yukarı akış getirmeye çalışırken alıyordum .
Ryan

98

Birçok yanıt, çatalınızı ana depodan bir adım önde hareket ettirir . Bu cevap, burada bulunan ve çatalınızı ebeveyni ile aynı çalışmaya yönlendirecek adımları özetler .

  1. Dizini yerel deponuzla değiştirin.

    • Değilseniz ana şubeye geçin git checkout master
  2. Üst öğeyi uzak depo olarak ekleyin, git remote add upstream <repo-location>

  3. Konu git fetch upstream
  4. Konu git rebase upstream/master

    • Bu aşamada yazarak birleştirilecekleri taahhüt edip etmediğinizi kontrol edersiniz git status
  5. Konu git push origin master

Bu komutlar hakkında daha fazla bilgi için 3. adıma bakın .


13
@ MT: Bu komutları nereye giriyorsunuz? Sorunun özü, anladığım kadarıyla, kişisel GitHub çatalınızı ana proje ile nasıl yeniden senkronize edeceğiniz ve bunları GitHub'dan nasıl yapacağınız . Başka bir deyişle, uzak çatalınızı yerel bir depo olmadan nasıl güncelleyebilirsiniz ?
John Y

4
@JohnY GitHub kullanımı her zaman fazladan bir taahhüt oluşturur. Bu ekstra taahhütten kaçınmak için tüm bunları yerel bir repodaki bir kabukta yapmanız gerekir.
Jonathan Cross

48

Önsöz: Çatalınız "başlangıç ​​noktası" ve çatallandığınız depo "yukarı akış" tır.

Diyelim ki zaten çatalınızı bilgisayarınıza böyle bir komutla klonladınız:

git clone git@github.com:your_name/project_name.git
cd project_name

Bu verilirse, bu sırayla devam etmeniz gerekir:

  1. "Akış yukarı" yı klonlanmış deponuza ("orijin") ekleyin:

    git remote add upstream git@github.com:original_author/project_name.git
    
  2. Taahhütleri (ve dalları) "yukarı akıştan" getir:

    git fetch upstream
    
  3. Çatalınızın "ana" koluna geçin ("başlangıç ​​noktası"):

    git checkout master
    
  4. "Ana" dalınızın değişikliklerini saklayın:

    git stash
    
  5. "Yukarı akış" ın "ana" dalından "başlangıç ​​noktanızın" ana "dalına yaptığınız değişiklikleri birleştirin:

    git merge upstream/master
    
  6. Varsa birleştirme çakışmalarını çözme ve birleştirme işleminizi gerçekleştirme

    git commit -am "Merged from upstream"
    
  7. Değişiklikleri çatalına it

    git push
    
  8. Depolanan değişikliklerinizi geri alma (varsa)

    git stash pop
    
  9. Sen bittin! Tebrikler!

GitHub ayrıca bu konu için talimatlar sağlar: Çatal senkronizasyonu


1
Kısmen yardımcı oldu: git remote add upstream git@github.com:original_author/project_name.gitSadece bir takma ad git remote add upstream https://github.com/original_author/project_name.gitmı?
Kurt

2
Wolf , bunu şimdiye kadar bildiğini tahmin ederek, ama gelecek nesiller için ... Bu ssh formatı. help.github.com/articles/configuring-a-remote-for-a-fork
Brad Ellis

2
Çok teşekkür ederim. git stashve git stash popkısmı çok yararlı
जयते जयते

Bu işe yaradı. Git / up yukarı akış / master sonra otomatik birleştirme git add -A sonra git kesin -m "ileti" çalıştırmak zorunda olan birleştirilmemiş yollar nedeniyle başarısız oldu.
highcenbug

48

Benim gibi, hiçbir zaman doğrudan efendiye hiçbir şey taahhüt etmezseniz, gerçekten yapmanız gereken, aşağıdakileri yapabilirsiniz.

Çatalınızın yerel klonundan yukarı akış uzaktan kumandanızı oluşturun. Bunu sadece bir kez yapmanız gerekir:

git remote add upstream https://github.com/whoever/whatever.git

Sonra, akış yukarı depo ana dalını yakalamak istediğinizde şunları yapmanız gerekir:

git checkout master
git pull upstream master

Asla kendiniz için hiçbir şey yapmadığınız varsayılarak, zaten yapılmalıdır. Artık yerel ustanızı menşe uzak GitHub çatalına itebilirsiniz. Ayrıca, güncel yerel master'ınızda geliştirme dalınızı yeniden temellendirebilirsiniz.

İlk yukarı akış kurulumu ve ana ödeme işleminden sonra, tek yapmanız gereken master'ınızı yukarı akışla senkronize etmek için aşağıdaki komutu çalıştırmaktır: git pull upstream master .


45

Kasım 2013'ten beri GitHub ile yerel bir çatalı yukarı akışla senkronize tutmak için çok basit ve sezgisel bir yöntem eklemelerini istemek için resmi olmayan bir özellik isteği var:

https://github.com/isaacs/github/issues/121

Not: Özellik isteği gayri resmi olduğundan, bunun support@github.comgibi bir özellik için desteğinizi eklemek üzere iletişime geçmeniz de önerilir . Yukarıdaki gayri resmi özellik talebi, uygulanmakta olan faiz miktarının kanıtı olarak kullanılabilir.


23

Bu yanıtın tarihi itibariyle, GitHub web arayüzünde bu özelliğe sahip değildir ( ya da artık söylemeyeceğim mi? ). Bununla birlikte, bunun support@github.comiçin oyunuzu eklemenizi isteyebilirsiniz .

Bu arada, GitHub kullanıcısı bardiharborow bunu yapmak için bir araç yarattı: https://upriver.github.io/

Kaynak burada: https://github.com/upriver/upriver.github.io


2
Aracı iyi bir fikir bulurken, gerçek şu ki BROKEN. Hesabımdan yalnızca 20 depo yükledi ve altbilgi bile mevcut olmayan bir web sitesine yönlendiriyor. Eğer bu düzeltilmişse, büyük bir savunucu olacağım.
sorin

2
Bugün itibariyle, bir çatalı yukarı akış repo ile senkronize etmek için başarılı bir şekilde upriver kullandım, bu yüzden benim amacım için çalışıyor ve kullanmaya devam edeceğim.
NauticalMile

1
@sorin Bu 20 repo / şube sınırlaması (bunun yerine 30 artık) GitHub varsayılan sayfalama ayarlarından geliyor. Bunun üstesinden gelmek için koda bazı uyarlamalar yapılmalıdır.
Andreas


11

Aslında, tarayıcınızdaki yukarı akışın herhangi bir işleminden çatalınızda bir dal oluşturmak mümkündür:

Resim açıklamasını buraya girin

Daha sonra bu dalı yerel klonunuza getirebilirsiniz ve düzenlemelerin üzerine düzenlemeler uyguladığınızda tüm bu verileri GitHub'a geri göndermek zorunda kalmazsınız. Veya bu daldaki bir şeyi değiştirmek için web arayüzünü kullanın.

Nasıl çalışır (tahminim, GitHub'ın tam olarak nasıl yaptığını bilmiyorum): çatallar nesne depolamasını paylaşır ve kullanıcıların referanslarını ayırmak için ad alanlarını kullanır. Böylece çatallara kadar mevcut olmasalar bile, tüm taahhütlere çatal yoluyla erişebilirsiniz.


2
Bu harika! Bu, bu taahhütlerin github'a tamamen anlamsız yüklenmesini önler.
Mart'ta Rotsor

9

Aşağıdaki adımları izleyin. Onları denedim ve bana yardımcı oldu.

Şubenize çıkış

Sözdizimi: git branch yourDevelopmentBranch
Örnek: git checkout master

En son kodu almak için kaynak veri havuzu dalını çekin

Sözdizimi: git pull https://github.com/tastejs/awesome-app-ideas master
Örnek: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME


1
GitHub kullanıyorsanız, değişikliklerinizi GitHub şubenize aktarmak isteyebilirsiniz. git push HttpsForYourForkOfTheRepo BRANCH_NAME
user3731622

9

Çatallı depolarımı bu tek satırla güncelliyorum:

git pull https://github.com/forkuser/forkedrepo.git branch

Burada yayınlanan diğer çözümler gibi projenize başka bir uzak uç nokta eklemek istemiyorsanız bunu kullanın.


2
Bununla ilgili sınırlamalar var mı? yani, yalnızca son güncellemeden bu yana taahhüt, birleştirme, çekme isteği eklemediğiniz veya çekme isteklerini yukarı akışta birleştirmemiş durumlar için mi geçerlidir?
LightCC

1
Uzak bir daldan normal bir çekme gibi çalışır. Yerel repo için X taahhütleri yaptıysanız ve şimdi orijinal repo'nun arkasında Y taahhütleri varsa, Y taahhütlerini yerel şubenize getirecek ve muhtemelen çözmeniz için bazı çatışmalar yaşatacaktır.
R.Bravo

1
@LightCC Bu, daha önce hiç uzaktan eklenen gelen çekerek daha farklı değildir, bir eklememiş gerçeği hariç uzaktan . Bu nedenle dezavantajı, istediğiniz zaman tam depo URL'sini girmeniz gerekmesidir pull.
Marc.2377

1
Orijinal repodan birçok kez çekmeniz gerekmiyorsa veya çatallanan proje nispeten basitse, bu mükemmel bir çözümdür.
AxeEffect

7

Bu cevabın bir tamamlayıcısı olarak, klonlanmış reporumun ( kökeninin ) tüm uzak dallarını tek seferde yukarı akış dallarından güncellemenin bir yolunu arıyordum . Ben böyle yaptım.

Bu, daha önce kaynak veri havuzuna ( başlangıç noktasının çatallandığı) dönük bir yukarı akış uzaktan kumandası yapılandırdığınızı ve bunu senkronize ettiğinizi varsayar .git fetch upstream

O zaman koş:

for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done

Bu komutun ilk kısmı, yukarı akış uzak deposundaki tüm kafaları listeler ve SHA-1'i ve ardından refs/heads/şube adı önekini kaldırır .

Daha sonra bu dalların her biri için, yukarı akış uzaktan izleme dalının yerel kopyasını ( refs/remotes/upstream/<branch>yerel tarafta) doğrudan orijinli olarak uzak dalda ( refs/heads/<branch>uzak tarafta) iter .

Bu şube eşitleme komutlarından herhangi biri iki nedenden ötürü başarısız olabilir: yukarı akış dalı yeniden yazılmıştır veya söz konusu daldaki taahhütleri çatalınıza iletmişsinizdir. Çatalı üzerinde şubeye bir şey yapmadığınız ilk durumda, zorla itmek güvenlidir ( -f anahtarını ekleyin ; yani git push -fyukarıdaki komutta). Diğer durumda, çatal dalınız ayrıştığından bu normaldir ve taahhütleriniz tekrar yukarı akışa birleştirilene kadar senkronizasyon komutunun çalışmasını bekleyemezsiniz .


6

"Çekme" uygulaması otomatik çözüm kurulum ve unut olduğunu. Çatalınızın varsayılan dalını yukarı akış deposuyla senkronize eder.

URL'yi ziyaret edin, yeşil "Yükle" düğmesini tıklayın ve otomatik senkronizasyonu etkinleştirmek istediğiniz depoları seçin.

Şube saatte bir kez doğrudan GitHub'da güncellenir, yerel makinenizde yerel kopyanızın senkronize olduğundan emin olmak için ana dalı çekmeniz gerekir.


2
Temel kurulum ile çatallı deponuzda yapılan değişiklikleri kaybedebileceğinizi lütfen unutmayın. Değişiklikleri korumak için bir yapılandırma dosyası ayarlayın ve bir belirtin mergemethod. Burada
Saurabh P Bhandari

1
Temel kurulumun çekme istekleri gönderdiğini ve bunları birleştirdiğini not ettim (belgelerde belirtilenlerin aksine). Bu biraz sinir bozucu ama veri kaybı sorununu çözer?
krlmlr

4

Android Studio artık GitHub çatal depolarıyla çalışmayı öğrendi (konsol komutuyla "yukarı akış" uzak depo eklemenize bile gerek yok).

VCS menüsünü aç → Git

Ve son iki açılır menü öğesine dikkat edin:

  • GitHub çatalımı yeniden oluştur

  • Çekme İsteği Oluştur

Onları dene. İlkini yerel veri havuzumu senkronize etmek için kullanıyorum. Yine de üst uzaktan depodaki ("yukarı akış") şubelere, "GitHub çatalımı yeniden oluştur" u tıkladıktan sonra Android Studio'dan erişilebilir ve onlarla kolayca çalışabilirsiniz.

(Android Studio 3.0'ı "Git entegrasyonu" ve "GitHub" eklentileri ile kullanıyorum.)

Resim açıklamasını buraya girin


4

Çatallı deponuzu klonladığınızda, klonunuzun bulunduğu dizin yoluna ve Git Bash Terminalinizdeki birkaç satıra gidin.

$ cd project-name

$ git remote add upstream https://github.com/user-name/project-name.git
 # Adding the upstream -> the main repo with which you wanna sync

$ git remote -v # you will see the upstream here 

$ git checkout master # see if you are already on master branch

$ git fetch upstream

Ve işte gitmekte fayda var. Ana depodaki güncellenmiş tüm değişiklikler çatal deponuza aktarılacaktır.

"Getirme" komutu bir projede güncel kalmak için vazgeçilmezdir: yalnızca bir "git getirme" işlemi gerçekleştirirken iş arkadaşlarınızın uzak sunucuya aktardığı değişiklikler hakkında bilgilendirilirsiniz.

Daha fazla soru için burayı ziyaret edebilirsiniz.


4

Yukarı akışınızı ayarlarsanız. Kontrol edin git remote -v, o zaman bu yeterli olacaktır.

git fetch upstream
git checkout master
git merge --no-edit upstream/master
git push

2

Bu, deponuzun büyüklüğüne ve onu nasıl çatalladığınıza bağlıdır.

Oldukça büyük bir havuzsa, bunu özel bir şekilde yönetmek isteyebilirsiniz (örn. Bırakma geçmişi). Temel olarak, mevcut ve yukarı akış sürümleri arasında farklar elde edebilir, bunları taahhüt edebilir ve daha sonra kiraz master'a geri dönebilirsiniz.

Okumayı deneyin bunu . Büyük Git depolarının nasıl ele alınacağını ve en son değişikliklerle nasıl yukarı akış gerçekleştirileceğini açıklar.


2

Ben üzerine eklemek istiyorum @ krlmlr en cevabı .

Başlangıçta, çatallı deposu bir dala seçti: master. Yeni bir özellik veya düzeltme üzerinde çalışıyorsanız, genellikle yeni bir dal oluşturur featureve değişiklikleri yaparsınız .

Çatallı deponun üst havuzla senkronize olmasını istiyorsanız pull.yml, Pull uygulaması ( özellik dalında ) için aşağıdaki gibi bir yapılandırma dosyası ( ) ayarlayabilirsiniz :

version: "1"
rules:
  - base: feature
    upstream: master
    mergeMethod: merge
  - base: master
    upstream: parent_repo:master
    mergeMethod: hardreset

Bu master, çatallı repo şubesini ana repo ile güncel tutar . featureÇatallı repo masterşubesini çatallı repo şubesi aracılığıyla bir araya getirerek güncel tutar . Bu, featuredalın yapılandırma dosyasını içeren varsayılan dal olduğunu varsayar .

Burada ikisi mergemethodsoyuna dahil, biri çatallı repo dalında ana repo ile şube hardresetsenkronizasyon değişikliklerini zorlamaya yardımcı olan masterve diğer yöntemdir merge. Bu yöntem, featureşubede yaptığınız değişiklikleri ve şubedeki zorla eşitleme nedeniyle yapılan değişiklikleri birleştirmek için kullanılır master. Birleştirme çakışması durumunda, çekme uygulaması çekme isteği sırasında bir sonraki eylemi seçmenize izin verecektir.

Temel ve gelişmiş konfigürasyonlar ve çeşitli konfigürasyonları mergemethods burada okuyabilirsiniz .

Şu anda benim çatal repo bu yapılandırmayı kullanıyorum burada emin bir artırımı talep yapmak için buraya kalır güncellendi.


1

Çatallı bir deponun her zaman iyilik için güncellenmesi konusunda iki ana şey vardır.

1. Çatal ustasından dalları oluşturun ve orada değişiklikler yapın .

Bu nedenle, Çekme İsteğiniz kabul edildiğinde, şubeyi güvenli bir şekilde silebilirsiniz, çünkü katkıda bulunan kodunuz, yukarı akışla güncellediğinizde çatallı deponuzun ana verilerinizde yaşayacaktır. Bununla, efendiniz başka bir değişiklik yapmak için yeni bir şube oluşturmak için her zaman temiz durumda olacaktır.

2. Fork master'ın otomatik olarak güncellenmesi için zamanlanmış bir iş oluşturun .

Bu cron ile yapılabilir . Linux'ta yaparsanız örnek bir kod için.

$ crontab -e

crontab fileişi saatlik olarak yürütmek için bu kodu .

0 * * * * sh ~/cron.sh

Sonra oluşturmak cron.shkomut dosyası ve git etkileşimi ile ssh-agent ve / veya beklemek aşağıdaki gibi

#!/bin/sh
WORKDIR=/path/to/your/dir   
REPOSITORY=<name of your repo>
MASTER="git@github.com:<username>/$REPOSITORY.git"   
UPSTREAM=git@github.com:<upstream>/<name of the repo>.git  

cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent` && expect ~/.ssh/agent && ssh-add -l
git clone $MASTER && cd $REPOSITORY && git checkout master
git remote add upstream $UPSTREAM && git fetch --prune upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
    echo "all the same, do nothing"
else
    echo "update exist, do rebase!"
    git reset --hard upstream/master
    git push origin master --force
fi
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent -k`

Çatallı deponuzu kontrol edin. Zaman zaman bu bildirimi her zaman gösterecektir:

Bu dal bile ile <upstream>: usta .

resim açıklamasını buraya girin


0

Bu komutları kullanın (şanslı durumda)

git remote -v
git pull
git fetch upstream
git checkout master
git merge upstream/master --no-ff
git add .
git commit -m"Sync with upstream repository."
git push -v
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.