Git şubesi, çatal, getirme, birleştirme, rebase ve klon arasındaki farklar nelerdir?


502

Git'te çatal, çatal ve klon arasındaki farkı anlamak istiyorum.

Benzer şekilde, a git fetchyerine, a yaptığımda ne anlama gelir git pull?

Ayrıca, rebaseile karşılaştırıldığında ne anlama geliyor merge?

Bireyin kendilerini nasıl birlikte ezebilirim?

Nasıl kullanılırlar, neden kullanılırlar ve neyi temsil ederler?

GitHub nasıl giriyor?


19
kabul edilen cevabı Michael Durrant'ın cevabı olarak değiştirebilir misin?
siride

11
Elbette O can , ama bu onun tercihi olmalı ve açıkçası en (benim gibi) buraya gelen insanların tam da bu anda kendiniz bir tane =) oldu diye seçti cevap, gibi daha özlü bir şey istiyorum
user1271772

Yanıtlar:


366

Bir klon sadece bir deponun kopyasıdır. Yüzeyde, sonuç, svn checkoutbaşka bir depodan kaynak kodu indirdiğinize eşdeğerdir . Subversion gibi merkezi VCS ile Git gibi DVCS'ler arasındaki fark, Git'te klonladığınızda, aslında tüm geçmiş ve dallar dahil olmak üzere tüm kaynak havuzunu kopyalamanızdır. Artık makinenizde yeni bir deponuz var ve yaptığınız her taahhüt bu depoya giriyor. Bu taahhütleri başka bir veri havuzuna (veya orijinal olana) itene veya kamuya açıksa birisi depodan işlem yapana kadar kimse değişiklik görmeyecektir.

Şube, depo içindeki bir şeydir. Kavramsal olarak, bir gelişme konusunu temsil eder. Genellikle bir ana dalınız vardır, ancak bazı özellikler xyz ve hata abc'yi düzeltmek için başka bir dal üzerinde çalıştığınız bir dalınız da olabilir. Bir şubeyi teslim aldığınızda, yaptığınız herhangi bir taahhüt söz konusu dalda kalacaktır ve söz konusu şubeyle birleştirilinceye veya yeniden şubeye yeniden tahsis edilinceye kadar diğer şubelerle paylaşılmaz. Elbette, dallar söz konusu olduğunda, dalların nasıl uygulandığının temel modeline bakana kadar Git biraz garip görünüyor. Bunu kendim açıklamak yerine (zaten çok fazla şey söyledim, methinks), Git modellerinin Git web sitesinden nasıl alındığına dair "bilgisayar bilimi" açıklamasına bağlantı vereceğim:

http://eagain.net/articles/git-for-computer-scientists/

Çatal gerçekten bir Git konsepti değil, daha çok politik / sosyal bir fikir. Yani, bazı insanlar bir projenin gidişatından memnun değilse, kaynak kodunu alabilir ve orijinal geliştiricilerden ayrı olarak kendileri üzerinde çalışabilirler. Bu bir çatal olarak kabul edilir. Git çatallamayı kolaylaştırır çünkü herkesin kaynak kodunun zaten kendi "ana" kopyası vardır, bu yüzden orijinal proje geliştiricileriyle bağları kesmek kadar basittir ve SVN ile yapmak zorunda kalacağınız gibi paylaşılan bir havuzdan geçmişin dışa aktarılmasını gerektirmez .

EDIT: GitHub gibi siteler tarafından kullanılan modern "çatal" tanımının farkında olmadığım için, daha fazla bilgi için lütfen yorumlara ve ayrıca Michael Durrant'ın benim cevabımın cevabına bir göz atın .


125
Çatal, geliştiricinin ana repodan memnun olmadığı anlamına gelmez. Genellikle, başka bir geliştiricinin bu repoya okuma, yazma yazma erişimi olduğu anlamına gelir. Geliştirici repoyu çatallayabilir, değişiklik yapabilir, ancak ana repoya yazamadığı için değişikliklerini bir yama olarak sunması gerekir. Dolayısıyla, çatallama aynı zamanda yazma erişimi vermeden işbirliğini teşvik etmenin bir yoludur.
brycemcd

5
Sanırım bu doğru. Ben sadece bir projenin yeni, potansiyel olarak rekabet edebilecek bir versiyonunu oluşturmak için kullanılan "çatal" gördüm.
siride

32
Çatalın yukarı
yönde

