Git'te getirme çekmekten nasıl farklıdır ve birleştirme yeniden tabandan nasıl farklıdır?


160

Bunu anlayamıyorum. Web'de ve kitaplarda çok şey okudum ve bir şey sadece kafamda kalmıyor. Birisi bana aşağıdakilerin kukla sürümünü verebilir mi:

  • git getirme vs çekme
  • git merge vs rebase

24
Soru soran kişiye sempati duyuyorum. Dokümantasyon ve öneriler o kadar ağır ve olası iş akışı permütasyonları o kadar büyük ki, aşırı derecede karışıyor. Olanlar kafa patladı ve ne soracağını tam olarak bilmiyor, o kadar da açık değil.
Ed Randall

3
Neden pestrella cevabını kabul edildiği gibi seçmiyorsunuz?
Arashsoft

@Arashsoft 2013'ten beri görülmediği için
VdeX

Yanıtlar:


415

çek ve çek

fetch depodaki verilerinizi güncelleyerek uzak * daldaki değişiklikleri indirir, ancak yerel * dalınızı değiştirmeden bırakır.

pullyerel şubenizde bir fetchve ek mergeolarak değişiklikler gerçekleştirir .

Fark ne? pullyerel şubeyi, çekilen şubedeki değişikliklerle günceller. A fetchyerel şubenizi ilerletmez.

birleştirme vs rebase

Aşağıdaki geçmiş göz önüne alındığında:

          C --- D --- E yerel
         /
    A --- B --- F --- G uzaktan kumanda

mergeiki geliştirme tarihine birlikte katılır. Bunu, uzak dalın üstüne ayrıldıktan sonra yerel dalınızda meydana gelen değişiklikleri tekrarlayarak yapar ve sonucu yeni bir taahhüde kaydeder. Bu operasyon, her bir taahhüdün soyunu korur.

Bir mergeirade etkisi :

          C --- D --- E yerel
         / \
    A --- B --- F --- G --- H uzaktan kumanda

rebaseyerel şubenizde var olan taahhütleri alır ve uzak şubenin üstüne yeniden uygular. Bu işlem, yerel taahhütlerinizin atalarını yeniden yazar.

Bir rebaseirade etkisi :

                  C '- D' - E 'yerel
                 /
    A --- B --- F --- G uzaktan kumanda

Fark ne? A merge, taahhütlerin soyunu değiştirmez. Bir rebase yerel kaydedilmesini atalarının yeniden yazar.

*Bu açıklama geçerli dal yerel şube olduğunu varsayar ve şube için argüman olarak belirtilen fetch, pull, mergeveya rebaseuzak bir dalıdır. Bu olağan durum. pullörneğin, belirtilen şubedeki değişiklikleri indirir , deponuzu ve geçerli şubedeki mergedeğişiklikleri günceller .


31
Bu, her uygulamanın arkasındaki tartışmaya girmeden en basit ve en iyi açıklamadır. Teşekkür ederim!
Jonathan S. Fisher

3
Kesinlikle altın cevap
ChaseMoskal

5
Bu yanıtı "favori" yapabilseydim. Belki sadece yazdıracağım ve duvarıma bantlayacağım.
LarsH

2
Stackoverflow aldığım en iyi cevapların en iyi söyleyebilirim, Teşekkürler
Shahab J

1
Getirme yalnızca uzak daldaki değişiklikleri indirir ve depo verilerini günceller, ancak yerel dalı değiştirmezse, çalışma dizini değişiklikleri göstermiyor / yansıtmıyorsa getirme noktası nedir? Asıl sorum, bir başkasının yaptığı değişiklikleri nasıl görebildiğimi ve ardından bunları çalışma dizinimle birleştirmek isteyip istemediğime karar verebilmemdi (yani işimi bozmadığından emin olmak için diğer insanların değişikliklerini denemek) ama hala bunu nasıl yapacağını karıştı? Sadece atmalı ve deney / keşfetmeli miyim ve eğer sorunluysa, sıfırlama mı yapmalıyım?

28

Çekme ve Çekme

Git getirme sadece repo verilerinizi günceller, ancak git çekme temelde bir getirme gerçekleştirir ve sonra çekilen dalı birleştirir

'Git pull' ve 'git fetch' arasındaki fark nedir?


Birleştirme ve Rebase

Atlassian SourceTree Blog, Birleştirme veya Rebase'den :

Birleştirme, her bir taahhüt tarihinin soyunu korurken iki gelişme çizgisini bir araya getirir.

Buna karşılık, yeniden baslama, geliştirme dallarını değişiklikleri hedef dalın çocukları olarak görünmeleri için kaynak daldan yeniden yazarak birleştirir - bu taahhütlerin hedef dalın üstüne yazıldığını etkili bir şekilde iddia eder.

