Gitフェッチリモートブランチ


2261

私の同僚と私は同じリポジトリで作業しています。2つのブランチに分岐しましたが、それぞれ技術的に異なるプロジェクトに対応していますが、それらには類似点があるため、masterから*にコミットしたい場合がありますbranch

しかし、私は持っていbranchます。同僚は具体的にどのようにそのブランチをプルできますか?

git cloneリポジトリのA は、彼のためにローカルにブランチを作成していないようですが、私の最後を押した後、ブランチが無茶苦茶に生きているのを見ることができます。

また、私が最初にブランチを作成したときに、私はブランチを作成しました-b checkout。それは大きな違いをもたらしますか?

$ git branch -r
origin/HEAD -> origin/master
origin/daves_branch
origin/discover
origin/master

$ git fetch origin discover
$ git checkout discover

これらは私が実行したコマンドです。しかし、それは間違いなく機能していません。

そのブランチをチェックアウトして、さまざまな共同作業者やワークステーションからのブランチの変更だけをプッシュしてコミットできるようにしたいと思っています



33
私は使用しました: git fetch --all、次にすべてのブランチを表示するために:git branch、次にブランチをチェックアウトします:git checkout nameofnewbranch
Jeff Mattson '20

あなたの質問をチェックしてください/programming/1072261/push-and-pull-branches-in-git/47780374#47780374
Rizo


6
git fetch origin discover:discover && git checkout discover
Gayan Weerakutti

回答:


3061

リモートブランチを追跡するローカルブランチを作成する必要があります。次のコマンドは、daves_branchという名前のローカルブランチを作成し、リモートブランチorigin / daves_branchを追跡します。変更をプッシュすると、リモートブランチが更新されます。

最新バージョンのGitの場合:

git checkout --track origin/daves_branch

--track省略形ですgit checkout -b [branch] [remotename]/[branch][REMOTENAME]がある場合、原点この場合、および[ブランチ]を2回同じ、されdaves_branchこのケースでは。

Git 1.5.6.5では、これが必要でした:

git checkout --track -b daves_branch origin/daves_branch

Git 1.7.2.3以降の場合、これで十分です(これは以前に開始された可能性がありますが、これは私がすぐに見つけることができる最も早い確認です):

git checkout daves_branch

最近のGitバージョンでは、このコマンドはローカルブランチを作成せず、「デタッチされたHEAD」状態になります。ローカルブランチが必要な場合は、--trackオプションを使用します。

詳細はこちら:3.5 Gitブランチ-リモートブランチ、トラッキングブランチ


134
リポがリモート参照で更新されていることを確認するための「git fetch」と「git checkout --track origin / discover」で十分です。次に、そのブランチにコミットし、「git push」してリモートを変更と同期できます。
ラルフテニンジャ2012年

33
私はこれを試し、「致命的:git checkout:パスの更新はブランチの切り替えと互換性がありません。コミットとして解決できない 'upstream / develop'をチェックアウトするつもりでしたか?」を取得しました。私は何か間違ったことをしていますか?
Neil Barnwell、2012

42
代わりにgit 1.5.6.5がこれを必要とするようです:git checkout --track -b origin / daves_branch
Charlie

35
これは私にとって混乱を招き、origin / <branch>という名前のローカルブランチが作成されましたが、現在はリモートブランチorigin / <branch>があいまいであり、クレイジーなローカルブランチを取り除く方法がわかりません!
アランムーア

24
あなたは、そうでない場合Gitは上記で述べた@AlanMooreと@ derekmx271として、完全な分岐路を持つ新しいローカルブランチを作成し、明示的にローカルブランチ名を追加する必要がありますgit checkout -b --track daves_branch origin/daves_branch
マイク・スコット

961

私はfetch続いて使用していcheckoutます...

git fetch <remote> <rbranch>:<lbranch>
git checkout <lbranch>

