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

Moderatörün notu. Bu soruya altmış yedi cevap gönderildiği göz önüne alındığında (bazıları silinmiştir), bir başkasını göndermeden önce yeni bir şey ekleyip eklemeyeceğinizi düşünün.

git pull ve git fetch arasındaki farklar nelerdir?

10500
15 нояб. pupeno 15 kaseti ayarlayın . 2008-11-15 12:51 '08, saat 12:51 2008-11-15 12:51
@ 46 cevaplar
  • 1
  • 2

En basit ifadeyle, git pull bir git fetch ardından git merge .

Uzaktan izleme şubelerini refs/remotes/<remote>/ içinde güncellemek için istediğiniz zaman git fetch yapabilirsiniz.

Bu işlem, hiçbir zaman refs/heads kendi yerel şubelerinizi değiştirmez ve çalışma kopyasını değiştirmeden güvenlidir. İnsanların zaman zaman arka planda bir cron işine git fetch bile duydum (bunu tavsiye etmememe rağmen).

git pull özelliği, yerel şubeyi uzak sürümünüzle güncellemek ve diğer uzak takip dallarını güncellemek için yapacağınız şeydir.

Git belgeleri: Git çekme

8755
15 нояб. Tarafından cevap Greg Hewgill 15 Kas 2008-11-15 12:52 '08, 12:52 2008-11-15 12:52
  • pull kullandığınızda Git, işinizi sizin için otomatik olarak yapmaya çalışır. Bu içeriğe duyarlıdır , bu nedenle Git, üzerinde çalışmakta olduğunuz şubedeki tüm gönderim işlemlerini birleştirecektir. pull önce onları görmenize izin vermeden taahhütleri otomatik olarak birleştirir , şubelerinizi yönetmede çok iyi değilseniz sık çatışmalarla karşılaşabilirsiniz.

  • Getirdiğinizde Git, geçerli şubenizde bulunmayan, hedef şubenizden herhangi bir taahhüt toplar, ancak bunları yerel depoda saklar . Ancak, bunları geçerli şubenizle birleştirmez . Bu, özellikle havuzunuzu sürekli güncellemeniz gerekiyorsa, ancak dosyalarınızı güncellerseniz neyin kırılabileceği üzerinde çalışmak için kullanışlıdır. Taahhütleri ana şubeye entegre etmek için merge .

border=0
1919
18 авг. Cevap Mouna Cheikhna 18 Ağustos tarafından verilen . 2011-08-18 11:53 '11 11:53 2011-08-18 11:53

Git tasarım felsefesini, SVN gibi daha geleneksel bir kaynak yönetim aracının felsefesiyle karşılaştırmak önemlidir.

Subversion, bir istemci / sunucu modeli kullanılarak tasarlandı ve üretildi. Bir sunucu olan bir havuz var ve birkaç müşteri sunucudan kod çıkarabilir, onunla çalışabilir ve daha sonra sunucuya geri aktarabilir. Bir işlem yapması gerektiğinde müşterinin her zaman sunucuya başvurabileceği varsayılır.

Git, merkezi bir depoya ihtiyaç duymadan daha dağıtılmış bir modeli desteklemek için tasarlandı (yine de isterseniz kesinlikle kullanabilirsiniz). Ayrıca, git, müşterinin ve "sunucunun" aynı anda çevrimiçi olmaması için tasarlanmıştır. Git, güvenilmez bir bağlantıdaki kişilerin e-postayla kod alışverişi yapabilecekleri şekilde tasarlanmıştır. Çalışmayı tamamen devre dışı bırakabilir ve git üzerinden kod alışverişi yapmak için bir CD yazabilirsiniz.

Bu modeli desteklemek için git, kodunuzun bulunduğu yerel bir depoyu ve uzak havuzun durumunu yansıtan ek bir yerel depoyu korur. Uzak havuzun bir kopyasını yerel olarak saklayarak, uzak havuz mevcut olmasa bile git gereken değişiklikleri belirleyebilir. Daha sonra, bir başkasına değişiklik göndermeniz gerektiğinde, git, uzaktan depoda bilinen zamandan itibaren bir dizi değişiklik olarak aktarabilir.

  • git fetch , "Uzak havuzdaki yerel kopyamı bugüne kadar getirin" yazan bir komuttur.

  • git pull diyor ki: "Kodlarımı sakladığım uzak depodaki değişiklikleri getir."

