GitHub'da Forking ve Branching


278

Github projesinin bir şubesini oluşturmaya karşı bir github projesinin çatallanmasının avantajları ve dezavantajları hakkında daha fazla bilgi edinmek istiyorum.

Forking, projemin versiyonunu orijinalinden daha izole ediyor, çünkü orijinal projenin ortak çalışanlar listesinde olmam gerekmiyor. Evde bir proje geliştirdiğimizden, insanları ortak çalışan olarak eklemede sorun yok. Ancak, bir projeyi çatallamanın ana projede birleştirme değişikliklerini daha zor hale getirip getirmeyeceğini anlamak istiyoruz. Yani, dallanmanın iki projenin senkronizasyonda tutulmasını kolaylaştıracağını merak ediyorum. Başka bir deyişle, ana projemin sürümü ile ana proje arasındaki dalı birleştirdiğimde değişiklikleri birleştirmek ve zorlamak daha mı kolay?

Yanıtlar:


279

Belirli bir proje için ortak çalışan olarak kayıtlı olmadığınız için her zaman bir şube oluşturamaz veya mevcut bir dalı çekemez ve geri alamazsınız.

Forking, GitHub sunucu tarafındaki bir klondan başka bir şey değildir :

  • doğrudan geri itme imkanı olmadan
  • ile çatal kuyruk özelliği birleştirme isteğini yönetmek eklendi

Çatalı orijinal proje ile senkronize halde tutarsınız:

  • orijinal projeyi uzaktan kumanda olarak ekleme
  • o orijinal projeden düzenli olarak getiriliyor
  • mevcut gelişiminizi bu getiriden güncellediğiniz ilgi alanına ekleyin.

Rebase, değişikliklerinizin basit olduğundan emin olmanızı sağlar (işlemek için birleştirme çatışması yoktur), orijinal projenin koruyucusunun projesine yamalarınızı eklemesini istediğinizde çekme isteğinizi daha kolay hale getirir.

Amaç, doğrudan katılım her zaman mümkün olmasa da işbirliğine izin vermektir.