...ここ<rbranch>で、リモートブランチまたはソース参照<lbranch>あり、追跡するまだ存在していないローカルブランチまたは宛先参照であり、リモートブランチまたはソース参照と同じ名前にしたい場合があります。これは、の説明のオプションで説明されています<refspec>

Gitはとてもスマートなので、リモートブランチの最初の数文字の後にタブを付けると、最初のコマンドが自動的に完了します。つまり、ローカルブランチに名前を付ける必要さえありません。Gitは自動的にリモートブランチの名前をコピーします。Gitに感謝!

また、この類似のStack Overflow投稿の回答が示すように、ローカルブランチにで名前を付けない場合fetchでも、-bフラグを使用してチェックアウトするときに作成できます。あれは、 git fetch <remote> <branch>その後に続くのgit checkout -b <branch> <remote>/<branch>私の最初の答えとまったく同じです。あなたのリポジトリがある場合や、明らかに、一つだけのリモートを、そしてあなただけ行うことができますgit checkout <branch>fetch、それはあなたのためのローカルブランチを作成します。たとえば、リポジトリのクローンを作成し、リモートから追加のブランチをチェックアウトしたいとします。

のドキュメントの一部は、fetchからそのままコピーされた可能性がありますpull。特に、上のセクション<refspec>オプション同じです。しかし、私はそれfetchがこれまでmergeにないだろうとは思わないので、コロンの宛先側を空のままにfetch しても、何もすべきではありません

注意: git fetch <remote> <refspec>git fetch <remote> <refspec>:したがって、何もしない短いですが、リモートをローカルにコピーするのgit fetch <remote> <tag>と同じです。git fetch <remote> <tag>:<tag><tag>

これは、リモートブランチをローカルにコピーする場合にのみ役立ちますが、すぐにチェックアウトする必要はありません。それ以外の場合は、承認された回答を使用します。これは、チェックアウトの説明の最初のセクションで詳しく説明されており、後での説明の下のオプションセクションで説明されています--trackうーん...ソートワンライナーの、あなたはなるので、まだ実行する必要がありますgit fetch <remote>最初。

参考:<refspecs>(source:destination)の順序は、リモートブランチ削除するための奇妙なGit 1.7より前の方法を説明しています。つまり、宛先のrefspecには何もプッシュしません。


8
Gitオートコンプリートがセットアップされていると想定します。code-worrier.com/blog/autocomplete-git
antonagestam

2
これは、リモートコードをローカルブランチに取り込むのに役立ちました。しかし、それは私のローカルブランチにリモートブランチを追跡させませんでした。
Aknosis 2014

1
何らかの理由で、git fetch remote branchすべての参照がフェッチされたにもかかわらず、ブランチヘッドをまったく追加しなかったため、承認された回答の手順を実行しようとすると、エラーが発生しましたpathspec did not match any file(s) known to git.が、rbranch:lbranchアプローチは機能しました。興味深いことに、ワイルドカード(rbranch*)のように、同じ接頭辞で始まるすべてのタグも取得しました。
haridsv 2015年

3
Nit:gitはオートコンプリートを実行しません。それを実行しているのはbashシェルです。
合法化

1
FWIW、私はこの答えと受け入れられた答えの違いは、これがあなたにfetch命令をするようにあなたに言うということだと思います。OPが彼がすでにフェッチを実行したことを注記しているため、受け入れられた答えは理にかなっています。それは少なくとも私が遭遇した問題です。
tenor528

373

新しいリモートブランチ(リモートにのみ存在し、ローカルには存在しない)を「チェックアウト」しようとしている場合は、次のものが必要です。

git fetch origin
git checkout --track origin/<remote_branch_name>

これは、originからフェッチすることを前提としています。そうでない場合は、originリモート名に置き換えます。


1
私のために働いた、私は正しいリモートブランチをフェッチしていなかったので、受け入れられた答えは混乱するメッセージで私のために失敗し続けました。+1
Nathan Hinchey

