20

という名前の git ブランチをチェックアウトしましfooた。

> git status
# On branch foo
nothing to commit (working directory clean)

最初は次のコマンドを使用してチェックアウトされました。

> git checkout origin/foo -b foo --track

リモート リポジトリからこのブランチの更新を取得したいと考えています。これらのコマンドのいずれかで十分であることはわかっています。

> git fetch origin foo # ignore the lack of merging
> git pull origin foo

fetchまたはの引数を省略した場合pull、git はデフォルトで、現在チェックアウトしているブランチを取得 (またはプル) しますか? つまり、次のコマンドのペアは同等ですか?

> git checkout foo
> git pull

> git checkout foo
> git pull origin foo
4

3 に答える 3

26

残念ながら、それらが一般的に同等であるかどうかは、使用しているブランチ、構成、月の満ち欠けなどによって異なります。

以下で説明するように、マニュアルページからこれを理解することができます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>. このような場合、次の規則が適用されます。

  1. If branch.<name>.merge現在のブランチの構成が存在します。これは、マージされるリモート サイトのブランチの名前です。

  2. refspec がグロビングの場合、何もマージされません。

  3. それ以外の場合、最初の 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は同等です。」

于 2011-07-28T15:40:49.920 に答える
6

マークが説明している条件でも、同じように見える場合でも、微妙な違いgit pull origin fooがあります。リモートトラッキングブランチは更新されませんが、更新されgit pullます。これは、git-pullのマンページに記載されています。

A parameter <ref> without a colon is equivalent to <ref>: when pulling/fetching, so it merges <ref> into the current branch without storing the remote branch anywhere locally

したがって、あなたの場合、真に同等のものについては、次のgit pullことを行う必要がありますgit pull origin foo:refs/remotes/origin/foo

于 2013-02-11T06:27:16.933 に答える
1

はい、そうです。追跡情報は に保存され.git/configます。

于 2011-07-28T14:47:32.140 に答える