6
Git hub çatal anlamına gelen "fork" kullanır. Orijinalinden ayrı olarak github'da depolanan yeni bir havuz. Bununla birlikte, github çekme isteklerinin uygulanmasını da çok basit hale getirir. Çekme istekleri esasen orijinal deponun sahibinden repo çatalından değişiklikleri başlangıç ​​noktasına geri "çekmesini" ister. Bu şekilde, herkes kaynak denetimini kullanabilir ve kendileri de dahil olmak üzere tüm değişikliklerin geçmişine sahip olabilir, ancak herkesin orijinal repoya yazma erişimine ihtiyacı yoktur.
mklauber

4
Cevabımı, github'ın modeli hakkında daha fazla bilgi için Michael Durrant'ın cevabına bakmalarını söylemek için güncelledim.
siride

531

Git

Bu cevap GitHub'ı da içeriyor, çünkü birçok insan da bunu sordu.

Yerel depolar

Git (yerel olarak) .gitdosyalarınızı kaydettiğiniz bir dizine ( ) sahiptir ve bu 'yerel deponuz'dur. Bu, uzak depoyu hemen ekleyip taahhüt ettiğiniz SVN gibi sistemlerden farklıdır.

Git, dosyanın tamamını kaydederek değişen her dosyanın sürümünü saklar. Bu açıdan SVN'den de farklıdır, çünkü delta değişiklikleri yoluyla 'yeniden yaratmadan' herhangi bir tek versiyona gidebilirsiniz.

Git, dosyaları hiç 'kilitlemez' ve bu nedenle bir düzenleme için 'özel kilit' işlevinden kaçınır (pvcs gibi eski sistemler akla gelir), bu nedenle çevrimdışı olduğunda bile tüm dosyalar her zaman düzenlenebilir. Aslında, GitHub gibi uzak bir depoya çekme veya getirme / aktarma sırasında dosya değişikliklerini (aynı dosya içinde!) Birleştirme ile inanılmaz bir iş çıkarır. Manuel değişiklikler yapmanız gereken tek zaman (aslında bir dosyayı düzenlemek), iki değişikliğin aynı kod satırlarını içermesi.


Dallar

Dallar, ana kodu ('ana' dal) korumanıza, bir kopya oluşturmanıza (yeni bir dal) ve daha sonra bu yeni dalda çalışmanıza olanak tanır. Eğer çalışma biraz zaman alırsa veya şube yapıldığından beri master çok fazla güncelleme alırsa, master şubeye karşı birleştirme veya yeniden basma (genellikle daha iyi tarih ve çatışmaları çözmek için daha kolay) tercih edilmelidir. İşiniz bittiğinde, şubede yapılan değişiklikleri ana depoya geri birleştirirsiniz. Birçok kuruluş, bir özellik, hata veya angarya öğesi olsun, her iş parçası için dallar kullanır. Diğer kuruluşlar dalları yalnızca sürüm yükseltmeleri gibi önemli değişiklikler için kullanır.

Çatal: Bir branşmanla branşmanı kontrol edip yönetirken, bir çatalla başka biri kodu tekrar kabul etmeyi denetler.

Genel olarak konuşursak, dal yapmak için iki ana yaklaşım vardır. Birincisi, ana daldaki değişikliklerin çoğunu korumaktır, yalnızca farklı ihtiyaçlar için iki dal olmasını istediğiniz sürüm değişiklikleri gibi daha büyük ve daha uzun süren işler için dallar kullanmaktır. İkincisi, temel olarak her özellik isteği, hata düzeltme veya angarya için bir dal oluşturup, daha sonra bu ana dalları ana ana dalda ne zaman birleştireceğinize elle karar vermenizdir. Bu sıkıcı görünse de, bu yaygın bir yaklaşımdır ve şu anda kullandığım ve önerdiğim yaklaşımdır, çünkü bu ana dalı daha temiz tutar ve üretime teşvik ettiğimiz ustadır, bu yüzden yeniden tamamlama yoluyla sadece tamamlanmış, test edilmiş kod istiyoruz ve dalların birleştirilmesi.

Bir dalı master yapmak için 'standart' yol a merge. Şubeler ayrıca geçmişi temizlemek için "yeniden temel alınabilir". Mevcut durumu etkilemez ve 'daha temiz' bir tarih vermek için yapılır.