通常、git fetchを使用しますが、git fetchとgit fetch originの違いは何ですか?
Ping Woo

@PingWooフェッチしたいブランチが元のリモートにあるgit fetchgit fetch remoteすると、どちらも同じことを行います。以外のリモートからフェッチする必要がある場合originは、を使用してフェッチできますgit fetch <other_remote_name>。この状況は非常に一般的ではありませんが、完全を期すためにここで説明しました。
paneer_tikka

1
これらすべてのソリューションを試すPCに頭をぶつけそうになりました。結局のところ、ブランチ名にタイプミスがありました。
Dev Yego

126

ローカルではなくリモートに存在するmyBranchをチェックアウトするには-これは私にとってはうまくいきました:

git fetch --all
git checkout myBranch

私はこのメッセージを受け取りました:

Branch myBranch set up to track remote branch myBranch from origin
Switched to a new branch 'myBranch'

1
言い換えれば、あなたが書く必要はありません-tか?
Andrew Samuelsen 2014

4
この答えには誤りがあると思います。私はもともとコマンドなし-tでコマンドを実行しYou are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout.、同じ名前のローカルブランチがなかったために取得しました。-t修正するために再実行する必要がありました。
stanri 2015

1
これは私にとってはうまくいきました。私の同僚は、ローカルリポジトリに追加したい新しいリモートブランチを追加しました。フェッチを続けましたが、新しいブランチがローカルに表示されませんでした。私はただ走ることができることを知らなかったcheckoutそれを作成ためにた。ありがとう!
skwidbreth 2016

2
gitのバージョンによって異なります。最新バージョンは、ここで他の場所で述べたように、git checkout <起点のブランチの名前>のみが必要です。同じ名前のローカルVSリモートブランチに注意してください-それらは混乱します
leRobot

--allすべてのブランチのすべてのファイルをダウンロードするため、これは決して良い考えではありません。より多くの時間とスペースが必要になります。これは、支店名を特定することと同様に行う方が良いでしょう、この
ハニー

53

使用git branch -a(ローカルとリモートの両方の枝)、またはgit branch -rすべてのリモート、その枝を参照するには(のみリモートブランチ)。その後git checkout -t remotes/repo/branch、リモートに対してa を実行し、ローカルブランチを作成できます。

そのリモートのすべての参照とタグを表示するgit-ls-remoteコマンドもあります。


git checkout remotes/repo/branchgit checkoutがリモートリポジトリではなく、パススペックを探すようにします。
エリン

1
はい、リモートリポジトリのブランチをチェックアウトすることもできますか?明らかに(または、それほど明白ではなかったかもしれませんが)、リモートが最初にフェッチされるため、ローカルにリモートが存在します。git bookには適切なセクションがあります:git-scm.com/book/en/Git-Branching-Remote-Branches
Daniel Lee

43

タイトルと質問は混同されています:

  • Gitフェッチリモートブランチ
  • 私の同僚は、具体的にどのようにそのブランチをプルすることができますか。

質問がある場合は、リモートブランチをどのように操作するか、またはGitでリモートブランチをチェックアウトするにはどうすればよいですか?、より簡単な解決策は次のとおりです。

Git(> = 1.6.6)を使用すると、以下を使用できます。

git checkout <branch_name>

ローカル<branch_name>が見つからないが、名前が一致する1つのリモートに追跡ブランチが存在する場合は、それを次と同等として扱います。

git checkout -b <branch_name> --track <remote>/<branch_name>

Gitチェックアウトのドキュメントを参照してください

あなたの友人のために:

$ git checkout discover
Branch discover set up to track remote branch discover
Switched to a new branch 'discover'

ギヨーム、ありがとう!:私はちょうど私の正確なケース描写するには、このコマンドを使用し、それについて記事を書いたleniel.net/2014/05/...
Leniel Maccaferriを

