複数の支店を持つプロジェクトがあります。私はそれらを GitHub にプッシュしてきました、そして今他の誰かがGitHubから彼らのブランチを引っ張る必要があるプロジェクトに取り組んでいるので。マスターではうまくいきます。しかし、誰かがブランチxyz
を作成したとしましょう。どうすればGitHubからブランチxyz
を取得し、それを私のxyz
のブランチlocalhost
にマージすることができますか?
私は実際に私の答えをここに持っている:Gitでプッシュとプルの分岐
しかし、 "![rejected]"というエラーと、 "早送りではない"というエラーが表示されます。
助言がありますか?
しかし、 "![rejected]"というエラーと、 "早送りではない"というエラーが表示されます。
これは、Gitがブランチからの変更を現在のマスターにマージできないためです。ブランチmaster
name__をチェックアウトし、リモートブランチother-branch
にマージしたいとしましょう。これをするとき:
$ git pull Origin other-branch
Gitは基本的にこれをやっています:
$ git fetch Origin other-branch && git merge other-branch
つまり、pull
name__は単なるfetch
name__とそれに続くmerge
name__です。しかし、_ pull
name _ _ingを実行すると、Gitはonlyマージします_ other-branch
if早送りマージを実行できます。 fast-forwardマージは、マージしようとしているブランチの先頭が、マージしたいブランチの先頭の直接の子孫であるマージです。たとえば、この履歴ツリーがある場合、other-branch
をマージすると早送りマージが行われます。
O-O-O-O-O-O
^ ^
master other-branch
ただし、これはnotになることは早送りになります。
v master
O-O-O
\
\-O-O-O-O
^ other-branch
あなたの問題を解決するには、まずfetchでリモートブランチを取得します。
$ git fetch Origin other-branch
それを現在のブランチにマージし(master
name__と仮定します)、マージの競合を修正します。
$ git merge Origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit # And commit the merge!
リモートブランチを明示的に追跡するだけで、簡単な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
次のコマンドで枝を枝に引っ張ることができます。
git pull {repo} {remotebranchname}:{localbranchname}
git pull Origin xyz:xyz
あなたがマスターブランチにいるとき、あなたは最初に次のようにブランチをチェックアウトすることもできます:
git checkout -b xyz
これはマスターから新しいブランチ "xyz"を作成し、それを直接チェックアウトします。
それからあなたはします:
git pull Origin xyz
これは新しいブランチをあなたのローカルのxyz
ブランチに引っ張ります。
最善の方法は次のとおりです。
git checkout -b <new_branch> <remote repo name>/<new_branch>
私は問題を完全に理解しているかどうかわからないが、既存のブランチを引っ張ることはこのようにして行われる(少なくともそれは私のために働く:)
git pull Origin BRANCH
これはあなたのローカルブランチがOrigin/BRANCHから作成されたと仮定しています。
これは私がそれを他のものにマージする前にリモートブランチを取得するのを助けました:
git fetch repo xyz:xyz
git checkout xyz
git pull <gitreponame> <branchname>
通常、リポジトリにコードを割り当てただけの場合、gitreponameはOriginになります。
1つがローカルでもう1つがリモートであるように、2つのリポジトリで作業している場合は、 git remote -v からリポジトリのリストを確認できます。これは、現在のコードに割り当てられているレポの数を示しています。
BranchNameは対応するgitreponameに存在する必要があります。
次の2つのコマンドを使ってリポジトリの追加や削除ができます。
git remote add <gitreponame> <repourl>
git remote remove <gitreponame>
あなたもするかもしれません
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
これはよりきれいな歴史につながるでしょう。注意:もう一方のブランチをOrigin(または他のリモート)に既にプッシュしている場合は、リベース後にブランチをプッシュする必要があります。
git Push -f Origin other-branch
簡単に言えば、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
やった
git branch -f new_local_branch_name Origin/remote_branch_name
の代わりに
git branch -f new_local_branch_name upstream/remote_branch_name
@innaMが示唆しているように。私がアップストリームバージョンを使用したとき、それは言った '致命的:無効なオブジェクト名:' upstream/remote_branch_name ''。私はコメントが示唆するようにgit fetch Origin
をしませんでしたが、代わりに単にupstream
をOrigin
に置き換えました。それらは同等であると思います。