GitのFETCH_HEADはどういう意味ですか?


220

git pull --help 言う:

デフォルトモードでgit pullは、はのgit fetch後に続く省略形ですgit merge FETCH_HEAD

これは何ですか?FETCH_HEAD実際に何がマージされgit pullますか?


3
注:git 1.8.4(2013年8月)以降、git fetch origin master実際origin/masterにはだけでなくも更新されFETCH_HEADます。stackoverflow.com/a/20967347/6309を
VonC、2014年

詳細についてはgit merge FETCH_HEAD(Gitの2.5以降、Q2 2015)、参照stackoverflow.com/a/30425991/6309
VonC

回答:


218

FETCH_HEADリモートリポジトリからフェッチされたばかりの内容を追跡する、存続期間の短い参照です。git pull最初にを呼び出しますgit fetch。通常はリモートからブランチをフェッチします。FETCH_HEADこのブランチの先端を指します(ブランチのように、コミットのSHA1を格納します)。git pull次にを呼び出しgit mergeFETCH_HEAD現在のブランチにマージします。

結果はまさに期待どおりです。適切なリモートブランチの先端にあるコミットが、現在のブランチの先端にあるコミットにマージされます。

これは少しやってようであるgit fetch引数なし(またはgit remote update)、すべてのリモートブランチを更新し、その後、実行しているgit merge origin/<branch>が、使用してFETCH_HEADどのような単一のREFを参照する代わりに、内部的には、代わりのものに名前を付けるために必要で、フェッチされました。


9
@Jefromi:すみません、私はあなたが間違っていると思います。私が理解している限りブランチgit fetchだけでなく、リモートストレージからすべてのオブジェクトデータを更新(マージ)します。だから私はあなたの答えからgitがどのブランチの先端を指すかをどのように決定するのか理解していません。また、gitのドキュメント(定義ではなく、例)も見つかりません。どういうわけか仕事をするための回避策のようなルックスの存在。FETCH_HEADFETCH_HEADFETCH_HEADgit pull
Alexey

14
Alexey:ローカルリポジトリ設定でFETCH_HEAD指定されたリモートブランチの先端に対応しbranch.<BRANCH>.mergeます。そのため、fetch実際にはリモートストレージからすべてのオブジェクトデータをフェッチしますFETCH_HEADが、ローカルブランチによって追跡されるリモートブランチがどこに進んだかを示すために使用されます。あなたがローカルにあるのであればmaster、分岐し、実行git fetch、およびbranch.master.mergeにポイントrefs/heads/masterし、FETCH_HEAD同じ値になりますorigin/masterすぐにフェッチ操作の後に。
ラスク

4
@alexy FETCH_HEADは、manページのgit fetchの説明の2番目の段落で説明されています。私の答えは正しいです。引数なしでgit fetchを実行すると、デフォルトのリモートのすべてのリモートブランチが更新されます...しかし、これはマージとは異なります。
Cascabel 2012

4
FETCH_HEADすべてのリモートブランチを経由してフェッチするとどうなりますgit fetch -aか?
stigi

2
@stigi現在チェックアウトされているブランチがgit configで指しているリモート追跡ブランチの先端。上のコメントでラースクの答えを見てください。
Ankur Agarwal 2015年

19

FETCH_HEADは、フェッチがフェッチコマンドを使用して直接開始されたか、プルの一部として開始されたかに関係なく、最後のフェッチのヒントへの参照です。FETCH_HEADの現在の値は.git、あなたが推測した名前のファイル内のフォルダーに保存されますFETCH_HEAD

だから私が発行した場合:

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

FETCH_HEADには

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

リモートリポジトリをリモートトラッキングブランチとして構成している場合は、フェッチの後にトラッキングブランチをマージすることができます。そうでない場合は、FETCH_HEADを使用して、最後のフェッチのヒントを直接マージできます。

git merge FETCH_HEAD

1
私の5セントを追加します。私を混乱させたのは、「変更なし」を返した新しいフェッチを実行しても(日食で)、私のFETCH_HEADが最新のコミットの背後にあったことです。その理由は、前回のフェッチ以降のすべての変更は自分自身によるものであり、私がサーバーにプッシュしたためだと思います。したがって、後続のフェッチは何もする必要がなく、FETCH_HEADも更新しませんでした。これがGITまたはEclipse Git実装の欠点かどうかはわかりません。
Torge、

11

ジョナサンの回答で述べたように、FETCH_HEADはファイルに対応します.git/FETCH_HEAD。通常、ファイルは次のようになります。

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>

1つを除くすべてのブランチがマークされてnot-for-mergeいることに注意してください。奇妙なのは、フェッチの前にチェックアウトされたブランチです。要約すると、FETCH_HEADは基本的に、現在チェックアウトされているブランチのリモートバージョンに対応しています。


9

私は発見して使用しましたFETCH_HEAD。サーバーから一部のソフトウェアのローカルコピーが必要でした。

git fetch gitserver release_1

gitservergitリポジトリを保存する私のマシンの名前です。 release_1ソフトウェアのバージョンのタグです。驚いたことに、そのときrelease_1私のローカルマシンにはどこにも見つかりませんでした。入力しなければならなかった

 git tag release_1 FETCH_HEAD 

タグ付けされたコミットのチェーン(release_1)のコピーをリモートリポジトリからローカルリポジトリに完了する。Fetchはリモートタグを見つけ、ローカルマシンにコミットをコピーしましたが、ローカルタグを作成していませんFETCH_HEADが、コミットの値を設定していたので、それを見つけて使用できました。次にFETCH_HEAD、リモートのタグと一致するローカルタグを作成するために使用しました。これは、何FETCH_HEADがどのように使用できるかを示す実際的な例であり、git fetchが単純に期待したことを実行しないのはなぜかと疑問に思っている他のユーザーにとって役立つ場合があります。

私の意見では、それはその目的のために避けるのが最善であり、私がやろうとしていたことを達成するためのより良い方法は

git fetch gitserver release_1:release_1

つまり、release_1をフェッチして、それをrelease_1とローカルに呼び出します。(source:destです。https://git-scm.com/book/en/v2/Git-Internals-The-Refspecを参照してくださいです。別の名前を付けたい場合に備えてください。)

FETCH_HEADしかし、時々使用したいかもしれません:-

git fetch gitserver bugfix1234
git cherry-pick FETCH_HEAD

Gitサーバーからバグ修正番号1234を使用し、修正が現在のブランチに適切に選択されたら、Gitのガベージコレクションを残してサーバーからのコピーを破棄する良い方法かもしれません。(私は、サーバー上のバグ修正のすべてを含む、きれいなタグ付けされたコミットがあると想定しています!)


興味深いフィードバック。+1
VonC 2018年

ありがとう。refspecのsource:dest構文ではなくFETCH_HEADを使用してタグをコピーすることを奨励しているように見えたため、数年前に最初にFETCH_HEADを発見したときに書いた私の元の投稿を編集しました。うまくいけば、私は今、FETCH_HEADの使用方法のより良い例を示しました。
Ivan

3

git pullは、フェッチとそれに続くマージの組み合わせです。git fetchが発生すると、FETCH_HEADでフェッチした内容のヘッドコミット(.git内のその名前のファイルのみ)が記録され、これらのコミットが作業ディレクトリにマージされます。


3
@manjolds、「フェッチしたもののヘッドコミット」とはどういう意味ですか?Gitはfetchですべてをフェッチします。
Alexey

@Alexey from git manual:git-scm.com/docs/git-fetchフェッチされた参照の名前は、参照先のオブジェクト名とともに、.git / FETCH_HEADに書き込まれます
PJ_Finnegan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.