<!-git checkout <remote-branch-name>->は正常に動作します。Guillaumeに感謝します!
Sachidananda Naik、2018年

36

それを行う最も簡単な方法は、少なくとも私にとっては:

git fetch origin <branchName> # Will fetch the branch locally
git checkout <branchName> # To move to that branch

1
他の支部を持ち込まない
ベンジャミンハレル

7
@BenjaminHarelの質問では、「リモートブランチをフェッチする」とは言っていません。そのためにあなたのために、このかもしれ参考になっ従うstackoverflow.com/questions/10312521/...
ジェームズRochabrun

2
このfetchコマンドを使用すると、必要なブランチがローカルマシンで使用できるようになります。git checkout -b 'your_branch' origin/'remote branch'このブランチをチェックアウトするために必要です。
Abhijeet

30

使用する:

git checkout -b serverfix origin/serverfix

これは、Gitが--track省略形を提供するのに十分一般的な操作です。

git checkout --track origin/serverfix

実際、これは非常に一般的であるため、そのショートカットのショートカットさえあります。チェックアウトしようとしているブランチ名(a)が存在せず、(b)1つのリモートのみの名前と完全に一致する場合、Gitは追跡ブランチを作成します。

git checkout serverfix

リモートブランチとは異なる名前でローカルブランチをセットアップするには、ローカルブランチ名が異なる最初のバージョンを簡単に使用できます。

git checkout -b sf origin/serverfix

これで、ローカルブランチsfが自動的にからプルされorigin/serverfixます。

出典:Pro Git、第2版、Scott ChaconとBen Straubが作成(読みやすさを考慮してカット)


それらの略記は教訓でした
Z. Khullah


18

リモートに存在するブランチをフェッチするには、最も簡単な方法は次のとおりです。

git fetch origin branchName
git checkout branchName

あなたはそれがすでにリモートに存在するかどうかを見ることができます:

git branch -r

これにより、リモートブランチがローカルにフェッチされ、リモートブランチが自動的に追跡されます。


2
この質問にはどのようにして賛成票がないのですか?私は間違っている可能性がありますが、これは確かにうまくいくようで、リモートからローカルにないブランチをフェッチしました...
Nicholas Petersen

15

私を助けたのは

1)利用可能なすべてのリモートブランチを表示するには(例: 'remote-branch-name')

git branch -r

2)リモートブランチ名を使用してローカルブランチを作成する

git fetch && git checkout 'remote-branch-name'

1
git push他の引数なしでコマンドを実行するとどうなりますか?という名前remote-branch-nameのリモートブランチに自動的に関連付けられる(追跡する)という名前のローカルブランチorigin/remote-branch-nameです。それとも、実行する必要がありますかgit push -u origin remote-branch-name
PatS 2018年

1
これにより、HEADが切り離された状態になります
Akin Hwan

15

リモートブランチを一度にフェッチしてチェックアウトすることもできます。

git fetch && git checkout the-branch-name


13

入力した

git checkout <branch_name>

そして得た

Branch <branch_name> set up to track remote branch <branch_name> from origin.
Switched to a new branch '<branch_name>'

gitのチェックアウトのドキュメントから:もし<BRANCH_NAME>が見つかりませんが、相当するとして、リモート一致する名前を持つ御馳走を正確に一つで追跡ブランチが存在しない:git checkout -b <branch_name> --track <remote>/<branch_name>
ギヨーム・ヴィンセント

11

ときどき、マスターブランチをいじらないで、リモートブランチだけを操作するように求められます(私が求められたように)。したがって、必要なのはリモートブランチだけです。

したがって、リモートブランチのみを(マスターなしで)クローンするには、次のようにします。

git clone url --branch remote_branch_name

ここで、remote_branch_nameはリモートブランチの名前です。

例えば、

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --branch v3.15

これにより、リモートブランチの名前を使用して、リモートブランチをローカルブランチに確実に複製できます。

