Git çatalları aslında Git klonları mıdır?


817

İnsanların Git'te kod yazdıklarını söylediklerini duyuyorum. Git "çatal", Git "klonu" artı gelecekteki birleşmelerden vazgeçmek için bazı (anlamsız) psikolojik isteklilik gibi şüpheli bir ses çıkarır. Git'de çatal komutu yok, değil mi?

GitHub, üzerine yazışmaları zımbalayarak çatalları biraz daha gerçek kılar. Yani, çatal düğmesine basarsınız ve daha sonra, çekme isteği düğmesine bastığınızda, sistem sahibine e-posta gönderecek kadar akıllıdır. Bu nedenle, depo sahipliği ve izinleri etrafında biraz dans etmek.

Evet Hayır? GitHub üzerinde Git'i bu yönde uzatan herhangi bir öfke var mı? Veya Git'in işlevselliği emdiği söylentileri?


10
Evet, sadece github veritabanı tarafından izlenen bir klon türüdür.
Paŭlo Ebermann

15
GitHub, depolama gereksinimlerini ikiye katlamaktan kaçınmak için özel bir şey yapmıyor mu (GitHub'ın kendi sunucularında)?
Keith Thompson

18
Henüz bahsedilmedi: Özel bir depoyu silmek tüm çatallarını siler. Halka açık bir depoyu silmek çatalları korur ancak bir çatalı yeni ana depo olmaya teşvik eder. Patronunuz herkese açık repoyu özel yaparsa, mevcut tüm çatalları kırar ve onlardan özel repoya çekme talepleri yapamazsınız. help.github.com/articles/…
Plato

(GitHub'ın bunu bize göstermediği için kanıt olmadan) buradaki gerçek mekanizmanın Git'in "alternatifleri" olduğuna inanıyorum. Başka bir deyişle, çatal kullanılan bir ayna klonudur --reference. Kamusal depoların ve silme işlemlerinin nasıl ele alındığı tam olarak açık değildir (rastgele seçilen tanıtılan repoya alternatifleri taşıyın, tüm çatalları orijinal çatalın bir parçası olmayan ortak bir alternatife yönlendirin?) Ancak alternatiflerin kullanımı çeşitli gözlemlenebilir davranışları açıklar.
torek

Yanıtlar:


925

Fork , GitHub bağlamında Git'i genişletmez.
Yalnızca sunucu tarafında klonlamaya izin verir.

Yerel iş istasyonunuzda bir GitHub deposunu klonladığınızda, açıkça "katılımcı" olarak bildirilmedikçe yukarı akış deposuna geri dönemezsiniz. Çünkü klonunuz bu projenin ayrı bir örneğidir. Projeye katkıda bulunmak istiyorsanız, bunu yapmak için çatallamayı kullanabilirsiniz:

  • GitHub hesabınızdaki GitHub deposunun klonu ( "çatal" kısmı , sunucu tarafında bir klon)
  • bu GitHub deposuna katkıda bulunun (kendi GitHub hesabınızdadır, bu yüzden itme hakkınız vardır)
  • orijinal GitHub veri havuzuna ilginç bir katkıda bulunun ( kendi GitHub veri havuzunuzda yaptığınız değişiklikler yoluyla "çekme isteği" kısmı )

Ayrıca " Ortak GitHub İş Akışı " nı da kontrol edin .

Orijinal depoyla (yukarı akış olarak da adlandırılır) bir bağlantı tutmak istiyorsanız, o orijinal depoya başvuran bir uzaktan kumanda eklemeniz gerekir.
Bkz. " GitHub'da başlangıç ​​noktası ve yukarı akış arasındaki fark nedir? "

çatal ve yukarı akış

Git 2.20 (Q4 2018) ve daha fazlası ile çataldan getirme, delta adaları ile daha verimli .


6
"Bir GitHub deposunu yerel iş istasyonunuzda klonlarken, açıkça" katılımcı "olarak bildirilmedikçe yukarı akış deposuna geri dönemezsiniz." --- Bu "çatal" ile doğru değil mi? Lütfen açıkla.
chharvey

61
@ TestSubject528491 hayır, çatalla, yukarı akış deposunu GitHub sunucu tarafında kendi repo olarak klonladığınız anlamına gelir . Daha sonra yerel olarak yeni "çatal" deposunu klonlayabilir ve o çatalın yaratıcısı ve sahibi olduğunuz için özgürce geri itebilirsiniz.
VonC

9
Benim için kilit nokta, katkıda bulunduğunuzu beyan etmediğiniz sürece yerel kopyanızdan bir PR gönderemezsiniz . Yerel repodan PR göndermeye çok alışkınım, ancak bunun nedeni her zaman katkıda bulunan olarak işaretlenmem. Bunu düşünürseniz, bir PR göndermek için uzak repoya bir şube itmeli ve sonra PR oluşturmalısınız. Reposunuzda rastgele insanlar oluşturmak istemiyorsanız mantıklı geliyor. Ve onları çatallamalarını ve bunun yerine PR'ları göndermelerini tercih edersiniz.
Adam Zerner

Başka bir yerde ikinci "yukarı akış" uzak yaklaşımı gördüm, ancak doğrudan "GitHub - Original" dan "GitHub - Fork" a geçmek daha kolay değil mi? İkinci uzaktan yaklaşım Eclipse ve eGit kurulumumda işe yaramadı ve "GitHub - Fork" depomu zorlayamadı (zorlanacak bir şey yok).
William T. Mallard

Aldırma, bilgi burada bağlantı bana bazı bilgiler verdi. Bir katılımcı olarak "GitHub - Orijinal" den "GitHub - Çatal" a, ardından "- Çatal" dan yerel makineye geçmek mantıklıdır, ancak sahibi sizseniz doğrudan "- Çatal" dan doğrudan çekmek istersiniz önce incelemek, testler yapmak, vb.
William T. Mallard

135

İnsanlar git gittiklerinde kod yazdıklarını söylediler. Git "fork" şüpheli bir şekilde git "clone" gibi sesler ve gelecekteki birleşmelerden vazgeçmek için (anlamsız) psikolojik isteklilik gibi geliyor. Git'de çatal komutu yok, değil mi?

"Forking", herhangi bir sürüm kontrol sistemi tarafından özel olarak desteklenen bir komut değil, bir kavramdır.

En basit çatallanma dallanma ile eş anlamlıdır. VCS'nizden bağımsız olarak her şube oluşturduğunuzda "çatallandınız". Bu çatalların birleştirilmesi genellikle oldukça kolaydır.

Bahsettiğiniz çatal, ayrı bir partinin kodun tam bir kopyasını alıp uzaklaştığı, Subversion gibi merkezi bir sistemde mutlaka VCS'nin dışında gerçekleşir. Git gibi dağıtılmış bir VCS, tüm kod tabanını çatallamak ve etkili bir şekilde yeni bir proje başlatmak için daha iyi bir desteğe sahiptir.

Git (GitHub değil), yerel olarak tüm bir repoyu (yani, klonlama) birkaç şekilde "çatalla" destekler:

  • klonladığınızda, sizin için bir uzaktan kumanda originoluşturulur
  • varsayılan olarak klondaki tüm dallar origineşdeğerlerini takip eder
  • çatallandığınız orijinal projeden değişiklikleri almak ve birleştirmek son derece kolaydır

Git, orijinalin projesinden birinden sizden çekmesini istemek veya değişiklikleri kendiniz geri almak için yazma erişimi istemek kadar çatalın kaynağına katkıda bulunan değişiklikleri kolaylaştırır. GitHub'ın kolaylaştırdığı ve standartlaştığı kısım budur.

Github üzerinde bu yöne uzanan herhangi bir öfke var mı? Veya git işlevselliğini emen söylentiler var mı?

Öfke yok çünkü varsayımınız yanlış. GitHub, Git'in çatal işlevini hoş bir GUI ve çekme istekleri yayınlamanın standartlaştırılmış bir yolu ile "genişletir", ancak işlevi Git'e eklemez . Tam repo çatallama kavramı, temel düzeyde dağıtılmış sürüm denetimine dönüştürülür. GitHub'ı istediğiniz zaman terk edebilir ve yine de "çatalladığınız" projeleri itmeye / çekmeye devam edebilirsiniz.


6
Mükemmel cevabınız için teşekkürler. Sadece açıklığa kavuşturmak istiyorum, bu , github bağlamının dışındaX project makinemde bazılarını klonlayabileceğim anlamına geliyor . Yerel ayarımda değişiklik yaparsam ve başlangıç ​​noktasına yazma erişimim yoksa , projenin yazarına e-posta gönderilmesini isterim. Yerel klonuma bir url olacak gideon adlı bir uzaktan kumanda yapacak ve çekebilir, değil mi?
gideon

1
Bir projeye yaptığınız değişikliklere katkıda bulunmak istiyorsanız, onları git format-patch kullanarak dosyalara kaydedebilir ve bu yazma erişimine sahip birine e-postaya ekleyebilir veya kendi barındırma hizmetinizi alabilirsiniz, çalışmanızı buna itin ve URL'yi bir git e-postasında gönderin, örneğin git request-pull komutunu kullanarak. İş istasyonlarındaki depolara genellikle çevrimiçi olarak doğrudan erişilemez.
bdsl

Ancak evet, iş istasyonunuza internet üzerinden projenin yazarına erişilebiliyorsa, URL'yi onlara gönderebilirsiniz ve uzaktan kumanda olarak ekleyebilir ve ondan çekebilirler.
bdsl

1
Re: angst, benim için tek şey, GitHub'ın size 50 taahhütte bulunduğunu söylediği bir repo'mdan çek perspektif düğmesi oluşturmak için tıklanacak bir bağlantı veya düğme olmamasıdır. Hayır biggie artık "Çekme İsteği" terimini de yukarı akıştan GitHub çatalınıza çekmek için istekleri içerdiğini biliyorum. Git zor.
William T. Mallard

80

Evet, çatal bir klon. Ortaya çıktı çünkü izinleri olmadan başkalarının kopyalarına basamazsınız . Onlar da sizin için bir kopyasını ( çatal ), burada yazma izni olacak.

Gelecekte, gerçek sahibi veya değişikliklere benzeyen bir çatal olan diğer kullanıcılar, kendi havuzlarına geri çekebilirler. Alternatif olarak, onlara bir "çekme isteği" gönderebilirsiniz.


Depoyu yerel makineme kopyalayabilir, bir şube oluşturabilir, ardından orijinal sahibine bir çekme isteği gönderebilir miyim? Sadece kod güncellemelerini kolaylaştırmak için GitHub'ın her yerinde birden fazla depo kopyası barındırmak gereksiz görünüyor.
Casey

4
@Casey GitHub üzerinden yalnızca GitHub aracılığıyla bir çekme isteği gönderebilir ve yalnızca GitHub'da bulunan bir şubeden bir GitHub çekme isteği gönderebilirsiniz. Söz konusu Depo'da ortak çalışan değilseniz, GitHub çekme isteği başlatabileceğiniz bir şube oluşturmanın bir yolu yoktur. Hiçbir şey eski moda şekilde e-posta yoluyla yapmanıza engel olmaz, ancak GitHub bunun bir parçası değildir.
Beau Simensen

2
@Casey bir nedeni normalde başkalarının iş istasyonuna URL erişimi olmayan olmasıdır. GitHub fork, GitHub sunucusunda çalışabileceğiniz pushve yapabileceğiniz başkalarının URL erişimine sahip olduğu bir kopyasının olduğu anlamına gelir pull. Bu pull request, kopyanızın URL'sini (GitHub'da) almak için standart bir yoldur, böylece kolayca depolarına çekebilirler.
Jesse Chisholm

Bu inandığım doğru / kabul edilen cevap olmalı. 15-20 geliştiriciden oluşan bir ekibin dal oluşturup kökenini iten 15-20 geliştiricinin, aynı deponun kendi kopyasına sahip olduğu ve çok fazla dal oluşturduğu, değişiklik yapıp geri ittiği bir sahnede bir karışıklık hayal edin. O zaman asıl deponun yazarı sadece istediği değişiklikleri alabilir.
Kishor Pawar

37

Bu bağlamda "Çatal", "Değişikliklerimi ekleyebilmem için kodlarının bir kopyasını oluştur" anlamına gelir. Söyleyecek çok şey yok. Her klon aslında bir çataldır ve değişiklikleri çataldan alıp almayacağınıza karar vermek orijinaline bağlıdır.


2
Özellikle: " on the GitHub serverKendi değişikliklerimi ekleyebilmem için kodlarının bir kopyasını oluştur and others can have URL access to my version". Çoğu yerel iş istasyonu, kimsenin çekebileceği URL erişimi sunmaz. Ancak sunucudaki çatalınıza basarsanız, çekme URL'sine sahip olabilirler.
Jesse Chisholm

Soru genel olarak çatalla ilgili değil, özellikle GitHub çatalla ilgili.
reinierpost

26

Klonlama, git deposunun bir kopyasını yerel bir makineye kopyalamayı içerirken çatallama, havuzu başka bir depoya kopyalar. Klonlama yalnızca kişisel kullanım içindir (gelecekte birleşme olmasına rağmen), ancak çatalla yeni bir olası proje yolunu kopyalayıp açıyorsunuz


11

Forking, bazı projelere katkıda bulunmaya karar verdiğinizde yapılır. Geçmiş günlükleriyle birlikte tüm projenin bir kopyasını oluşturacaksınız. Bu kopya tamamen deponuzda yapılır ve bu değişiklikleri yaptıktan sonra bir çekme isteği yayınlarsınız. Şimdi çekme isteğinizi kabul etmek ve değişiklikleri orijinal koda dahil etmek kaynağın sahibine kalmış.

Git klonu, kullanıcıların kaynağın bir kopyasını almasını sağlayan gerçek bir komuttur. git clone [URL] Bu, kendi yerel deponuzda [URL] 'nin bir kopyasını oluşturmalıdır.


10

Bence çatal diğer deponun bir kopyası ama sizin hesabınızdaki değişiklikler. örneğin, diğer havuzu doğrudan yerel olarak klonlarsanız, uzak nesne kaynağı hala klonladığınız hesabı kullanıyor demektir. Kodunuzu taahhüt edemez ve katkıda bulunamazsınız. Bu sadece kodların saf bir kopyasıdır. Aksi takdirde, bir depoyu çatal yaparsanız, github hesabınızdaki hesap ayarınızın güncellenmesiyle repo klonlanır. Ardından, hesabınız bağlamında repoyu klonlayarak, kodlarınızı uygulayabilirsiniz.


10

Burada “çatal” ın ne olduğu konusunda bir yanlış anlaşılma var. Çatal aslında kullanıcı başına bir dizi daldan başka bir şey değildir. Bir çatala bastığınızda, aslında orijinal depoya itersiniz, çünkü bu SADECE havuzdur.

Bir çatalı iterek, taahhüdünü not ederek ve sonra orijinal depoya gidip taahhüt kimliğini kullanarak bunu deneyebilirsiniz, taahhüdün orijinal havuzda "içinde" olduğunu görürsünüz.

Bu çok mantıklı, ama bariz olmaktan çok uzak (bunu sadece yakın zamanda keşfettim).

John, SuperProject deposunu çatalladığında, gerçekte gerçekleşen şey, kaynak deposundaki tüm dalların "John.master", "John.new_gui_project" gibi bir adla çoğaltılmasıdır.

GitHub "John" u gizler. GitHub'daki depomuzun kendi "kopyamız" olduğu yanılsamasını veriyor, ama buna gerek yok ve hatta gerekmiyor.

Yani çatalımın kolu "master" aslında "Korporal.master" olarak adlandırılır, ancak GitHub kullanıcı arayüzü bunu asla açıklamaz ve bana sadece "master" ı gösterir.

Bu son zamanlarda yaptığım şeylere dayanarak zaten kaputun altında devam ettiğini düşünüyorum ve bunu düşündüğünüzde çok iyi bir tasarım.

Bu nedenle Microsoft'un Git çatallarını Visual Studio Team Services ürünlerine uygulamasının çok kolay olacağını düşünüyorum.


Sevgili Hugh, cevabınızın yarısı aslında yanlış - çatal, tüm şubelerin ve geçmişin yanı sıra bir kullanıcı hesabından başka bir kullanıcı hesabına tüm havuzun klonudur. Çatalı taahhüt ettiğinizde, çatalladığınız orijinal depoda hiçbir şey değişmez. Ancak, "çatal" ın ne olduğuna ilişkin bu yanlış anlamaların yanı sıra, şimdi bazı iyi haberler var: Visual Studio Team hizmetleri artık bir "Fork" işlevi içeriyor. ;)
Sorin Postelnicu