Temel olarak, fikir belli bir noktadan (genellikle ustadan) dallanmış olmanızdır. Dallandığınızdan beri, “usta” nın kendisi o dallanma noktasından ileriye taşınmıştır. Bir dalda yaptığınız tüm değişiklikler, en son değişikliklerin tümü ile mevcut master durumuna karşı oynatılırsa 'daha temiz' olacaktır (sorunları çözmek daha kolay ve geçmişi anlamak daha kolay olacaktır). Yani, süreç: değişiklikleri kaydetmek; 'yeni' efendiyi alın ve değişiklikleri tekrar uygulayın (bu yeniden taban kısmıdır). Yeniden birleştirmenin, tıpkı birleştirme gibi, manuel olarak çözmeniz gereken (örneğin, düzenleme ve düzeltme) çakışmalara neden olabileceğini unutmayın.

Dikkat edilmesi gereken bir kılavuz:
Sadece şube yerelse ve henüz uzaktan kumandaya itmediyseniz yeniden pazarlayın!
Bunun nedeni, yeniden baslamanın, diğer insanların kendi taahhütlerini de içerebileceği tarihi değiştirebilmesidir.

Takip şubeleri

Bunlar adlandırılmış dallardır origin/branch_name(tam tersine branch_name). Kodu uzak depolara / depolara doğru itip çektiğinizde bu aslında gerçekleşen mekanizmadır. Örneğin, git pushbir şube çağırdığınızda building_groups, dalınız önce gider origin/building_groupsve ardından uzak depoya gider. Benzer şekilde, a yaparsanız git fetch building_groups, alınan dosya dalınıza yerleştirilir origin/building_groups. Daha sonra bu dalı yerel kopyanızla birleştirmeyi seçebilirsiniz. Bizim uygulamamız git fetchsadece birgit pull .

Yeni şubeler getiriliyor.

Yeni dallar edinme: Bir klonun ilk noktasında tüm dallara sahip olacaksınız. Bununla birlikte, diğer geliştiriciler şube ekleyip uzaktan kumandaya iterse, onları yerel olarak aşağı çekebilmek için bu dallar ve isimleri hakkında 'bilmenin' bir yolu olmalıdır. Bu, git fetchtüm yeni ve değiştirilmiş dalları izleme dalları (örn origin/.) Kullanılarak yerel depoya alacak olan bir yolla yapılır . fetchEd edildikten sonra git branch --remote, izleme dallarını listelemek ve git checkout [branch]gerçekte herhangi bir taneye geçmek mümkündür.

birleştirme

Birleştirme, farklı dallardan veya aynı dalın farklı sürümlerindeki kod değişikliklerini birleştirme işlemidir (örneğin, yerel bir dal ve uzaktan kumanda eşitlenmediğinde). Kişi bir dalda iş geliştirdiyse ve iş tamamlanmış, hazır ve test edilmişse, masterdalda birleştirilebilir . Bu, şubeye git checkout mastergeçmek için yapılır . Birleştirme tüm farklı dosyaları ve hatta farklı değişiklikleri aynı dosyalarda bir araya getirecektir. Bu, tüm değişiklikleri birleştirmek için dosyaların içindeki kodu değiştireceği anlamına gelir.mastergit merge your_branch

Yaparken checkoutbir mastero aynı zamanda bir yapmak önerilir git pull origin masteruzak ustanın en son sürümünü almak için yerel efendi birleştirilecek. Uzak yönetici değiştiyse, yani, moved forwardbunu sırasında yansıtan bilgileri görürsünüz git pull. Eğer durum buysa (master değişti) tavsiye edilir git checkout your_branchve sonra rebasemaster'ınızın değişmesi 'yeni' master'ın üstüne 'tekrar' oynatılır. Ardından, bir sonraki paragrafta gösterildiği gibi master'ı güncellemeye devam edersiniz.

Çakışma yoksa, master'a yeni değişiklikler eklenir. Çakışmalar varsa, aynı dosyaların otomatik olarak birleştirilemediği benzer kod satırlarında değişiklikler olduğu anlamına gelir. Bu durumda git merge new_branchçözülmesi gereken çakışma (lar) olduğunu bildirir. Dosyaları (her ikisinde de değişiklik olacak) düzenleyerek, istediğiniz değişiklikleri seçerek, istemediğiniz değişiklik satırlarını silerek ve ardından dosyayı kaydederek 'çözersiniz'. Değişiklikler ========ve gibi ayırıcılar ile işaretlenir <<<<<<<<.

