フォークされたGitHubリポジトリからの非マスターブランチの変更をどのように統合しますか?
-
19-09-2019 - |
質問
次の両方のStackOverFlow質問の両方で、受け入れられた回答は、レポをフォークする状況で、フォークされたリポジトリからの変更をマージする方法を説明しています。あなたのフォークされたリポジトリ。
しかし、あなたがフォークした元のリポジトリのマスター以外のブランチで最新の状態を維持する方法は明確ではありません。たとえば、私が元々分岐したとき BitProphetのファブリックリポジトリ, 、次の枝が含まれていました。
- 主人
- 0.9
- 0.9-Doc-Rewrite(もう存在しない)
- パスと#24(もう存在しません)
最後の2つの枝はもはや存在しません、そして今、新しいブランチがあります flexible-task-declarations
. 。マスター、オリジン/マスター、アップストリーム/マスターがすべて同じSHA1ハッシュを持ち、同じgitスナップショットを指すように、マスターブランチを獲得、合併、プッシュしました。ただし、フォークが最新になるように、もはや存在しない枝を削除し、新しいブランチを更新する方法がわかりません。各アップストリームブランチを追跡してから、各ブランチを個別にフェッチ、マージ、プッシュする必要がありますか、それともより良い方法がありますか?
解決
シナリオ1:もはや存在しないブランチを削除する
存在しなくなったブランチを削除するには、StackoverFlowの質問への答えの指示に従いました ローカルとGitHubの両方でgitブランチを削除するにはどうすればよいですか? 次のコマンドを発行することにより、
$ git push origin :0.9-doc-rewrite
$ git push origin :path-and-#24
シナリオ2:既存の非マスターブランチの変更のマージ
アップストリーム/0.9ブランチを最新の状態にするために、次のことを行いました。
$ git checkout --track origin/0.9
$ git fetch upstream
$ git merge upstream/0.9
$ git push
シナリオ3:新しい非マスターブランチの追跡
これが処理する最良の方法であるかどうかはわかりませんが、ここに私がしたことがあります:
$ git branch flexible-task-declarations upstream/flexible-task-declarations
Branch flexible-task-declarations set up to track remote branch flexible-task-declarations from upstream.
$ git checkout flexible-task-declarations
$ git push origin flexible-task-declarations
すべてのブランチが同じコミットであることを確認するには:
$ git branch -av
これにより、ローカルとリモートのすべてのブランチが表示され、最新のコミットメッセージとSHA1ハッシュが表示されます。
シナリオ3を処理するためのより良い方法に光を当てる可能性のあるウェブ研究3
- GitHubガイド:Forked Repoと同期してGitフォークを保持する - オリジンとアップストリームの両方のリポジトリから同時にOctoマージのショートカットを提供しますが、上流にあるが原点ではないブランチを局所的に設定しない最初のステップを説明していません
- マスターGitリポジトリでフォークを最新の状態に保ちます XMPP4R開発者FAQから
Gitフォークの重要な違いは、単純なGitクローンまたはSVNチェックアウトのいずれかと比較した場合、フォークがマスターリポジトリを行わない限り最新の状態を保つことはできないことです。幸いなことに、これを行うのに役立つ簡単なツールがあります。フォークはGITの用語でマスターと等しいため、マスターの変更を追跡する場合は、フォークレポで追跡ブランチを作成し、それらの変更を何かをコミットするたびにフォークのマスターブランチにマージできます。 「Github」の宝石を強くお勧めします。これは、あなたに関連する他のリポジトリの変更を簡単に追跡できるようにインストールできるツールです。インストールと使用については、このページの下部にあるreadmeテキストを参照してください。 http://github.com/defunkt/github-gem/tree/master
- 共同Githubワークフロー eqqon(Githubワークフローに関する良い記事)から:
GitHubフォークキューを無視してください それは邪悪です!フォークキューは、貢献者から独身のコミットメントを選びたいが、支店全体に合併したくないメンテナー向けのツールです。フォークキューで遊んでいると、フォークが破損します(修正できますが、何かがうまくいかなかったことを読んでください)。 Githubの多くの初心者は、そこには矛盾する可能性のある変更がたくさんあり、最新の状態を維持する想定方法が何であるかを知らないため、フォークキューで何かをするべきだと感じています。フォークを最新の状態に保ち、調べてください!
DjangoのGithubワークフロー
Djangoプロジェクトには、方法についての指示があります Githubで協力します これは、上流の変更を処理し、引き抜くための標準的な方法と思われるものを使用します。
異なる初期フォーク構成
Long Nguyenのゲスト投稿が題されています GitHubでオープンソースプロジェクトのGitリポジトリをセットアップする Michael Hartlのブログでは、あなたが偽造したGitHubリポジトリをセットアップする興味深い方法について説明しています。記事によると、この方法の目標は次のとおりです。
- それぞれに完全な「公式」リポジトリが含まれるように、リポジトリを同期させてください
- 開発者が公式の更新を引き込むことができます
- マスター以外のブランチでの作業を奨励してください
他のヒント
基本的に、3つのリモートGitレポンを検討してください。
- ローカル:ワークステーションの現在のgitリポジトリ。
- 原点:ファブリックのフォークバージョンはどれですか: Cumulusware
- 上流の: BitProphet / Fabric, 、他のすべてのフォークレポの起源にあるもの
あなたはあなたのローカルにリモートリポジトリとして上流を追加することができます。
git remote add upstream http://github.com/bitprophet/fabric.git
リモートブランチを見てください
git branch -r
そして、起源に存在するが上流に存在しないものを押します(削除)
git push origin :anOldBranch
それで
git remote prune origin
あなたのローカルリポジトリのブランチをクリアするために(あなたがそれらを削除しただけなので、原点にはもう存在しません)
起源と上流の両方に存在する枝も同期する必要があります(あなたの作業を起源にプッシュする前に、上流の枝の上にあなたのローカルブランチを再baseすることは、アップストリームへの非常に簡単なプル要求を行う良い方法です:BitProphetはのみですあなたの仕事を含めるためにやるべきことを早送りする)
2つの遠くのリポジトリを同期するために、よりシンプルなプロセス/コマンド/スクリプトがあるかどうかはわかりません。
受け入れられた答えでシナリオ3をきれいに行う方法を探しているときに、この答えに出会いました。掘り下げた後、GIT 1.8で次のことを行うことができます。
git fetch upstream ;make sure you have all the upstream changes
git checkout --no-track upstream/0.9 ;grab the new branch but don't track it
git branch --set-upstream-to=origin/0.9 ;set the upstream repository to your origin
git push ;push your new branch up to origin