1
@SorinPostelnicu kaynağı? Hugh'un, deponun basit bir klonu olmaları ile tutarsız davranan kişisel tecrübe nedeniyle buraya inanmaya meyilliyim. Örneğin, yukarı akış silindiğinde, çatallar silinir (OP'nin sorusundaki bir yorumda belirtildiği gibi) ve bazen yukarı akış, bir çekme isteği kabul ederken, hiçbir şey yapmadan çatallarımın dallarıyla bir araya getirerek yaralanır.
patates

Gerçekten de durum böyle. Ne de git cloneolsa GitHub'ın, "çatal" düğmesine her bastığında kelimenin tam anlamıyla yepyeni bir depoya (hatta "çıplak" bir tane) inanılmaz derecede aptalca olurdu - bu inanılmaz bir depolama kaybı ve muhtemelen bir saldırı vektörü olurdu .
Greg A. Woods

7

Klonlamanın sunucudan makinenize ve çatalın sunucunun kendisinde bir kopya oluşturması dışında, önemli bir fark, klonladığımızda, aslında tüm dalları, etiketleri vb.

Ancak çatallandığımızda, gerçek dosyaları sadece ana dalda alırız, bundan başka bir şey yoktur. Bu, diğer dalları alamadığımız anlamına gelir.

Bu nedenle, orijinal depoyla bir şeyleri birleştirmeniz gerekiyorsa, depolar arası birleştirme ve kesinlikle daha yüksek ayrıcalıklara ihtiyaç duyacaktır.

Fork, Git'te bir komut değildir; sadece GitHub'ın uyguladığı bir kavram. Git'in herhangi bir ana kopyayla eşzamanlamaya gerek kalmadan eşler arası ortamda çalışmak üzere tasarlandığını unutmayın. Sunucu sadece başka bir eş, ama bir ana kopya olarak bakıyoruz.


7
Ha? Bir çatal tüm dalları alır, ancak nereye bakacağınızı bilmeniz gerekir (ipucu:) git branch -a.
Üçlü

3

En basit ifadeyle,

Bir depo çatallamak istediğinizi söylediğinizde , temel olarak GitHub hesabınızdaki GitHub kimliğiniz altında orijinal deponun bir kopyasını oluşturursunuz.

ve

Bir havuzu klonladığınızı söylediğinizde , GitHub hesabınızda bir kopyası olmadan doğrudan sisteminizdeki (PC / dizüstü bilgisayar) orijinal deponun yerel bir kopyasını oluşturursunuz.

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.