Git uzaktan güncelleme ve getirme arasındaki farklar?


Yanıtlar:


112

GÜNCELLEME: daha fazla bilgi!

Bunu baştan yapmalıydım: Git'in Git deposundaki Git sürüm notlarını (yani meta!)

grep --color=always -R -C30 fetch Documentation/RelNotes/* | less

Sonra bir lessarama yaptım --allve Git sürüm 1.6.6 için sürüm notları altında bulduğum şey :

git fetchöğrendim --allve --multipleseçenekler, birçok depodan getirme çalıştırmak ve --prunebayat gitti uzaktan izleme dallarını kaldırma seçeneği. Bunlar git remote updateve git remote prunedaha az gerekli (kaldırmak için bir plan yoktur)remote updateremote prune olsa da , ne ne de ).

1.6.6 sürümü yayınlanmadı 23 Aralık 2009'a ve Orijinal Poster 6 Aralık 2009'da sorusunu sordu.

Sürüm notlarından da görebileceğiniz gibi, Git yazarları git remote updatekomut işlevselliğinin bir şekilde çoğaltıldığını biliyorlardı.git fetch , ancak mevcut komut dosyaları ve programlarla geriye dönük uyumluluk için kaldırmamaya karar verdiler, ya da belki çok fazla iş var ve daha yüksek öncelikli öğeler var.


Daha fazla ayrıntı içeren orijinal cevap

xenoterracide'ın cevabı şu anda 3,5 yaşında ve Git o zamandan beri çeşitli versiyonlardan geçti (bu yazıdan v1.6.5.5'ten v1.8.3.2'ye gitti ) ve ve şu anki belgelere bakıyor git remote updateve git fetchgörünüyor onlar gibi hem temelde birden çok kumanda yeni hareketin alma aynı işlevi gerçekleştirebilir doğru seçenekler ve argümanlar verilen.

Tüm uzaktan kumandalar getiriliyor

Birden çok uzaktan kumanda almanın bir yolu --allbayraktır:

git fetch --all

Bu, sahip olmadığınız varsayılarak yapılandırılan tüm uzaktan kumandalarınızdan getirilir remote.<name>.skipFetchAll onlar için ayarlamadığınız :

True olursa, git-fetch (1) veya git-remote (1) güncelleme alt komutunu kullanarak güncelleme yaparken bu uzaktan kumanda varsayılan olarak atlanacaktır . - git-config belgeleri

Bu, kullanmaya eşdeğerdir

git remote update

getirilecek herhangi bir uzak grup belirtmeden ve ayrıca remotes.defaultrepo yapılandırmanızda ayarlama yapmadıysanız ve ayrıca uzaktan kumandalarınızın hiçbiri remote.<name>.skipDefaultUpdatetrue değerine ayarlanmadı.

Seyahatseverlerin Git yapılandırmasına şu anki 1.8.3.2 belgelerine söz etmez remotes.defaultayarı, ama bu konuda Yüce Google'ı danıştı ve bu yararlı açıklama bulundu Mislav Marohnić :

$ git config remotes.default 'origin mislav staging'
$ git remote update

# fetches remotes "origin", "mislav", and "staging"

Tarafından getirilecek bir uzaktan kumanda listesi tanımlayabilirsiniz. remote updateKomut . Bunlar ekip arkadaşlarınızdan, bir açık kaynak projesinin güvenilir topluluk üyelerinden veya benzerlerinden uzak olabilir.

Yani muhtemelen, remotes.defaultayarladıysanız ve tüm uzaktan kumandalarınız listede yoksa,git remote update yoksa, repounuzun "farkında" olduğu tüm uzaktan kumandaları getirmeyecektir.

remote.<name>.skipDefaultUpdateAyara gelince , Git belgeleri bunu şöyle açıklar:

True olursa, git-fetch (1) veya git-remote (1) güncelleme alt komutunu kullanarak güncelleme yaparken bu uzaktan kumanda varsayılan olarak atlanacaktır .

Belirli bir uzaktan kumanda grubunu getirme

Bunun yerine tüm uzaktan kumanda getiriliyor, hem fetchve remote updatebirden çok uzaktan kumandalı ve getirmek için uzaktan kumanda gruplarını belirtmek için izin:

git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]

git fetch [<options>] <group>bir grubun parçası olan birden fazla uzaktan kumanda almanıza olanak tanır ( Mislav'dan başka bir örnek ödünç almak için ):

$ git config remotes.mygroup 'remote1 remote2 ...'
$ git fetch mygroup

git fetch --multiplebir kerede ( dokümanlardan ) alınacak birkaç havuz ve havuz grubu belirtmenize olanak tanır :

Birkaç tanesinin <repository>ve <group>bağımsız değişkenlerin belirtilmesine izin verin . Hayır <refspec>sbelirtilebilir.

Belirsizlik git remote updateDokümantasyondaki

İçin özetgit remote update , komut sözdiziminin aşağıdaki gibi olduğunu belirtir:

git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]

Son kısmı fark ettiniz [(<group> | <remote>)…]mi? Sondaki noktalar ..., komutla birden çok grup ve uzaktan kumanda belirtebileceğiniz anlamına gelir, bu da komutun aynı şekilde davrandığı anlamına gelir.git fetch --multiple ... ikisi arasındaki sözdiziminin nasıl benzer olduğunu görüyor musunuz?

Ancak, aynı belgede, updatekomutun açıklaması, birden fazla grup ve uzak bağımsız değişken belirtme hakkında hiçbir şey söylemez, yalnızca

Tarafından tanımlandığı gibi depodaki adlandırılmış bir uzaktan kumanda seti için güncellemeler getir remotes.<group>.

Bu nedenle, birden çok bağımsız uzaktan kumanda ve birden çok uzak grup belirtme konusunda git remote updateaynı şekilde çalışıp çalışmadığı belirsizdir git fetch --multiple.

Tek bir uzaktan kumanda getiriliyor

Son olarak, herkes tek bir uzaktan kumandayı getirmenin basit bir vakasını biliyor:

git fetch <remote>

Kullanabileceğiniz de olabilir

git remote update <remote>

aynı şeyi yapmak için, ancak önceki bölümde belirttiğim gibi, belgelerin komutla git remote updatetek bir uzaktan kumanda grubundan başka bir şey getirmenin mümkün olup olmadığı konusunda net değil .

Sarmak

Ben açıkladım gibi, git fetchve git remote updatebirden çok kumanda dan getirilirken bakımından benzer şekilde hareket eder. Yine de benzer söz dizimi ve argümanları paylaşıyorlargit fetch daha kısa da, insanlar muhtemelen yazmayı ve kullanmayı daha kolay bulurlar.

Bu git remote updategibi tek bir uzaktan kumandayı almak için kullanılamayabilir git fetch, ancak işaret ettiğim gibi, belgeler bunu netleştirmiyor.

bir kenara

Git porselen komutları arasındaki işlevsellik, yukarıda git fetchve git remote updateyukarıda örneklendirilen benzersiz değildir. Benzer bir durum fark ettim git rebase --ontove git cherry-pickher ikisinin de yeni bir temel taahhüde yama yapmak için çeşitli taahhütler alabilmesi.

Git yıllar içinde geliştikçe, bazı işlevler (kaçınılmaz olarak?) Çoğaltılabilirdi, belki de bazen son kullanıcılar için bir kolaylık olarak (örneğin, bir aralığı cherry-pickgeçmek ve tekrar tekrar geçmek yerine) bir aralık seçmek için). Görünüşe göre v1.7.2 sürüm notlarındacherry-pick açıklandığı gibi her zaman bir dizi taahhüdü kabul etmedi :

git cherry-pickbir dizi taahhüt seçmeyi öğrendi (ör. cherry-pick A..Bve cherry-pick --stdin) git revert; bunlar rebase [-i]olsa da güzel sıralama kontrolü desteklemiyor .


4
FYI: git rebaseGibi mvve git cherry-pickgibidir cp. --ontoAnahtar bu değişmez. git rebaseYalnızca SHA1 değerlerini belirtirseniz bir kopyalama efekti elde edebilirsiniz , aksi takdirde dalınız taşınır!
Robert Siemer

141

Evet ve hayır. git remote updatesadece bir tane değil, tüm uzaktan kumandalardan alır.

remote updateSadece bir kabuk betiği olup olmadığını görmek için koda bakmadan (mümkün), temelde, her uzaktan kumanda için getirmeyi çalıştırır. git fetchçok daha ayrıntılı olabilir.


3
Çalıştırırken hangi uzaktan kumandaların getirileceğini yapılandırabilirsiniz git remote update, bkz. Git-remote manpage.
Jakub Narębski

Bu arada, git remotebir kabuk komut dosyası değildir, ancak git fetchbir sırasında ortaya çıkar remote update.
mipadi

1
A için eşdeğer bir git fetchkomut seçeneği var mı git remote update?
tuler

15
@tuler Evet: öylegit fetch --all
LoKi
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.