Herhangi bir çatışmayı çözdükten sonra bir kez daha git addve git commitbirleştirmeye devam etmek için bu değişiklikler yapacaksınız (bu işlem sırasında size yol göstermesi için git'ten geri bildirim alacaksınız).

İşlem iyi çalışmadığında git merge --abort, şeyleri sıfırlamak için çok kullanışlı olduğunu göreceksiniz .

Etkileşimli yeniden bastırma ve ezme / yeniden sıralama / kaldırma işlemleri

Çok sayıda küçük adımda iş yaptıysanız, örneğin, kodu her gün 'devam eden çalışma' olarak taahhüt ediyorsanız, bu çok sayıda küçük taahhüdü birkaç daha büyük işin içine 'ezmek' isteyebilirsiniz. Bu özellikle meslektaşlarınızla kod incelemeleri yapmak istediğinizde yararlı olabilir. Attığınız tüm 'adımları' (taahhütler aracılığıyla) tekrarlamak istemezsiniz, sadece bu iş için yaptığım tüm değişikliklerin tek bir taahhütte nihai etkisi (fark) olduğunu söylemek istersiniz.

Bunu yapıp yapmamaya karar verirken değerlendirilecek temel faktör, birden çok işlemin aynı dosya veya dosyalara birden çok kez karşı olup olmadığıdır (bu durumda taahhütleri ezmek daha iyidir). Bu, etkileşimli yeniden bastırma aracıyla yapılır. Bu araç, taahhütleri ezmenize, taahhütleri silmenize, mesajları geri almanıza vb. Olanak tanır. Örneğin, git rebase -i HEAD~10( not: bu a ~değil, a- ) aşağıdakileri getirir:

Git'te etkileşimli yeniden temel oluşturma

Yine de dikkatli olun ve bu aracı 'zencefil' kullanın. Her seferinde bir squash / delete / reorder yapın, bu işlemden çıkın ve kaydedin, ardından aracı yeniden girin. Taahhütler bitişik değilse, bunları yeniden sıralayabilirsiniz (ve sonra gerektiği gibi ezebilirsiniz). Burada da taahhütleri silebilirsiniz, ancak bunu yaparken ne yaptığınızdan emin olmanız gerekir!

çatallar

Git depolarında işbirliği için iki ana yaklaşım vardır. Yukarıda detaylandırılan ilk, doğrudan insanların çektiği ve ittiği şubelerdir. Bu ortak çalışanların uzak depoya kayıtlı SSH anahtarları vardır. Bu, doğrudan bu depoya itmelerine izin verecektir. Dezavantajı, kullanıcı listesini tutmanız gerektiğidir. Diğer yaklaşım - çatallama - herkesin depoyu 'çatallamasına' izin verir, temel olarak kendi Git depo hesabında yerel bir kopya oluşturur. Daha sonra değişiklik yapabilirler ve bittiğinde kodu kabul etmek için bir 'çekme isteği' (gerçekten onlardan bir 'itme' ve gerçek depo bakımcısı için bir 'çekme' isteği) gönderir.

Bu ikinci yöntem, çatal kullanarak yok değil deposu için kullanıcıların bir listesini tutmak için birini gerektirir.


GitHub

GitHub (uzak bir depo) normalde böyle bir deponuz varsa (veya bunlara eklenirseniz) taahhüt edilen değişiklikleri ittiğiniz ve çektiğiniz uzak bir kaynaktır, bu nedenle yerel ve uzak aslında oldukça farklıdır. Uzak depoyu düşünmenin başka bir yolu .gitda uzak bir sunucuda yaşayan bir dizin yapısı olmasıdır.

Size 'çatal' Zaman - GitHub web tarayıcısı GUI bu düğmeye tıklamak gibi Çatal düğmesinin resmi- Eğer kodun kopyasını ( 'klon') oluşturmak için GitHub hesabında. İlk kez yaptığınızda biraz ince olabilir, bu nedenle, depo sahibi bir kod tabanının altında listelenen - orijinal sahibi veya 'çataldan' ve aşağıdaki gibi baktığınızdan emin olun:

Çatallı deponun adının görüntüsü

Yerel kopyaya sahip olduğunuzda, istediğiniz gibi değişiklikler yapabilirsiniz (bunları yerel bir makineye çekerek). İşiniz bittiğinde, orijinal depo sahibine / admin'e bir 'çekme isteği' gönderirsiniz (kulağa hoş geliyor, ancak aslında bunu tıklıyorsunuz:Çekme isteği düğmesinin resmi :) ve onu 'çekiyorlar'.

Kod üzerinde birlikte çalışan bir ekip için daha yaygın olan veri havuzunu klonlamaktır (deponun ana ekranındaki 'kopyala' simgesine tıklayın). Ardından, yerel olarak yazıngit clone ve yapıştırın. Bu sizi yerel olarak kurar ve ayrıca (paylaşılan) GitHub konumuna itebilir ve çekebilirsiniz.

Klonlar

GitHub'daki bölümde belirtildiği gibi, bir klon bir deponun kopyasıdır. Uzak bir deponuz olduğunda, git clonekomutun URL'sine karşı komut verirsiniz ve ardından deponun yerel bir kopyası veya klonuyla sonuçlanırsınız. Bu klon, her şeye sahiptir , dosyalar, ana dal, diğer dallar, mevcut tüm taahhütler, bütün mesele. Bu klon ekler ve karşı taahhütte ve daha sonra uzak depo kendisi taahhüt bu itmek olduğunu. Git'i (ve Mercurial gibi sistemlere benzer) DVCS ( Dağıtılmış sistemleri) SVN, PVCS, CVS vb. Gibi daha geleneksel CVS'lerin (Kod Sürümleme Sistemleri) aksine Sürüm Kontrol Sistemi) . doğrudan uzak depoya bağlısınız.

