残念ながら、それらが一般的に同等であるかどうかは、使用しているブランチ、構成、月の満ち欠けなどによって異なります。
以下で説明するように、マニュアルページからこれを理解することができますgit pull
が、私は通常、次のようにしてそれを解決する必要がないようにしgit fetch origin
ますgit merge origin/foo
。(私はこれについてややとりとめのないブログ記事を書きました。)
ただし、あなたの質問はgit pull
、リモートまたはrefspecを指定しない場合のデフォルトの動作に関するものです。git pull
これは、 man ページ、特にDEFAULT BEHAVIOUR
セクションから理解できます。これを理解するのはやや難しいので、(a) あなたがfoo
ブランチにいること、(b) 質問で説明したようにそのブランチを作成したこと、および ( c) 構成を変更していない。
多くの場合、パラメーターを指定せずに git pull を使用します。伝統的に、これは言うことと同等git pull origin
でした。ただし、branch.<name>.remote
ブランチに構成が存在<name>
する場合は、代わりにその値が使用されますorigin
。
フェッチに使用する URL を決定するために、構成の値remote.<origin>.url
が調べられ、そのような変数がない場合は、ファイル内のURL:
行の値が使用されます。$GIT_DIR/remotes/<origin>
コマンド ラインで refspec パラメーターを指定せずにコマンドを実行したときに、どのリモート ブランチを取得するか (オプションでリモート トラッキング ブランチに格納するか) を決定するために、構成変数の値remote.<origin>.fetch
が調べられます。$GIT_DIR/remotes/<origin>
ファイルが参照され、そのPull:
行が使用されます。OPTIONS セクションで説明されている refspec 形式に加えて、次のようなグロビング refspec を使用できます。
refs/heads/*:refs/remotes/origin/*
グロビング refspec には空でない RHS が必要であり (つまり、リモート追跡ブランチでフェッチされたものを格納する必要があります)、その LHS と RHS は で終わる必要があり/*
ます。refs/remotes/origin/
上記は、すべてのリモート ブランチが同じ名前の階層内のリモート トラッキング ブランチを使用して追跡されることを指定します。
下位互換性を損なわないようにするために、フェッチ後にマージするリモート ブランチを決定するルールが少し複雑になります。
明示的な refspec が git pull のコマンド ラインで指定された場合、それらはすべてマージされます。
コマンド ラインで refspec が指定されていない場合、git pull は構成または$GIT_DIR/remotes/<origin>
. このような場合、次の規則が適用されます。
If branch.<name>.merge
現在のブランチの構成が存在します。これは、マージされるリモート サイトのブランチの名前です。
refspec がグロビングの場合、何もマージされません。
それ以外の場合、最初の refspec のリモート ブランチがマージされます。
ブランチfoo
を作成したとき:
git checkout origin/foo -b foo --track
...次の構成オプションが設定され、ブランチfoo
がリポジトリrefs/heads/foo
に関連付けられます。origin
branch.foo.remote=origin
branch.foo.merge=refs/heads/foo
したがって、それを上記の太字の文と組み合わせると、答えは「はい、この状況では、あなたが説明している場合、ブランチにいるときfoo
、コマンドgit pull
とコマンドgit pull origin foo
は同等です。」