web-dev-qa-db-ja.com

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

git pull --helpは言う:

デフォルトモードでは、git pullはgit fetchの後にgit merge FETCH_HEADを続けたものです。

これはFETCH_HEADとは何ですか、そしてgit pullの間に実際にマージされるものは何ですか?

185
Misha Moroshko

FETCH_HEADは、リモートリポジトリから取得された内容を追跡するための、短期間の参照です。 git pullは最初にgit fetchを呼び出します。通常はリモートからブランチを取得します。 FETCH_HEADは、このブランチの先端を指しています(ブランチと同様に、コミットのSHA1を格納します)。次にgit pullgit mergeを呼び出して、現在のブランチにFETCH_HEADをマージします。

結果はまさにあなたが期待していたものです:適切なリモートブランチの先端のコミットはあなたの現在のブランチの先端のコミットにマージされます。

これは、引数なしでgit fetch(またはgit remote update)を実行し、すべてのリモートブランチを更新してからgit merge Origin/<branch>を実行することに似ていますが、名前を付ける代わりに内部でFETCH_HEADを使用します。

185
Cascabel

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
14

Jonathan's answer で述べたように、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

gitserverは、gitリポジトリを格納している私のマシンの名前です。 release_1は、ソフトウェアのバージョンを表すタグです。驚いたことに、release_1は私のローカルマシンには見付からなかった。私はタイプしなければならなかった

 git tag release_1 FETCH_HEAD 

リモートリポジトリからローカルへのタグ付きコミットチェーン(release_1)のコピーを完成させる。 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のガベージコレクションをサーバーからのコピーを処分するための良い方法かもしれません。 (私は、サーバー上のバグ修正のすべてを含む、すっきりしたタグ付きのコミットがあると思います!)

8
user3070485

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

3
manojlds