原点からプルするときの「gitpull」コマンドの違いは?


82

これらのコマンドの違いは何ですか?:

# 1
git pull
# 2
git pull origin
# 3
git pull origin master
# 4
git pull origin/master
# 5
git pull origin HEAD:master

まあ、manページを読んだ後でも、正確に何が起こっているのかはすべての場合に明確ではありません。例:git pullアップストリームを構成しないとはどういう意味ですか?(マニュアルページには、デフォルトで設定されたアップストリームのみが記載されています。)
michas 2013

つまり、1。現在のブランチの構成がないと失敗し、それ以外の場合はリモート名で2.のようになります。2.指定されたリモートのデフォルトのフェッチ構成を使用します(そして最初のリモートをマージします)が、3。ではフェッチしてマージするものを指定します。4.無効です、imho。5.(動作する場合)、リモートHEADをrefs / remotes / origin / masterに配置し、それをマージします。
andi5 2013

2
残念ながら、この質問はの検索結果の1つであるため、この質問を再開することに投票しsite:stackoverflow.com git Difference "git pull" "git pull origin master"ます。

回答:


81

git pullは便利なコマンドで、同時にさまざまなことを実行します。基本的にはgit fetch、リモートリポジトリに接続して新しいコミットをフェッチする、とgit merge(またはgit rebase)新しいコミットをローカルブランチに組み込む(または)の組み合わせにすぎません。関係する2つの異なるコマンドのため、の意味git pullは必ずしも明白ではありません。

ローカルブランチのアップストリームを設定できます。新しいクローンの後、ローカルブランチ「master」、リモート「origin」があり、マスターブランチにはアップストリームとして「origin / master」があります。以下の設定を想定しています。(git branch -vv.git / configを使用して、または.git / configを参照することで、アップストリーム構成を確認できます。)

今あなたの質問のために:

  1. git pull= git fetch origin+ git merge origin/master(またはアップストリームが何であれ)
  2. git pull origin= git pull(オリジンがアップストリームリモートである限り)
  3. git pull origin master= git fetch origin master+git merge FETCH_HEAD
  4. git pull origin/master :「origin / master」というリモコンがない限り無効
  5. git pull origin HEAD:master:ローカルマスターを、HEADがオリジンで指しているものに直接リセットしようとします。(これをしないでください。)

2
なぜgit pull origin HEAD:master悪い考えを実行するのですか?
ライアンエドワーズ

2
右側はリモートブランチになっています。manページの警告を参照してください。これを使用する場合は、自分が何をしているのかを必ず理解してください。
michas 2013

私が別のブランチにいた場合git pull、そのブランチまたはマスターをプルします
aWebDeveloper 2014

1
@aWebDeveloper:完全を期すために:git pull origin HEAD:master本質的に(Git 2.6でスクリプトがCで書き直されるまでは文字通りでした)、HEAD:masterパーツをgit fetchに渡しgit fetchます。これにより、そのステップで何が行われるかがわかります。次に、git fetchステップが取得したコミットハッシュを使用してマージまたはリベースします。Refspecsはsource:destであるためHEAD、他のGitに渡されて翻訳されます。つまり、他のGit次第ですが、通常、他のGitHEADはその名前ですmaster。自分でいない場合master、merge-or-rebaseはfetch-updated masterdest)を使用します(fetch失敗しない限り)。
torek 2017年

1
注意すべきもう1つのこと:絶対にしないでくださいgit pull origin br1 br2。見た目も感じもこのようになりますが、そうではありgit checkout br1; git pull origin; git checkout br2; git pull originません。代わりに、実際には次のことを行いますgit fetch origin && git merge origin/br1 origin/br2。これは、両方のフェッチ結果を現在のブランチにマージします。これは、Gitがタコのマージと呼んでいるものです。これは誰もが望んでいることではありません。おそらくgit pull完全にコマンドを拒否すべきである(実際には誰もない、それは最初のフェッチを実行することができますしたいが、その後、マージ)。
torek 2017年

18

Apullは基本的にfetch(いくつかのコミットと関連オブジェクトをリモートリポジトリからあなたのリポジトリに取得する)であり、次にこれらを作業コピーに「適用」する操作です。デフォルトでは、第2段階はを使用しmergeて実行されますが、pull.rebase変数をに設定するtrueと、代わりにリベースされます。