コードをコミットしてプッシュすると、コードはそのブランチだけに送信されます。


関連:Gitで単一のブランチをどのようにクローンしますか?- 「git 1.7.10(2012年4月)では、実際には1つのブランチしか複製できません:」
Peter Mortensen

11

[素早い回答]

多くの選択肢があり、私のお気に入りは次のとおりです。

-代替1:

git fetch --all
git checkout YourBranch

リモートには存在するがローカルには存在しないブランチを使用して、この代替手段を使用します。

-代替2:

git checkout -b 'YourBranch' origin/'YourRemote'

おそらく、これが最も簡単な方法です。


9

リモートがgit@xyz.gitで、random_branchブランチが必要だとします。プロセスは次のようになります。

  1. 最初にリモコンのリストを確認してください

    git remote -v

  2. 上記のコマンドの出力にgit@xyz.gitリモートがない場合は、次のように追加します。

    git remote add xyz git@xyz.git

  3. これで、そのリモートのコンテンツを次のようにフェッチできます

    git fetch xyz

  4. 次に、そのリモートのブランチをチェックアウトします

    git checkout -b my_copy_random_branch xyz/random_branch

  5. ブランチリストを確認する

    git branch -a

ローカルブランチmy_copy_random_branchは、リモートのrandom_branchブランチを追跡します。



7

git fetch && git checkout <your friend's branch name> トリックを行う必要があります


7

すべてのリモートブランチをローカルにフェッチし、新しく作成したローカルブランチに切り替えるための1行のコマンドを提供します。

git fetch && git checkout discover

上記のコマンドを実行すると、次のメッセージが表示されます。

Switched to a new branch 'discover'
Branch discover set up to track remote branch discover from origin.

最初の行は、新しいブランチに切り替えたことを示してい ます。それはすでにリモートにあります!

しかし、実際にはローカルでも作成する必要があります。ブランチはリモートインデックスから取得され、ローカルに作成されます。

ここではdiscover、あなたのリポジトリのリモートブランチから作成された新しいブランチがありますdiscover

しかし、2行目では、1行目よりも多くの情報が得られます。

私たちのブランチは、同じ名前のリモートブランチ追跡するように設定されています。

けれどもは、git fetch すべてのブランチを取得し、ローカルに。しかし、git branchその後を実行すると、masterローカルのブランチのみが表示されます。なんで

git checkout <branchname>上記の例で行ったように追跡するために、リモートにあるすべてのブランチに対してローカルで作成する必要があるためです。

git checkoutコマンドを実行した後git branch、を実行すると、両方のブランチが表示されます。

  1. マスターと2.ローカルリストで発見します。


5

単に試してください:

git pull origin your_branch_name

2
Rizo、git pull origin branch_nameが最善の解決策です。あなたがこれを解決策として投稿した唯一の人であり、それは私のために働いた。これは、ブランチをマスターブランチで更新するため機能します。シンプルで複雑ではありません。
Ian Poston Framer

3
これの問題は、リモートブランチをリモートブランチではないCURRENTブランチとマージしようとすることです(ローカルリポジトリでは新しいため)
Z. Khullah

これは現在のブランチにマージされます。
Eem Jee

4

で複製されたリポジトリーがある場合--depth 1、リストされているコマンドの多くは機能しません。たとえば、こちらをご覧ください

% git clone --depth 1 https://github.com/repo/code
Cloning into 'code'...
cd code
remote: Counting objects: 1778, done.
remote: Compressing objects: 100% (1105/1105), done.
remote: Total 1778 (delta 87), reused 1390 (delta 58), pack-reused 0
Receiving objects: 100% (1778/1778), 5.54 MiB | 4.33 MiB/s, done.
Resolving deltas: 100% (87/87), done.
Checking connectivity... done.
Checking out files: 100% (1215/1215), done.
% cd code
% git checkout other_branch
error: pathspec 'other_branch' did not match any file(s) known to git.
% git fetch origin other_branch
remote: Counting objects: 47289, done.
remote: Compressing objects: 100% (15906/15906), done.
remote: Total 47289 (delta 30151), reused 46699 (delta 29570), pack-reused 0
Receiving objects: 100% (47289/47289), 31.03 MiB | 5.70 MiB/s, done.
Resolving deltas: 100% (30151/30151), completed with 362 local objects.
From https://github.com/repo/code
 * branch            other_branch-> FETCH_HEAD