Normalde, git pull , uzak havuzun yerel bir kopyasını güncellemek için git fetch çalıştırarak bunu yapar ve ardından değişiklikleri kendi kod deponuzda ve muhtemelen çalışan kopyanızda birleştirir.

İş istasyonunuzda projenin en az üç kopyasının olduğunu unutmayın. Bir kopya, kendi taahhüt geçmişine sahip kendi deponuzdur. İkinci kopya, düzenlediğiniz ve oluşturduğunuz çalışma kopyanızdır. Üçüncü kopya, uzak deponun yerel "önbelleğe alınmış" kopyasıdır.

1066
31 марта '13 в 21:43 2013-03-31 21:43 Cevap MikeD tarafından 31 Mart 13 : 21 : 43'te verilmiştir 2013-03-31 21:43
711
09 июня '15 в 16:30 2015-06-09 16:30 cevabı Contango 09 Haziran '15 de 4:30 pm de verilir 2015-06-09 16:30

git fetch işleminin bir kullanımı, aşağıdaki iletinin, uzaktaki son çekmeden bu yana yapılan değişiklikler hakkında size bilgi vermesidir ... böylece gerçek çekmeden önce kontrol edebilirsiniz; bu, geçerli dalınızdaki dosyaları değiştirebilir ve bir kopyasını çalıştırabilir. .

 git fetch git diff ...origin 
437
07 мая '10 в 22:23 2010-05-07 22:23 Cevap, Mayıs 07, 10'da 10: 23'te verilecek 2010-05-07 22:23

Aradaki farkın ne olduğunu biraz anlamak zorunda kaldım, ama bu basit bir açıklama. Localhost'unuzdaki master bir daldır.

Bir havuzu klonladığınızda, yerel ana bilgisayarın deposunun tamamını alırsınız. Bu, şu anda HEAD kaynak / ana işaretçiye ve aynı HEAD işaret eden HEAD sahip olduğunuz anlamına gelir.

çalışmaya başladığınızda ve bunu yaptığınızda, ana işaretçiyi HEAD + ile sabitlemelerinize aktarırsınız. Ancak baş>

Böylece, fark olacaktır:

  • git fetch çalıştırırsanız, uzak havuzdaki ( GitHub ) tüm değişiklikleri kolayca ayıklar ve start / master işaretçisini HEAD'e taşır. Bu arada, yerel şube sihirbazınız nerede olduğunu göstermeye devam edecektir.
  • git pull yaparsanız, temel olarak (daha önce açıklandığı şekilde) ayıklanır ve yeni değişiklikleri ana dalda birleştirir ve işaretçiyi HEAD taşır.
347
11 мая '12 в 21:37 2012-05-11 21:37 Cevap 11 Mayıs’ta, 12’de 21:37’de verilmiş. 2012-05-11 21:37

Bazen görsel bir sunum yardımcı olur.

2019

25 янв. cevap 25 jandarlı yolcu gemisi tarafından verildi . 2016-01-25 20:28 '16, 20:28, 2016-01-25 20:28

kısaca

git fetch , pull benzer ancak birleşmez. yani uzak güncellemeleri ayıklar ( refs ve objects ), ancak refs değişmeden kalır (yani, origin/master güncellendi, ancak master aynı kalır).

git pull konsoldan düştü ve anında birleşiyor.

daha büyük

git clone klonları repoları.

git rebase , mevcut git rebase yükselen dalda olmayan malzemeyi geçici alana kaydeder. İş parçacığınız şimdi değişikliklerinizi başlatmadan önceki aynı. Bu nedenle, git pull -rebase silinen değişiklikleri geri çeker, yerel şubenizi geri git pull -rebase , mevcut şubenin tepesindeki değişiklikleri en son gelişmelerden bugüne kadar birer birer tekrarlar.

Ek olarak, git branch -a , tüm şubelerinizde neler olduğunu tam olarak gösterecektir - yerel ve uzak.

Bu blog yazısı yardımcı oldu:

Git çekme, git getir ve git klonu (ve git rebase) arasındaki fark - Mike Pierce

ve git pull , git fetch , git clone ve git rebase .

====

GÜNCELLEME

Uygulamada gerçekte nasıl kullandığınızı göstermek için güncellediğimi sanıyordum.

  1. Yerel reponuzu uzak bir cihazdan güncelleyin (ancak birleştirme):

     git fetch 
  2. Güncellemeleri indirdikten sonra, farklılıklara bakın:

     git diff master origin/master 
  3. Bu güncellemelerden memnunsanız, birleştirin:

     git pull 