görüntüleme

Temel kavramların görselleştirilmesi
http://marklodato.github.com/visual-git-guide/index-en.html ve http://ndpsoftware.com/git-cheatsheet.html#loc=index adresinde görülebilir.

Değişikliklerin nasıl çalıştığının görsel olarak görüntülenmesini istiyorsanız görsel aracı yenemezsiniz gitg(gitx macOS için) 'metro haritası' (özellikle Londra Metrosu) olarak adlandırdığım bir GUI ile kimin ne yaptığını göstermek için harika, işlerin nasıl değiştiği, saptığı ve birleştiği vb.

Değişikliklerinizi eklemek, uygulamak ve yönetmek için de kullanabilirsiniz!

Gitg / gitx arayüzünün görüntüsü

Gitg / gitx oldukça az olsa da, GUI araçlarının sayısı artmaya devam ediyor. Birçok Mac kullanıcısı brotherbard'ın gitx çatalını kullanır ve Linux için harika bir seçenek, sezgisel ama güçlü bir arayüze sahip smart-git'tir:

Smart-git GUI görüntüsü

Bir GUI aracıyla bile, muhtemelen komut satırında çok sayıda komut yapacağınızı unutmayın.

Bunun için, dosyamda ~/.bash_aliases( ~/.bashrcher terminal oturumu için dosyamdan çağrılır) aşağıdaki diğer adlar var :

# git
alias g='git status'
alias gcob='git checkout -b '
alias gcom='git checkout master'
alias gd='git diff'
alias gf='git fetch'
alias gfrm='git fetch; git reset --hard origin/master'
alias gg='git grep '
alias gits='alias | grep "^alias g.*git.*$"'
alias gl='git log'
alias gl1='git log --oneline'
alias glf='git log --name-status'
alias glp='git log -p'
alias gpull='git pull '
alias gpush='git push '

AND benim ~/.gitconfigdosyada aşağıdaki "git aliases" var - neden bunlar?
Böylece şube tamamlama (SEKME tuşu ile) çalışıyor!

Yani bunlar:

[alias]
  co = checkout
  cob = checkout -b

Örnek kullanım: git co [branch]<- şubeler için sekme tamamlama çalışması yapılacaktır.

GUI Öğrenme Aracı

Bazı temel kavramları öğrenirken https://learngitbranching.js.org/ adresini faydalı bulabilirsiniz . Ekran görüntüsü: Video: https://youtu.be/23JqqcLPss0resim açıklamasını buraya girin

