git pull --help
は言う:
デフォルトモードでは、git pullはgit fetchの後にgit merge FETCH_HEADを続けたものです。
これはFETCH_HEAD
とは何ですか、そしてgit pull
の間に実際にマージされるものは何ですか?
FETCH_HEAD
は、リモートリポジトリから取得された内容を追跡するための、短期間の参照です。 git pull
は最初にgit fetch
を呼び出します。通常はリモートからブランチを取得します。 FETCH_HEAD
は、このブランチの先端を指しています(ブランチと同様に、コミットのSHA1を格納します)。次にgit pull
はgit merge
を呼び出して、現在のブランチにFETCH_HEAD
をマージします。
結果はまさにあなたが期待していたものです:適切なリモートブランチの先端のコミットはあなたの現在のブランチの先端のコミットにマージされます。
これは、引数なしでgit fetch
(またはgit remote update
)を実行し、すべてのリモートブランチを更新してからgit merge Origin/<branch>
を実行することに似ていますが、名前を付ける代わりに内部でFETCH_HEAD
を使用します。
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
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は基本的に、現在チェックアウトされているブランチのリモートバージョンに対応しています。
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のガベージコレクションをサーバーからのコピーを処分するための良い方法かもしれません。 (私は、サーバー上のバグ修正のすべてを含む、すっきりしたタグ付きのコミットがあると思います!)
git pullはフェッチとそれに続くマージの組み合わせです。 git fetchが発生すると、FETCH_HEAD(.gitの中のその名前のファイル)でフェッチしたものの先頭コミットが記録されます。そしてこれらのコミットは作業ディレクトリにマージされます。