notlar:

2. Adımda: Yerel ve uzak aygıtlar arasındaki farklar hakkında daha fazla bilgi için , bkz. Bölüm: Yerel bir git şubesini uzak bir şubeyle nasıl karşılaştırabilirim?

3. Adımda: Büyük olasılıkla, git rebase origin yapmak daha doğrudur (örneğin, hızla değişen bir depoda). Başka bir cevapta @Justin Ohms Yorumuna bakın.

Ayrıca Bakınız: http://longair.net/blog/2009/04/16/git-fetch-and-merge/

170
13 апр. Yanıtla Snowcrash Nis 13 2013-04-13 20:31 '13, 20:31, 2013-04-13 20:31
 git-pull - başka bir depodan veya yerel bir şubeden alın ve birleştirin ÖZET Git çekin ... TANIM Git-fetch'i çalıştırır  Alınan kafa (lar) mevcut dalı içine.  --Rebase ile git-rebase'i çağırır.  Git-Merge yerine. Kullanabileceğini unutmayın.  (geçerli dizin) çekilecek <rapor>  Yerel depodan - yerel şubeleri birleştirirken kullanışlıdır  geçerli şubeye. Ayrıca kendisini ve altta yatan git-birleştirme git-pull için seçenekler anlamına dikkat  Git-getir için.

Hikâyelerin birleşmesini istiyorsanız, sadece "kodu istemek" isteseniz çekersiniz, çünkü bazıları buraya bazı makaleler yazdı.

161
15 нояб. Tarafından verilen cevap Vinko Vrsalovic 15 Kas 2008-11-15 12:52 '08, 12:52 2008-11-15 12:52

Uzak havuzdan çıkarabilir, farklılıkları görebilir ve ardından çekebilir ya da birleştirebilirsiniz.

Bu, ilk origin/master dalı takip eden origin adında bir uzak havuza ve master adlı bir dal örneğidir:

 git checkout master git fetch git diff origin/master git rebase origin master 
147
21 марта '11 в 14:07 2011-03-21 14:07 Cevap Antonio Bardazzi tarafından 21 Mart 11, 14:07 2011-03-21 14:07 tarihinde verilmiştir.

Kısa ve basit cevap, git pull işleminin sadece git fetch ardından git merge .

git pull pull'un ister ister ister ister olmasanız, otomatik olarak birleştiğine dikkat etmek çok önemlidir. Bu, elbette, birleşme çatışmalarına yol açabilir. Konsolunuzun origin ve şubenizin master olduğunu varsayalım. git diff origin/master önce git diff origin/master iseniz, olası birleşme çatışmalarının farkında olmalısınız ve yerel şubenizi buna göre hazırlayabilirsiniz.

Çekme ve tıklamanın yanı sıra, bazı iş akışları , git rebase ilgili bir makaleden söz ettiğim git rebase , örneğin bu makaleyi içerir:

 git pull origin master git checkout foo-branch git rebase master git push origin foo-branch 

Kendinizi bu durumda bulursanız, git pull --rebase tarafından ayartılmış olabilirsiniz. Ne yaptığını gerçekten bilmiyorsan, yapmanı tavsiye ederim. Bu, git-pull için man sayfasındaki bir uyarıdır, sürüm 2.3.5 :

Bu potansiyel olarak tehlikeli bir çalışma şeklidir. Bu haberi daha önce yayınladığınızda iyiye işaret etmeyen bir hikayeyi yeniden yazar. Git-rebase'i (1) dikkatlice okumadıysanız, bu parametreyi kullanmayın.

139
15 мая '11 в 23:53 2011-05-15 23:53 Cevap 15 Mayıs ' 11’e 23:53 2011-05-15 23:53 tarihinde jfmercer tarafından verilmiştir.

2019

117
06 февр. Cevap üçte bir 06 Şubat'ta verildi. 2015-02-06 14:48 '15 14:48, 2015-02-06 14:48

Peki , işte git pull ve git fetch hakkında bazı bilgiler var, bu yüzden gerçek farkları anlayabilirsiniz ... birkaç basit kelimeyle, en son verileri alır, ancak kodu değiştirmez ve geçerli yerel şube kodunuzla iletişim kuramaz, ancak değişikliklerle kodu çıkarır ve yerel şubenizde birleştirin, her biri hakkında daha ayrıntılı bilgi almak için okumaya devam edin:

Git getir

Tüm bağlantıları ve nesneleri ve tüm yeni şubeleri yerel deponuza indirir ...