Son olarak, 7 kilit hayat kurtarıcı!

  1. Değişiklikler yaparsınız, ekler ve taahhüt edersiniz (ama itmeyin) ve sonra oh! usta olduğunuzu anlıyorsunuz!

    git reset [filename(s)]
    git checkout -b [name_for_a_new_branch]
    git add [file(s)]
    git commit -m "A useful message"
    
    Voila!  You've moved that 'master' commit to its own branch !
  2. Yerel bir şubede çalışırken bazı dosyaları karıştırırsınız ve en son yaptığınız şeye geri dönmek istersiniz git pull:

    git reset --hard origin/master  # You will need to be comfortable doing this!
  3. Yerel olarak değişiklik yapmaya başlarsınız, yarım düzine dosyayı düzenlersiniz ve sonra, ah, hala ana (veya başka bir) daldasınız:

    git checkout -b new_branch_name  # just create a new branch
    git add .                      # add the changes files
    git commit -m"your message"    # and commit them
  4. Geçerli dalınızdaki belirli bir dosyayı dağıtırsınız ve temelde o dosyayı uzak depodan en son çektiğinizde nasıl "sıfırlamak" (değişiklikleri kaybetmek) istersiniz:

    git checkout your/directories/filename

    Bu aslında dosyayı sıfırlar (birçok Git komutu gibi burada yaptığı şey için iyi adlandırılmamıştır).

  5. Sen bunu yaparken bunları kaybetmek yok emin olmak için, yerel olarak bazı değişiklikler yapmak bir git resetveya rebase: Sık sık tüm proje manuel kopyasını (yapmak cp -r ../my_project ~/ı Git veya önemli kaybetmek de pisliği olabilir eğer emin değilim ne zaman) değiştirir.

  6. Yeniden temellendiriyorsunuz ama işler bozuluyor:

    git rebase --abort # To abandon interactive rebase and merge issues
  7. Git şubenizi PS1isteminize ekleyin (bkz. Https://unix.stackexchange.com/a/127800/10043 ), ör.

    Bilgi istemi görüntüsü

    Şube selenium_rspec_conversion.


1
2/20/12 Rebase vs. rebase hakkında bilgi eklendi
Michael Durrant

1
16.06.2012 Klonlar hakkında daha ayrıntılı bilgi için bölüm eklendi.
Michael Durrant

4
Çok fazla metin !! Ben basit Subversion :-) sopa olacak
Jonny

6
ha? Bir alt sürüm kullanıcı, alt sürümün kullanımı hakkında bir kitap da yazabilir. Bence yıkım daha az işlevselliğe sahip daha eski bir teknoloji. Şahsen git kullanımı çok kolay buluyorum. ymmv
Michael Durrant

3
Vay canına Micheal! SO tamamen bilgiyi paylaşmakla ilgilidir. Harika çalışma için teşekkürler, kesinlikle +1
Michiel

143

Oliver Steele'nin her şeyin birbirine nasıl uyduğuna dair görüntüsü:

resim açıklamasını buraya girin


6
Bu görüntü, çoğu insanın her durumda aşina olduğundan emin olduğum "git clone" eklemek için güncellenebilir.
Contango

3
@Gravitas, bu grafiği gerçekten çok seviyorum, ancak dosyaların ne zaman yazıldığını ve birleştirildiklerini söylemiyor. Bu komutlar için hangisinin hangisi olduğunu bana bildirir misin? Belki de üstteki üzerine yazma komutları ve sürücülerin altındaki birleştirme komutları? Teşekkürler.
zylstra

Anladığım kadarıyla, git pull ne istersen uzaktan kumandadan aşağı çekecek (yani, istediğin bagaj) ve isteği yaparken anında şubeye birleştireceksin. Çekme, varsayılan olarak 'getir', ardından 'birleştirme' veya '–rebase' ile yeniden tabanlaştırma yapan üst düzey bir istektir. Onsuz yapabilirsiniz, bu sadece bir kolaylık.
Contango

Git klonu bu diyagramda tam olarak nereye gider? Ayrıca git birleştirme? Gitmek için çok yeniyim ama bu resmi beğendim.
Mishelle

2
Diyagramın güncellenmiş bir versiyonunu yapıp yapamayacağımı göreceğim.
Contango

8

Çatal Vs. Klon - her ikisi de kopya anlamına gelen iki kelime