GitHub tarafında klonlamanız, artık iki "merkezi" deponuz olduğu anlamına gelir (birkaç ortak çalışandan görülebilen "merkezi" olarak ").
Bunları doğrudan bir proje için ortak çalışan olarak ekleyebiliyorsanız , başka bir yönetimi yönetmenize gerek yoktur biri çatalla.

GitHub'da çatal

Birleştirme deneyimi yaklaşık olarak aynı olurdu, ancak ekstra bir dolaylama seviyesiyle (önce çatalı itin, ardından orijinal repodaki evrimleşme riski ile birlikte hızlı ileri birleştirme işlemlerinizi artık hızlı ileri gitmeyin) .
Bu, doğru iş akışının git pull --rebase upstream(çalışmalarınızı yukarı akıştan yeni taahhütlerin üzerine yeniden tabanlaştırmak) ve daha sonra git push --force origin, geçmişi kendi taahhütlerinizin her zaman orijinal (yukarı akış) repodaki taahhütlerin üstünde olacağı şekilde yeniden yazmak için olduğu anlamına gelir. .

Ayrıca bakınız:


3
Evde bir proje geliştiriyoruz ve insanları ortak çalışan olarak eklemede sorun yok. Ancak, bir projeyi çatallamanın ana projede birleştirme değişikliklerini daha zor hale getirip getirmeyeceğini anlamak istiyoruz.
reprogrammer

7
@reprogrammer: Ortak çalışan ekleyebiliyorsanız, çatallamaya gerek yoktur. yerel olarak yeniden merkezleme yapabilir, ardından hedef dalı birleştirebilir ve daha sonra iki merkezi repoyu (orijinal olanı ve çatal) yönetmek yerine doğrudan bir merkezi repoya itebilirler . Rebase hemen hemen aynı olacak, ancak bir çatal söz konusu olduğunda ekstra bir dolaylı olacaktır. Tekrar: burada gerekli değil. Cevabımı güncelledim.
VonC

14
Dürüst olmak gerekirse, gerek kalmasa bile, sadece üst düzey geliştiriciler, takım liderleri veya diğer "güvenilir" insanlar için yazılabilen kutsal bir repoya sahip olmak her zaman iyi bir fikirdir . Diğer tüm ekip üyeleri çatallarında (~ sandboxes) çalışmalı ve değişikliklerini çekme talebi şeklinde katkıda bulunmalıdır. DVCS bunu mümkün kıldığından, bunu "en iyi uygulama" olarak uyarladık ve bunu en küçük projelerde bile başarıyla kullanıyoruz ...
intland

1
Daha bir "Entegrasyon-yönetici iş akışı" lehine olacak şekilde @intland anlatıldığı gibi stackoverflow.com/users/6309/vonc?tab=responses o zaman? Git'i büyük bir şirkette tanıttığım için, bir "Entegrasyon yöneticisi" ne geçmeden önce merkezi bir iş akışını (herkes için daha tanıdık) benimseme eğilimindeyim.
VonC

15
Bir daldan koptukları ve tamamen yeni bir ağaç başlatmak için kullanıldıkları için çatallara "dallar" demeliyiz. Sadece iki sentim - ağaçsal deyimi seviyorum.
Eric

66

İşte üst düzey farklılıklar:

Çatallanan

Artıları

  • Dalları kullanıcı tarafından ayrılmış tutar
  • Birincil depodaki dağınıklığı azaltır
  • Takım süreciniz dış katkıda bulunan süreci yansıtır

Eksileri

  • Aktif (veya aktif olmayan, bu konuda) tüm şubeleri görmeyi zorlaştırır
  • Bir dalda işbirliği yapmak daha zordur (çatal sahibinin kişiyi ortak çalışan olarak eklemesi gerekir)
  • Git'te birden çok uzaktan kumanda kavramını anlamanız gerekiyor
    • Ek zihinsel defter tutma gerektirir
    • Bu, Git ile süper rahat olmayan insanlar için iş akışını zorlaştıracak

Dallanma

Artıları

  • Bir proje çevresinde yapılan tüm işleri tek bir yerde tutar
  • Tüm ortak çalışanlar, ortak çalışmak için aynı şubeye başvurabilir
  • Başa çıkacak tek bir Git kumandası var

Eksileri

  • Terk edilen şubeler daha kolay birikebilir
  • Takım katkı süreciniz harici katkıda bulunan süreciyle eşleşmiyor
  • Ekip üyelerini şubeye katılmadan önce katkıda bulunan olarak eklemeniz gerekir

"Dışarıdan katkıda bulunanlar süreci" ile kastedilen nedir?
Kars Barendrecht

1
@KarsBarendrecht "Harici katkıda bulunan" terimini kullanmak için güncellendi. writeDepo üzerinde izinleri olmayan biri .
Aidan Feldman

45

Git'in genel iş akışı ile ilgilidir. Doğrudan ana projenin deposuna aktarma olasılığınız düşüktür. GitHub projesinin havuzunun şube tabanlı erişim kontrolünü destekleyip desteklemediğinden emin değilim, örneğin kimseye ana şubeye gönderme izni vermek istemezsiniz.

Genel örüntü aşağıdaki gibidir:

  • Özgün projenin deposunu, daha sonra değişiklikleri göndermenize izin verilecek olan kendi GitHub kopyanıza sahip olacak şekilde çatallayın.
  • GitHub veri havuzunuzu yerel makinenize kopyalayın
  • İsteğe bağlı olarak, orijinal deponuzu yerel deponuza ek bir uzak havuz olarak ekleyin. Daha sonra, bu depoda yayınlanan değişiklikleri doğrudan alabilirsiniz.
  • Değişikliklerinizi ve kendi taahhütlerinizi yerel olarak yapın.
  • Değişikliklerinizi GitHub veri havuzunuzda aktarın (genellikle projenin veri havuzunda yazma izinlerine sahip olmadığınız için).
  • Projenin yöneticileriyle iletişime geçin ve değişikliklerinizi almasını ve gözden geçirmesini / birleştirmesini isteyin ve projenin deposuna geri dönmelerine izin verin (siz ve isterseniz).

Bu olmadan, kamu projelerinin herkesin kendi taahhütlerini doğrudan itmesine izin vermek oldukça sıra dışı.


@RecoJohnson, iyi ... Cevabımda "pull" kelimesini kullanmadım (ama "pull" etkili bir şekilde Git terimlerinde "+" birleştirme "anlamına geliyor). Hangi "itme" kullanımının yanlış olduğunu düşünüyorsunuz?
Bruno

2
@RecoJohnson GitHub çatalınıza katkıda bulunan bir itici olarak; proje yöneticileri katkınızı çatalınızdan çeker.
mljrg

1
İşbirliğine atanmanızın mümkün olmadığı varsayımı, açık kaynak dünyasında, geliştirme ekibinin iyi tanımlanmış olduğu git'i kullanan geliştirme ekipleri olan birçok kuruluştan daha doğru olduğunu düşünüyorum. Bunun önemli bir ayrım olduğunu ve yeterince yapılmayan bir ayrım olduğunu düşünüyorum, muhtemelen gitlab gibi şirketler neden gelişiyor çünkü işletmenin ihtiyaçlarını ve kontrol ihtiyacını anlıyorlar.
code4cause

8

Forking, mevcut depodan tamamen yeni bir havuz oluşturur (sadece gitHub / bitbucket'te git clone yapmak)

Çatallar en iyi şekilde kullanılır: 'bölmenin' amacı, asla ebeveyni ile bir araya gelemeyecek mantıksal olarak bağımsız bir proje oluşturmaktır.

Şube stratejisi mevcut / çalışan depo üzerinde yeni bir şube oluşturur

Dallar en iyi şekilde kullanılır: bir özellik boyunca çalışmak için geçici yerler olarak oluşturulduklarında, dalı başlangıç ​​noktasıyla birleştirmek amacıyla.

Daha Spesifik: - Açık kaynaklı projelerde, depoya kimlerin itebileceğine karar veren havuzun sahibidir. Ancak, açık kaynak fikri herkesin projeye katkıda bulunabileceğidir.

Bu sorun çatallarla çözülür: bir geliştirici açık kaynaklı bir projede bir şeyi değiştirmek istediğinde, resmi depoyu doğrudan klonlamaz. Bunun yerine, bir kopya oluşturmak için çatallar. İş bittiğinde, deponun sahibinin değişiklikleri gözden geçirebilmesi ve bunları projesiyle birleştirip birleştirmeyeceğine karar verebilmesi için bir çekme isteği yaparlar.

Çekirdek çatal özelliği dallanma özelliklerine benzer, ancak dallar oluşturmak yerine depodan bir çatal yapılır ve bir birleştirme isteği yerine bir çekme isteği yaratırsınız.

Aşağıdaki linkler farkı iyi açıklanmış bir şekilde sunmaktadır:

https://blog.gitprime.com/the-definitive-guide-to-forks-and-branches-in-git/

https://buddy.works/blog/5-types-of-git-workflows

http://www.continuousagile.com/unblock/branching.html


Bu yanıttaki "en iyi kullanılan" ifadeler, dallanmanın açık kaynaklı projeler gibi şeyler için çalışmasını engelleyen birçok konuyu ve çatalların gerçek dünyada nasıl kullanıldığı gerçeğini göz ardı ediyor gibi görünüyor. İnsanların belirli bir veri havuzunu doğrudan değiştirme izni olmayan bir projede işbirliği yapmalarını sağlamak için çekme istekleriyle birlikte kullanılan çatalları görmek son derece yaygındır.
StriplingWarrior
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.