Bir veya daha fazla depodan dalları ve / veya etiketlerini (birlikte "refs") ve öykülerini tamamlamak için gereken nesneleri seçin. Uzaktan izleme dalları güncellendi (bu davranışı denetleme yolları için aşağıdaki Açıklamaya bakın).

Varsayılan olarak, çıkarılan hikayelere işaret eden herhangi bir etiket de alınır; Bunun etkisi, ilgilendiğiniz dallara işaret eden etiketleri çıkarmaktır. Bu varsayılan davranış, --tags veya --no-tags seçenekleri kullanılarak veya remote..tagOpt. Etiketleri açıkça çıkaran refspec kullanarak, ilgilendiğiniz dalları işaret etmeyen etiketleri çıkarabilirsiniz.

git getir, tek bir adlandırılmış havuzdan veya URL'den veya bir kerede birden fazla havuzdan verilebilirse, varsa konsollar da alınabilir. yapılandırma dosyasına yaz. (Bkz. Git-config 1 ).

Uzak bir aygıt belirtilmezse, geçerli dal için bir yukarı akış dalı yapılandırılmadıkça varsayılan baş>

Seçilen bağlantıların adları ve işaret ettikleri nesnelerin adları ile birlikte .git / FETCH_HEAD içine kaydedilir. Bu bilgiler komut dosyaları veya git-pull gibi diğer git komutları tarafından kullanılabilir.


Git çekme

Yerelden uzaktan geçerli şubeye değişiklikler uygular ...

Uzak bir depodan geçerli şubeye değişiklikler içerir. Varsayılan modda git çekme, git getirme için bir kısaltmadır, ardından git birleştirme FETCH_HEAD.

Daha spesifik olarak, git pull, verilen parametrelerle git fetch komutunu çalıştırır ve alınan dal başlıklarını geçerli branşta birleştirmek için git birleşimi çağırır. - rebase kullanarak, git birleştirme yerine git rebase'i çalıştırır.

git-fetch 1'e iletilen uzak havuzun adı olmalıdır. rasgele bir uzaktan ref (örneğin, etiket adı) veya buna karşılık gelen uzaktan izleme dalları olan bir bağlantı derlemesi (örneğin, refs / heads /: refs / remotes / origin /) olarak adlandırılabilir, ancak genellikle uzak havuzdaki şubenin adıdır.

Varsayılan değerler, git-branch --track tarafından ayarlandığı gibi, geçerli dal için "uzak" ve "birleştirme" yapılandırmalarından okunur ve okunur.


Ayrıca git fetch ve git pull birlikte nasıl çalıştığını göstermek için aşağıda görsel bir resim oluşturuyorum ...

2019

21 июня '17 в 12:48 2017-06-21 12:48 Cevap Alireza tarafından 21 Haziran 17'de 12:48 2017-06-06 12:48 tarihinde verilmiştir.

Bonus:

Yukarıdaki cevaplarda esnetme ve ekstrakt etmekten bahsetmişken, ilginç bir numarayı paylaşmak istiyorum,

git pull --rebase

Yukarıdaki komut, git hayatımda çok zaman kazandıran en kullanışlı komuttur.

Sunucuya yeni taahhütler göndermeden önce, bu komutu deneyin; en son sunucu değişikliklerini (getirme + birleştirme kullanarak) otomatik olarak senkronize edecek ve mesajınızı git günlüğüne en başa yerleştirecektir. Elle çekme / birleşme konusunda endişelenmenize gerek yok.

Bilgi bulabilirsiniz: http://gitolite.com/git-pull--rebase

113
23 дек. Cevap 23 Aralık'ta Sazzad Hissain Khan tarafından verildi. 2015-12-23 18:31 '15 18:31 2015-12-23 18:31

Bu tür şeyleri anlamak için durumun bir tür görsel temsiline sahip olmayı seviyorum. Belki başka geliştiriciler de bunu görmek ister, işte benim ekim. Her şeyin doğru olduğundan emin değilim, bu yüzden herhangi bir hata bulursanız lütfen yorum yapın.

  LOCAL SYSTEM . ===================================================== ================= . ================= =================== ============= REMOTE REPOSITORY . REMOTE REPOSITORY LOCAL REPOSITORY WORKING COPY (ORIGIN) . (CACHED) for example, . mirror of the a github repo. . remote repo Can also be . multiple repo . . . FETCH *------------------>* Your local cache of the remote is updated with the origin (or multiple external sources, that is git distributed nature) . PULL *-------------------------------------------------------->* changes are merged directly into your local copy. when conflicts occur, you are asked for decisions. . COMMIT . *<---------------* When coming from, for example, subversion, you might think that a commit will update the origin. In git, a commit is only done to your local repo. . PUSH *<---------------------------------------* Synchronizes your changes back into the origin. 

