Yakın zamanda 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 bir değişiklik daha yapıldı. Yani benim çatalım bu değişikliği içermiyor.
Bu bozukluğu çatalıma nasıl koyabilirim? Katkıda bulunacağım başka değişiklikler olduğunda çatalımı silmem ve yeniden oluşturmam gerekir mi? Yoksa bir güncelleme düğmesi var mı?
Çatallanmış deponuzun yerel klonunda, orijinal GitHub deposunu "remote" olarak ekleyebilirsiniz. ("Remotes" depoların URL'leri için takma adlar gibidir - örneğin origin
bunlardan biridir). Daha sonra 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 düzenleyebilirsiniz. Komutlar açısından bu şöyle görünebilir:
# 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ı klonlamış olabileceği için), son komutu git merge upstream/master
ile değiştirmelisiniz. Bununla birlikte, mümkün olduğunca temiz olan daha fazla çekme isteği yapmak için, muhtemelen yeniden başlatmak daha iyidir.
Dalınızı upstream/master
üzerine yeniden yüklediyseniz, GitHub'daki kendi çatallı deponuza itmek için itmeyi zorlamanız gerekebilir. Bunu şu şekilde yaparsınız:
git push -f origin master
Sadece yeniden yükledikten sonra ilk kez -f
kullanmanız gerekir.
Mayıs 2014'ten itibaren, bir çatalı doğrudan GitHub'dan güncellemek mümkündür. Bu, Eylül 2017 itibariyle hala çalışmaktadır, FAKAT kirli bir taahhüt geçmişine yol açacaktır.
Orijinalden güncelle
).Şimdi üç seçeneğiniz var, ancak her biri daha az temiz bir commit geçmişine yol açacaktır.
Bu dal X commit ileride, Y commit geride <orijinal fork>
gösterecektir.Yani evet, GitHub web kullanıcı arayüzünü kullanarak reponuzu upstream ile güncel tutabilirsiniz, ancak bunu yapmak commit geçmişinizi lekeleyecektir. Bunun yerine komut satırına bağlı kalın - bu çok kolay.
İşte GitHub'ın Bir çatalı senkronize etme hakkındaki resmi belgesi:
Çatal senkronizasyonu
Kurulum
Eşitleme yapmadan önce, yukarı akış deposuna işaret eden bir uzaktan kumanda eklemeniz gerekir. Bunu ilk çatallama yaptığınızda yapmış olabilirsiniz.
İpucu: Çatalınızı senkronize etmek yalnızca deponun yerel kopyasını günceller; GitHub'daki deponuzu güncellemez.
$ git remote -v
Geçerli uzaktan kumandaları listele
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
Yeni bir uzaktan kumanda ayarlayın
$ git remote -v
Yeni uzaktan kumandayı doğrulayın
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)
Syncing
Deponuzu upstream ile senkronize etmek için iki adım gereklidir: önce remote'dan getirmeli, ardından istediğiniz dalı yerel dalınızla birleştirmelisiniz.
Fetching
Uzak depodan getirme işlemi, deponun dallarını ve ilgili taahhütlerini getirecektir. Bunlar yerel deponuzda özel dallar altında saklanır.
$ git fetch upstream
Upstream remote'ın şubelerini alın
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
Artık upstream'in ana dalını yerel bir dal olan upstream/master'da saklıyoruz
$ git branch -va
Tüm yerel ve uzaktan izleme şubelerini listeleyin
* 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
Artık yukarı akış deposunu getirdiğimize göre, değişikliklerini yerel dalımızla birleştirmek istiyoruz. Bu, yerel değişikliklerimizi kaybetmeden bu dalı yukarı akış ile senkronize hale getirecektir.
$ git checkout master
Yerel ana dalımıza göz atın
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
Eğer yerel şubenizde herhangi bir benzersiz taahhüt yoksa, git bunun yerine bir "fast-forward" gerçekleştirecektir:
$ git merge upstream/master 34e91da..16c56ad güncelleniyor Hızlı ileri sarma README.md | 5 +++-- 1 dosya değişti, 3 ekleme(+), 2 silme(-)
İpucu: GitHub'daki deponuzu güncellemek istiyorsanız, burada talimatlarını izleyin.