GitはGitHubから特定のブランチをプルします


631

複数のブランチを持つプロジェクトがあります。私はそれらをGitHubにプッシュしてきましたが、他の誰かがプロジェクトに取り組んでいるため、GitHubからブランチをプルする必要があります。マスターで問題なく動作します。しかし、誰かがブランチを作成したと言いxyzます。どうすればxyzGitHubからブランチをプルxyzして自分のブランチにマージできlocalhostますか?

私は実際にここに私の答えがあります: Gitでブランチをプッシュおよびプルします

しかし、「![拒否されました]」というエラーと「非早送り」に関するエラーが表示されます。

助言がありますか?


3
あなたが実行している実際のコマンドは何ですか?
Alex N.

1
「non fast forward」メッセージで失敗する可能性があるのはフェッチです。リモート追跡ブランチ(origin / xyz)を変更しましたか、それともリモートリポジトリでブランチを巻き戻し/書き直しましたか?" git fetch origin --force" を使用する必要があるかもしれませんが、実行する前にドキュメントを読んでください。
JakubNarębski、2009年

回答:


758

しかし、「![拒否されました]」というエラーと「非早送り」に関する情報が表示されます

これは、Gitがブランチからの変更を現在のマスターにマージできないためです。ブランチをチェックアウトmasterし、リモートブランチにマージするとしますother-branch。これを行うと:

$ git pull origin other-branch

Gitは基本的にこれを行っています:

$ git fetch origin other-branch && git merge other-branch

つまり、a pullfetch後にはが続きmergeます。ただし、pull-ingの場合、Gitは早送りマージを実行できる場合のみマージします。早送りマージは、あなたがにマージしようとしている枝の頭部があるにマージされますother-branch 、直接の子孫マージする枝の頭の。たとえば、この履歴ツリーがある場合、マージother-branchすると早送りマージになります。

O-O-O-O-O-O
^         ^
master    other-branch

しかし、これは 早送りマージになりません

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

問題を解決するには、まず リモートブランチをフェッチし

$ git fetch origin other-branch

次に、それを現在のブランチにマージし(私はそれだと仮定しますmaster)、マージの競合を修正します。

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

いいえ、問題はフェッチにあり、マージステップではありません。
JakubNarębski、2009年

3
通常、リモートは、早送りのコミットが発生しない場合でもフェッチが強制されるように設定されているため、通常の構成でOPが何かを変更しない限り、フェッチ時に発生することはありません。早送りの問題は、フェッチまたはマージ中に発生する可能性があります。問題は間違いなくフェッチではなく、マージではないとどうして言うのですか?
mipadi 2009年

私は次の手順に従います(フェッチ、マージ)。Gitは、何もする必要がないことを教えてくれます。コミットしようとすると、早送りについてうめき声が落ちます。
Jean Jordaan、

1
@mipadi私はジーンと同じ問題を抱えていましたが、リモートがデフォルト以外の方法でセットアップされているとは言えませんが、私が使用できると言ってgit fetch -f私の問題を修正しました!ありがとう!
cregox

1
これにより、リモートブランチxzyがローカルブランチにマージmasterされます。これは、元の質問で示唆されていたものではありません。「GitHubからブランチxyzをプルして、ローカルホストのブランチxyzにマージするにはどうすればよいですか?」
user5359531 2017年

301

リモートブランチを明示的に追跡するだけで、シンプルなブランチがgit pullあなたの望みどおりの結果をもたらします。

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

後者はローカル操作です。

または、フォークに関するGitHubドキュメントにさらに適合します

git branch -f new_local_branch_name upstream/remote_branch_name

39
「有効なオブジェクト名ではありません: 'origin / remote_branch_name'」が表示された場合は、最初に「git fetch origin」を実行してください。
Martin Konicek

130

次のコマンドを使用して、ブランチをブランチにプルできます。

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

あなたがマスターブランチにいるときは、最初に次のようなブランチをチェックアウトすることもできます:

git checkout -b xyz

これにより、マスターから新しいブランチ「xyz」が作成され、直接チェックアウトされます。

それからあなたはします:

git pull origin xyz

これにより、新しいブランチがローカルxyzブランチにプルされます。


1
パーフェクト!私はその構文を知らなかった:git pull {repo} {remotebranchname}:{localbranchname}。質問、そのプルが機能しない場合(おそらく誰かがブランチを更新し、マージの競合が発生する可能性があります)、私の選択肢は何ですか?
コスタ

7
これは、リモートブランチを現在のブランチ(マスターなど)にマージしようとするため、反対票を投じています。これはほとんどの人がやりたいことではなく、OPが要求したことでもありません。@mohitの答えが正しい選択です。
Phrogz、2016

1
Phrogz-この動作は最近のバージョンのGitで変更されたようです。私は以前これを使いました、そしてそれは完全にうまくいきました。
Pawan、2017年

88

最善の方法は:

git checkout -b <new_branch> <remote repo name>/<new_branch>

1
githubに新しい「dev」ブランチを作成して上記を試した後、次のエラーメッセージが表示されました。以下のBradley Floodのソリューションごとに「フェッチ」してから、mohitの答えを再実行します。
TomEberhard、2018年

46

git fetch ブランチの最新リストを取得します。

今できる git checkout MyNewBranch

完了:)


詳細については、ドキュメントを参照してください:git fetch


37

私は問題を完全に理解しているとは思いませんが、既存のブランチをプルすることはこのように行われます(少なくとも私にとってはうまくいきます:)

git pull origin BRANCH

これは、ローカルブランチがorigin / BRANCHから作成されていることを前提としています。



8

簡単に言えば、ブランチをGitHubからプルしたい場合the_branch_I_want

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want

3
git pull <gitreponame> <branchname>

通常、コードに割り当てられているリポジトリのみがある場合、gitreponameがoriginになります。

1つがローカルで、もう1つがリモート用の2つのリポジトリで作業している場合は、git remote -vからリポジトリのリストを確認できます。。これは、現在のコードに割り当てられているリポジトリの数を示しています。

BranchNameは対応するgitreponameに存在する必要があります。

次の2つのコマンドを使用して、リポジトリを追加または削除できます

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>

2

あなたもするかもしれません

git pull -r origin master

マージの競合があれば修正します

git rebase --continue

-rはリベース用です。これにより、分岐構造が作成されます

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

これはよりきれいな歴史につながります。注:他のブランチをオリジン(または他のリモート)にすでにプッシュしている場合は、リベース後にブランチを強制的にプッシュする必要がある場合があります。

git push -f origin other-branch

1

やった

git branch -f new_local_branch_name origin/remote_branch_name

の代わりに

git branch -f new_local_branch_name upstream/remote_branch_name

@innaMによって提案されています。私が上流バージョンを使用したとき、それは '致命的:有効なオブジェクト名ではありません:'上流/ remote_branch_name 'と言いました。私はgit fetch originコメントが示唆したようにはしませんでしたが、代わりに単にに置き換えupstreamましたorigin。同等だと思います。


0

GitHubからブランチをプルするために使用できます

git checkout --track origin/the-branch-name

ブランチ名が完全に同じであることを確認してください。

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