Konsol ayna görüntüsüne sahip olmanın ana faydalarından bazıları şunlardır:

  • Performans (tüm ağları ve mesajları ağ üzerinden sıkıştırmaya çalışmadan kaydırma)
  • Yerel deponuzun durumu hakkında geri bildirim (örneğin, kaynakla karşılaştırıldığında ileri veya geri gidip gelmeyeceğimi belirten bir ampul verecek olan Atlassian SourceTree kullanıyorum. GIT FETCH ile güncelleme).
107
20 февр. Cevap 20 Şubat'ta Justus Romijn tarafından verildi. 2014-02-20 00:18 '14, 0:18 2014-02-20 00:18

Ben de bununla mücadele ettim. Aslında, tam olarak aynı soru için Google’da arama yaptım. Tüm bu cevapları okuduktan sonra nihayet kafamda bir resim çizdim ve 2 depo ve 1 sanal alan ve başa çıkma eylemleri ile onların versiyonlarını izlemeye karar verdim. Demek bu şekilde buldum. Lütfen dağılırsam beni düzeltin.

Örneklemeli üç depo:

 --------------------- ----------------------- ----------------------- - Remote Repo - - Remote Repo - - Remote Repo - - - - gets pushed - - - - @ R01 - - @ R02 - - @ R02 - --------------------- ----------------------- ----------------------- --------------------- ----------------------- ----------------------- - Local Repo - - Local Repo - - Local Repo - - pull - - - - fetch - - @ R01 - - @ R01 - - @ R02 - --------------------- ----------------------- ----------------------- --------------------- ----------------------- ----------------------- - Local Sandbox - - Local Sandbox - - Local Sandbox - - Checkout - - new work done - - - - @ R01 - - @ R01+ - - @R01+ - --------------------- ----------------------- ----------------------- 

Yüklü üç depo

 --------------------- ----------------------- ----------------------- - Remote Repo - - Remote Repo - - Remote Repo - - - - gets pushed - - - - @ R01 - - @ R02 - - @ R02 - --------------------- ----------------------- ----------------------- --------------------- ----------------------- ----------------------- - Local Repo - - Local Repo - - Local Repo - - pull - - - - pull - - @ R01 - - @ R01 - - @ R02 - --------------------- ----------------------- ----------------------- --------------------- ----------------------- ----------------------- - Local Sandbox - - Local Sandbox - - Local Sandbox - - Checkout - - new work done - - merged with R02 - - @ R01 - - @ R01+ - - @R02+ - --------------------- ----------------------- ----------------------- 

Bu, örneklemenin neden çok önemli olduğunu anlamama yardımcı oldu.

95
17 июля '12 в 19:43 2012-07-17 19:43 Cevap pn1 dude 17 Temmuz 'da 17:12 saat 19:43 de verilmiştir 2012-07-17 19:43

GIT Alma ve GIT Çekme arasındaki fark şu senaryo ile açıklanabilir: (Resimlerin kelimelerden daha yüksek sesle konuştuğunu hatırlamak! Bir grafik sunumunu sağladım)

Ekip üyelerinizle bir proje üzerinde çalıştığınızı varsayalım. Bu nedenle, projenin ana bölümlerinden biri olacaklar ve tüm katılımcılar kendi yerel depolarına dallanmalı ve ardından modülleri değiştirmek / eklemek ve ardından ana şubeye geri dönmek için bu yerel şube üzerinde çalışmalıdır.

Bu yüzden, iki şubenin baş> durumu, yerel deponuzdaki ana projeyi doldurduğunuzda şöyle olacaktır- ( A , B ve C projede zaten tamamlanmış modüllerdir)

2019

07 февр. Cevap Aman Tiwari 07 Şub tarafından verildi. 2017-02-07 17:15 '17, 17:15, 2017-02-07 17:15

Sadece diyoruz ki:

 git pull == git fetch + git merge 

Если вы запустите git pull , вам не нужно объединять данные с локальными. Если вы запустите git fetch , это означает, что вы должны запустить git merge для получения последнего кода на вашем локальном компьютере. В противном случае локальный машинный код не будет изменен без слияния.