Ayrıca, HackerNews'e (gönderi bağlantısı ) gönderilen ve çok fazla dallanma ve birleştirme hilesi öğreten güzel bir oyun olan Git Branching'i öğrenin . Bu konuda çok yardımcı olacağına inanıyorum.


teşekkürler Felips .. öyleyse bir uzak bir getirme yaparsanız benim ana şube güncellemeleri olmayacak? Ayrıca daha sonra
merga

rebase vs merge, niyetinizin ne olduğuna bağlıdır, rebase'in tüm taahhütleri yeniden yazdığını aklınızda bulundurun. Ve evet, yalnızca getirirseniz, ana dal değişmez, uzaktan değişiklikleri uygulamak için birleştirmeniz (veya çekmeniz) gerekir
Felipe Sabino

git merge <remote>/<branch>. örneğin, ana dalınız ve uzaktan kumandanız kökenli ise, bunu yapabilirsiniz git merge origin/master.
Felipe Sabino

bu yüzden her zaman bir git checkout master yapmalıyım gibi geliyor git fetch git diff origin / master git rebase origin master
techsjs2013 15:13

8

çek ve çek :

Bunu anlamanın yolu git pull, basitçe git fetchbunu izlemektir git merge. Yani değişiklikleri uzak bir daldan alıp geçerli dalda birleştirirsiniz.


birleştirme vs rebase :

Komutun dediği gibi bir birleştirme yapılır; geçerli dal ile belirtilen dal arasındaki farkları birleştirir (geçerli dalda). Yani komut mevcut dalda git merge another_branchbirleşir another_branch.

Bir rebase biraz farklı çalışır ve biraz havalıdır. Diyelim ki komutu yerine getirdiniz git rebase another_branch. Git önce geçerli şube ile arasında en son ortak sürümü bulur another_branch. Yani dallar ayrılmadan önceki nokta. Sonra git bu ıraksak noktayı başına götürecektir another_branch. Son olarak, orijinal ıraksak noktadan beri mevcut daldaki tüm taahhütler yeni ıraksak noktadan tekrar oynatılır . Bu, daha az dal ve birleşme ile çok temiz bir tarih yaratır.

Ancak, tuzaklar olmadan değil! Sürüm geçmişi "yeniden yazıldığı" için, bunu yalnızca taahhütler yalnızca yerel git deponuzda varsa yapmalısınız. Yani: Taahhütleri uzak bir repoya ittiyseniz bunu asla yapmayın.

Bu çevrimiçi kitapta verilen yeniden temellendirmeye ilişkin açıklama, anlaşılması kolay resimlerle oldukça iyidir.


birleştirme yerine yeniden basma ile çekme

Aslında rebase'i çok kullanıyorum, ancak genellikle çekme ile birlikte:

git pull --rebase

uzaktan değişiklikleri alır ve birleştirme yerine yeniden taban oluşturur. Yani en son çektiğiniz andan itibaren tüm yerel taahhütlerinizi tekrar oynatır. Bu birleştirme ile normal bir çekme yapmaktan daha temiz buluyorum, bu da birleşmelerle ekstra bir taahhüt yaratacak.


eğer çalışıp dallıyorsam ve bir itme yapmadan önce onu efendi ile birleştirmek istersem. Ben ödeme ustası, sonra rebase düzeltme olsun?
2013

Hala
Rebase

Bence pestrella cevabının verdiği illüstrasyonlar farkı oldukça net bir şekilde gösteriyor. Ayrıca, kontrol edin: git-scm.com/book/en/Git-Branching-Rebasing - açıklamak oldukça iyi bir iş çıkarır ( cevaptaki ile aynı bağlantı, ancak tembel olanlar için tekrar verilir).
Steinar

0

Birleştirme - HEAD dalı, her bir taahhüt tarihinin soyunu koruyarak yeni bir taahhüt oluşturacaktır. Birleştirme taahhütleri paralel olarak aynı dalda çalışan birden fazla kişi tarafından yapılırsa tarih kirlenebilir.

Rebase - Yeni bir taahhüt oluşturmadan bir dalın değişikliklerini bir başkasına yeniden yazar. Kod geçmişi basitleştirilmiş, doğrusal ve okunabilir ancak çekme istekleriyle çalışmaz, çünkü birisinin ne gibi küçük değişiklikler yaptığını göremezsiniz.

Ben kullanırsınız git mergeözellik tabanlı iş akışı ile uğraşırken ya da ben rebase aşina değilim eğer. Ama daha temiz, doğrusal bir tarih istiyorsam git rebasedaha uygun olur. Daha fazla ayrıntı için bu birleştirme veya yeniden oluşturma makalesine göz atın .

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.