pullコマンドでポップアップする2つの質問があります。1つ目は、正確に何がフェッチされるのかということです。2つ目は、これらの変更を作業コピーにどのように適用するかです。最初から始めましょう。コマンドの完全な形式は次のとおりです。

git pull [options] [repository] [<refspec>...]

options(作るために例えば--rebase制御動作することをフラグであるpullとして仕事をfetch+rebaseしてもpull.rebaseですfalse)。

repository フェッチ元のリモートの名前(またはURL)です。

refspecs は、リモートでフェッチする参照と、現在の作業コピーのどこにそれらを配置するかを指定する簡潔な方法です。

最初に最も明確な形式を取りましょう。

 git pull origin branch1:branch2

これは基本的branch1に、呼び出されたリモートの参照の変更をプルしoriginてから、それらをローカルブランチにマージ(またはリベース)することを意味しbranch2ます。たとえば、と言うとgit pull origin master:dev、とdev同じコミットを指すというローカルブランチが呼び出されmasterます。refspecの指定方法の詳細はこちらです。を使用して、*複数のrefspecを示すことができます。たとえば、git pull origin refs/heads/*:refs/heads/*はすべてのブランチ(の下に格納されているheads)をローカルリポジトリにプルし、それらを同じ名前のローカルブランチにマージします。

それでは、デフォルトがどのように機能するかを説明するために、引数を1つずつ削除してみましょう。まず、refspecから宛先を削除して、単にと言うことができますgit pull origin branch1。これにより、最初fetchにリモートブランチbranch1がローカルリポジトリに移動します。と呼ばれる一時的な参照として利用できるようになりますFETCH_HEAD。その後、実行git merge FETCH_HEADされ、このブランチが現在アクティブなブランチにマージされます(つまりHEAD)。これは、ローカルブランチにいて、リモートからそのブランチに変更をフェッチする場合によく行われます。

さて、branch1完全にドロップして、ただ言ってみましょうgit pull origin。これで、gitは(origin)からどこからフェッチするかはわかりますが、何をフェッチするかはわかりません。これにはいくつかのデフォルトがあります。ほとんどのシナリオは、構成ファイルにbranch.<name>.mergeオプションがある場合です(これはのmergeようなセクション内で呼び出されるエントリです[branch "master"])。もしそうなら、それは操作のためにそこにあるrefspecsを使用します。

origin完全に削除して単に「」と言うとgit pull、設定をチェックして、branch.<name>.remoteプル元のリモートを指定するが存在するかどうかを確認します。上記と一緒にそれはあなたに何を引っ張るかを教えてくれます。

ポイント4と5は、通常のユースケースではありません。最初の方法は、リモートが呼び出されるorigin/master可能性が低い場合に意味があります。origin/master、通常は追跡ローカル参照masterリモートでブランチをorigin。2つ目はHEAD、リモート(通常はデフォルトのブランチ)で変更をフェッチしてから、masterそれらをローカルにマージしようとしますmaster。これはあなたが定期的にやりたいことかもしれませんが、コマンドは非常に型破りで、私が頻繁に使用するものではありません。

いくつかの詳細はスキップしましたが、これらは日常業務で安全で快適に保つのに十分なはずです。厄介な詳細については、のマニュアルページを確認してくださいgit pull


「たとえば、git pull origin master:devと言うと、masterと同じコミットを指すdevというローカルブランチを取得します。」それで、devと呼ばれる新しいブランチをダウンロードし、それがmasterを指すのでしょうか?
user332763 4619年

いいえ、masterリモートからブランチを取得しますが、devローカルで呼び出されます。
NoufalIbrahim19年

git pull origin refs/heads/*:refs/heads/*私のために働いていませんでした、そして私は得ましたno matches found: refs/heads/*:refs/heads/*。私も試しましたがgit pull origin refs/remotes/origin/*:refs/heads/*、それもうまくいきませんでした。1つのコマンドでリモート上のすべてのブランチをプルすることは不可能だと思います。また、これらすべてのブランチを後続のローカルブランチにマージ/リベースすることもできません。
ベンバターワース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.