Git'teki FETCH_HEAD anlamı ne?


221

git pull --help diyor:

Varsayılan modda, git pulliçin kısaltmadır git fetchizledi git merge FETCH_HEAD.

Bu nedir FETCH_HEADve gerçekte ne birleştirilir git pull?


3
Not: git 1.8.4'ten (Ağustos 2013) beri , sadece git fetch origin mastergüncellemekle origin/masterkalmayacak FETCH_HEAD. Bkz. Stackoverflow.com/a/20967347/6309
VonC

Daha fazla bilgi için git merge FETCH_HEAD(Git 2.5, Q2 2015'ten beri), bkz. Stackoverflow.com/a/30425991/6309
VonC

Yanıtlar:


218

FETCH_HEADuzak depodan yeni getirilenleri takip etmek için kısa ömürlü bir ref. git pullilk olarak git fetch, normal durumlarda uzaktan kumandadan bir dal getirilir; FETCH_HEADbu dalın ucuna işaret eder (tıpkı şubelerin yaptığı gibi, taahhüdün SHA1'ini saklar). git pulldaha sonra geçerli dalı git mergebirleştirerek çağırır FETCH_HEAD.

Sonuç tam olarak beklediğiniz şeydir: uygun uzak dalın ucundaki işlem, geçerli şubenizin bitişindeki işlemle birleştirilir.

Bu, git fetchargümanlar (veya git remote update) olmadan yapmak , tüm uzak dallarınızı güncellemek, daha sonra çalıştırmak git merge origin/<branch>, ancak FETCH_HEADşeyleri adlandırmak yerine getirilen tek bir ref'ye atıfta bulunmak için dahili olarak kullanmak gibidir.


9
@Jefromi: üzgünüm, yanlış olduğunu düşünüyorum: anladığım kadarıyla, git fetchsadece bir brunch değil, uzak depolama alanından tüm nesne verilerini günceller (birleştirir) . Yani cevabınızdan git hangi şubenin ucuna nasıl karar verdiğini anlamıyorum FETCH_HEAD. FETCH_HEADGit belgelerinde de bulamıyorum (tanım değil, örnekler). Varlığı FETCH_HEADdaha geçici bir çözüm gibi bana görünüyor yapmak için git pullçalışmalarını nasılsa .
Alexey

14
Alexey: yerel veri havuzu yapılandırmasında FETCH_HEADbelirtilen uzak dalın ucuna karşılık gelir branch.<BRANCH>.merge. Öyleyse fetch, uzak depolama alanından tüm nesne verilerini alırken FETCH_HEAD, yerel dal tarafından izlenen uzak dalın nerede ilerlediğini belirtmek için kullanılır. Yerel iseniz Yani masterşube ve kaçak git fetchve branch.master.mergepunto refs/heads/master, sonra FETCH_HEADaynı değere sahip olacaktır origin/masterhemen getir ameliyattan sonra.
larsks

4
@alexy FETCH_HEAD, kılavuz sayfasında git getirme tanımının ikinci paragrafında açıklanmıştır. Cevabım doğru. Ve arg argümanları olmadan getirme, varsayılan uzaktan kumanda için tüm uzak dalları günceller ... ancak bu kesinlikle birleştirme ile aynı değildir.
2012'de Cascabel

4
FETCH_HEADTüm uzak dalları üzerinden getirirseniz ne olur git fetch -a?
stigi

2
@stigi Şu anda check-out şubenizin işaret ettiği uzaktan izleme dalının ucu git config. Lütfen yukarıdaki yorumda larsks'ın cevabına bakınız.
Ankur Agarwal

19

FETCH_HEAD, bu getirme doğrudan getirme komutu kullanılarak veya bir çekmenin parçası olarak başlatılırsa, son getirmenin ucuna bir referanstır. FETCH_HEAD değerinin geçerli değeri, .gittahmin ettiğiniz gibi adlı bir dosyadaki klasörde saklanır FETCH_HEAD.

Yani ben sorun varsa:

git fetch https://github.com/ryanmaxwell/Fragaria

FETCH_HEAD içerebilir

3cfda7cfdcf9fb78b44d991f8470df56723658d3        https://github.com/ryanmaxwell/Fragaria

Uzak repo bir uzaktan izleme dalı olarak yapılandırılmışsa, getirme işlemimi izleme dalı birleştirme ile takip edebilirim. Eğer yapmazsam FETCH_HEAD kullanarak doğrudan son getirmenin ucunu birleştirebilirim.

git merge FETCH_HEAD

1
Benim 5 sent eklemek için. Beni şaşırtan şey, FETCH_HEAD'ımın "değişiklik yok" (tutulmada) döndüren yeni bir getirme olsa bile en son taahhütlerin arkasında olmasıydı. Bunun sebebi, son getirmemden bu yana yapılan tüm değişikliklerin kendimden olması ve sunucuya benim tarafımdan aktarılmasıdır. Bu nedenle, sonraki bir getirmenin yapacak bir şeyi yoktu ve FETCH_HEAD'i bile güncellemedi. Bunun GIT veya Eclipse Git uygulamasının bir eksikliği olup olmadığından emin değilim.
Torge

11

Jonathan'ın cevabında belirtildiği gibi , FETCH_HEAD dosyaya karşılık gelir .git/FETCH_HEAD. Genellikle, dosya şöyle görünür:

71f026561ddb57063681109aadd0de5bac26ada9                        branch 'some-branch' of <remote URL>
669980e32769626587c5f3c45334fb81e5f44c34        not-for-merge   branch 'some-other-branch' of <remote URL>
b858c89278ab1469c71340eef8cf38cc4ef03fed        not-for-merge   branch 'yet-some-other-branch' of <remote URL>

Biri hariç tüm dalların nasıl işaretlendiğine dikkat edin not-for-merge. Garip olan, getirmeden önce teslim alınan şubedir. Özetle: FETCH_HEAD temel olarak şu anda kullanıma alınmış olan şubenin uzak sürümüne karşılık gelir.


9

Az önce keşfettim ve kullandım FETCH_HEAD. Bir sunucudan bazı yazılımların yerel bir kopyasını istedim ve

git fetch gitserver release_1

gitservergit depolarını depolayan makinemin adı. release_1, yazılımın bir sürümünün etiketidir. Benim için sürpriz, release_1o zaman yerel makinemde bulunacak bir yer yoktu. Yazmak zorunda kaldım

 git tag release_1 FETCH_HEAD 

etiketli taahhüt zincirinin (release_1) uzak depodan yerel olana kopyasını tamamlamak için . Fetch, benim yerel makineye işlemek kopyalanamaz, uzaktan etiketi bulmuştu olmasaydı yerel bir etiket oluşturulur, ancak batmıştı FETCH_HEADı bulmak ve kullanmak diye, taahhüt değerine. Daha sonra FETCH_HEADuzaktan kumandadaki etiketle eşleşen yerel bir etiket oluşturmak için kullanılır . Bu, neyin FETCH_HEADve nasıl kullanılabileceğinin pratik bir örneğidir ve git getirisinin neden beklediğiniz şeyi yapmadığını merak eden başka biri için yararlı olabilir.

Bence bu amaç için en iyi şekilde kaçınılır ve yapmaya çalıştığım şeyi başarmanın daha iyi bir yolu

git fetch gitserver release_1:release_1

örneğin, release_1'yi getirmek ve yerel olarak release_1 olarak adlandırmak için. (Kaynak: dest, https://git-scm.com/book/en/v2/Git-Internals-The-Refspec ; bakınız farklı bir ad vermek istiyorsanız!)

FETCH_HEADYine de zaman zaman kullanmak isteyebilirsiniz : -

git fetch gitserver bugfix1234
git cherry-pick FETCH_HEAD

Git sunucunuzdaki hata düzeltme numarası 1234'ü kullanmanın ve Git'in çöp koleksiyonunu, düzeltmenin geçerli dalınıza getirildikten sonra kopyayı sunucudan atması için iyi bir yol olabilir. (Sunucudaki hata düzeltmesinin tamamını içeren güzel ve temiz bir etiketlenmiş taahhüt olduğunu varsayıyorum!)


İlginç geri bildirim. +1
VonC

Teşekkürler. Birkaç yıl önce FETCH_HEAD'i ilk keşfettiğimde yazdığım orijinal yazımı düzenledim, çünkü kaynak yerine FETCH_HEAD kullanarak bir etiket kopyalamayı teşvik ediyor gibiydi: refspecs için dest sözdizimi. Umarım şimdi FETCH_HEAD'in nasıl kullanılabileceğine dair daha iyi bir örnek verdim.
Ivan

3

git pull bir getirme ve ardından birleştirme birleşimidir. Git getirme işlemi gerçekleştiğinde, FETCH_HEAD içinde getirdiği şeyin baş taahhüdünü not eder (sadece .git dosyasında bu dosyaya sahip bir dosya) ve bu taahhütler daha sonra çalışma dizininizle birleştirilir.


3
@manjolds, "getirdiği şeyin baş taahhüdü " ile ne demek istiyorsun ? Git getirme ile her şeyi getirir.
Alexey

Dan @Alexey git el: git-scm.com/docs/git-fetch : birlikte işaret nesne adları ile, getirilen sayılı referanslarda isimleri .git / FETCH_HEAD yazılır
PJ_Finnegan
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.