Lütfen bu şemaya bakın . (Aslen http://www.dataschool.io/content/images/2014/Mar/github1.png adresinden ).

.-------------------------.     1. Fork     .-------------------------.
| Your GitHub repo        | <-------------- | Joe's GitHub repo       |
| github.com/you/coolgame |                 | github.com/joe/coolgame |
| ----------------------- | 7. Pull Request | ----------------------- |
| master -> c224ff7       | --------------> | master -> c224ff7 (c)   |
| anidea -> 884faa1 (a)   |                 | anidea -> 884faa1 (b)   |
'-------------------------'                 '-------------------------'
    |                 ^
    | 2. Clone        |
    |                 |
    |                 |
    |                 |
    |                 |
    |                 | 6. Push (anidea => origin/anidea)
    v                 |
.-------------------------.
| Your computer           |  3. Create branch 'anidea'
| $HOME/coolgame          |
| ----------------------- |  4. Update a file
| master -> c224ff7       |
| anidea -> 884faa1       |  5. Commit (to 'anidea')
'-------------------------'

(a) - after you have pushed it
(b) - after Joe has accepted it
(c) - eventually Joe might merge 'anidea' (make 'master -> 884faa1')

Çatal

  • Uzak deponuzun (bulut) Joe'suna bağlayan bir kopyası
  • Daha sonra yerel reponuza klonlayabileceğiniz bir kopya ve F *% $ - up
  • İşiniz bittiğinde uzaktan kumandanıza geri itebilirsiniz
  • Daha sonra Joe'ya çekme isteğini tıklayarak projesinde kullanmak isteyip istemediğini sorabilirsiniz

Klon

  • yerel reponuzun bir kopyası (sabit disk)

Gerçek DVCS avantajının, Joe'nun repo için bunu yapmak için herhangi bir özel erişim iznine ihtiyacınız olmadığına dikkat edin . Joe sizi daha sık katkıda bulunmaya çağırırsa, size erişim haklarını zorlayabilir: onlar doğrudan deposuna gidebilir anideave çatalınızı güncel tutma işlerini kurtarabilir. OTOH, Joe ile anlaşmaya varmazsanız, sadece çatalınızı geliştirmeye ve kullanmaya devam edebilirsiniz (ve daha sonra fikrini değiştirip değiştiremeyeceğinizi görebilirsiniz).
Alois Mahdal

6

Sadece başkalarına eklemek için, çatallamaya özgü bir not.

Teknik olarak, repoyu klonlamanın ve repoyu çatallamanın aynı şey olduğunu anlamak güzel. Yapmak:

git clone $some_other_repo

ve arkada kendinize dokunabilirsiniz --- sadece başka bir depoyu çatalladınız.

Git, bir VCS olarak, aslında çatalları klonlamakla ilgilidir . Dışında böyle cgit olarak uzak kullanıcı arayüzünü kullanarak "sadece gezen" dan, içermez git repo ile çok az var çatallama noktada repo klonlama.

Ancak,

  • Birisi dediğinde ben repo X çatallı , onlar başka bir yerde niyetiyle repo bir klon oluşturduk anlamına maruz (bazı deneyler göstermek için, ya da farklı erişim kontrol mekanizması uygulamak için örneğin. olmadan insanları izin örneğin, başkalarına Github erişimi ancak işbirliği için şirket içi hesap ile).

    Gerçek şu ki: repo büyük olasılıkla başka bir komutla yaratılır, büyük olasılıkla git clonebirisinin dizüstü bilgisayarının aksine bir sunucuda bir yerde barındırılır ve büyük olasılıkla biraz farklı bir formata sahiptir ("çıplak bir repo", yani çalışma ağacı olmadan) hepsi sadece teknik detaylar.

    Büyük olasılıkla farklı dallar, etiketler veya taahhütler içereceği gerçeği, büyük olasılıkla bunu ilk etapta yapmalarının nedenidir.

    (Github, "çatal" ı tıkladığınızda ne yapar, eklenmiş şekerle klonlamaktır: repoyu sizin için klonlar, hesabınıza koyar, "çatallı" bir yeri kaydeder, "yukarı akış" adlı uzaktan kumandayı ekler ve en önemlisi, güzel animasyon oynatır.)

  • Birisi repo X'i klonladığımı söylediğinde , dizüstü bilgisayarlarında veya masaüstünde yerel olarak repo klonu oluşturdular, niyet çalışmasıyla oynayın, onunla oynayın, katkıda bulunun veya içindeki kaynak koddan bir şeyler oluşturun.

Git'in güzelliği, bunların hepsinin birbirine mükemmel bir şekilde uymasıdır: tüm bu depolar blok taahhüt zincirinin ortak kısmını paylaşır, böylece uygun gördüğünüzde tüm bu depolar arasındaki değişiklikleri güvenli bir şekilde (aşağıdaki nota bakın) birleştirmek mümkündür.


Not: zincirin ortak kısmını yeniden yazmadığınız sürece ve değişiklikler çakışmadığı sürece "güvenli".

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.