% git checkout other_branch
error: pathspec 'other_branch' did not match any file(s) known to git.
%

この場合、リポジトリを再クローンしますが、おそらく他のテクニックがあります。たとえば、git浅いクローン(clone --depth)がリモートブランチをミスする


3

あなたがすでにリモートブランチを知っているなら...

git remote
=> One
=> Two

そして、チェックアウトしたいブランチ名、例えばbr1.2.3.4を知っているなら、

git fetch One
=> returns all meta data of remote, that is, the branch name in question.

あとはブランチをチェックアウトするだけです

git checkout br.1.2.3.4

次に、それから新しいブランチを作成します。


3

手順は次のとおりです。

  1. git fetch originまたはgit fetch --all、これはすべてのリモートブランチをローカルにフェッチし、次にこれを処理できる2番目のオプションです。

  2. git checkout --track origin/<The_remote_branch you want to switch over>

次に、このブランチで作業し、次のように入力して、そのブランチにいるかどうかを確認できます

git branch

現在のブランチを表示します。



2

.git/configファイルをチェックしてください。特に、そのリモートのフェッチでどのようなトラッキングが存在するかを確認してください。

[remote "randomRemote"]
    url = git@github.com:someUser/someRepo.git
    fetch = +refs/heads/*:refs/remotes/randomRemote/*

heads/*指しているrandomRemote/*場合、を実行するとgit fetch randomRemote、すべてのブランチがフェッチされます。

その後、そのブランチをチェックアウトできます。

さもないと、

  1. これを使用して、追跡にリモートブランチを追加する必要があります。.git/configこれを実行した後に確認してください。あなたは理解するでしょう。

    git remote set-branches --add randomRemote randomBranch
    
  2. を実行しますgit fetch randomRemote。これはリモートブランチをフェッチします。

  3. これで実行できますgit checkout randomBranch


1

'git pull'を使用して、ブランチを分離します。「lbranch」と「rbranch」は解読するのが難しいので、実際のリポジトリとブランチ名を使用して説明します。

使用しましょう:

  • myteam.unfuddle.com =リモートGitサーバー
  • tlc =リポジトリが存在するプロジェクトアカウントを解読する
  • daves_branch =リモートブランチ名

    あなたまたは同僚は、これを実行して、ブランチの数に関係なく、ブランチのみをプルすることができます。

    git init
    git pull git@myteam.unfuddle.com:myteam/tlc daves_branch:refs/remotes/origin/daves_branch
    

  • 0

    簡単なコマンドgit checkout remote_branch_nameで、リモートブランチのすべての変更を含むローカルブランチを作成できます。


    -2
    git checkout -b branch_name
    git pull remote_name branch_name
    

    3
    このスニペットは質問に答える可能性がありますが、それが何をするのか、そしてすでにここにある非常に多くの回答とどのように異なるのかについての説明を含めることをお勧めします。
    DaveyDaveDave

    2
    私は個人的にはこのオプションが好きではありません。リモートブランチをしてもしなくてもよいのマスターと同じページ上にあってもよいし、いくつかの不要なコードの更新を誘うかもしれない、場合にあなたがマスターから新しいブランチを作成しているし、リモートブランチからデータを引っ張っているため
    zeetit

    いくつかの説明は正しいでしょう。
    Peter Mortensen
    弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
    Licensed under cc by-sa 3.0 with attribution required.