16

次のStackOverflowの質問の両方で、受け入れられた回答は、リポジトリをフォークし、元のリポジトリが変更され、マスターブランチに加えられた変更をマージして元に戻す状況で、フォークされたリポジトリからの変更をマージする方法を説明していますフォークされたリポジトリ。

However, I'm not clear on how you keep up to date on the non-master branches in the original repo that you forked. For instance, when I originally forked bitprophet's fabric repository, it contained the following branches:

  • master
  • 0.9
  • 0.9-doc-rewrite (no longer exists)
  • path-and-#24 (no longer exists)

The last two branches no longer exist, and now there is a new branch flexible-task-declarations. I have fetched, merged, and pushed my master branch, so that master, origin/master, and upstream/master all have the same SHA1 hash and point to the same git snapshot. However, I'm not sure how to remove the branches that no longer exist and update the new branches so that my fork is up to date. Do I need to track each upstream branch and then fetch, merge, and push each branch individually, or is there a better way?

4

3 に答える 3

24

シナリオ 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 を処理するためのより良い方法を明らかにする可能性がある Web 調査

単純な Git クローンまたは SVN チェックアウトと比較した場合の Git フォークの主な違いは、そうしない限り、フォークがマスター リポジトリで最新の状態に保たれないことです。幸いなことに、これを行うのに役立つ簡単なツールがあります。フォークは、Git の用語ではマスターとは別のものであり、等しいので、マスターへの変更を追跡したい場合は、フォークされたリポジトリに追跡ブランチを作成し、何かをコミットしたいときはいつでもそれらの変更をフォークのマスター ブランチにマージできます。「GitHub」gem を強くお勧めします。これは、自分のリポジトリに関連する他のリポジトリの変更を簡単に追跡できるようにするためにインストールできるツールです。インストールと使用方法については、このページの下部にある README テキストを参照してください: http://github.com/defunkt/github-gem/tree/master

Githubのフォーク キューを無視してください。fork キューは、コントリビューターから単一のコミットを選びたいが、ブランチ全体をマージしたくないメンテナーのためのツールです。フォーク キューをいじると、フォークが破損します (ただし、問題が発生したことを読んで修正できます)。github の初心者の多くは、競合する可能性のある変更がたくさんあり、自分のフォークを最新の状態に保つ方法がわからないため、フォーク キューで何かをする必要があると感じています。Keeping your fork up to date を読んで見つけてください!

Django の Github ワークフロー

Django プロジェクトには、Github でコラボレーションする方法に関する説明があり、これは上流の変更を分岐およびプルする標準的な方法と思われるものを使用します。

異なる初期フォーク構成

Michael Hartl のブログのGitHub でのオープン ソース プロジェクト用の Git リポジトリのセットアップというタイトルの Long Nguyen のゲスト投稿では、フォークした Github リポジトリをセットアップする興味深い方法について説明しています。この記事によると、この方法の目標は次のとおりです。

  • リポジトリを同期して、それぞれに完全な「公式」リポジトリが含まれるようにします
  • 開発者が公式アップデートを取得できるようにする
  • master 以外のブランチでの作業を奨励する
于 2010-01-06T19:02:05.097 に答える
3

基本的に、3 つのリモート Git リポジトリを検討します。

アップストリームをリモート リポジトリとしてローカルに追加できます。

 git remote add upstream http://github.com/bitprophet/fabric.git

リモートブランチを見てください

 git branch -r 

オリジンに存在するが上流に存在しなくなったものをプッシュ(削除)します

 git push origin :anOldBranch

それで

 git remote prune origin

ローカルレポのブランチをクリアします(削除したばかりなので、オリジンにはもう存在しません)

オリジンとアップストリームの両方に存在するブランチも同期する必要があります (作業をオリジンにプッシュする前に、ローカル ブランチをアップストリームのブランチの上にリベースすることは、アップストリームへの非常に簡単なプル リクエストを作成する良い方法です。作業を含めるために早送りマージを行う必要があります)

2 つの離れたリポジトリを同期するための、より単純なプロセス/コマンド/スクリプトを使用できるかどうかはわかりません。

于 2010-01-06T18:58:30.757 に答える
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
于 2013-12-19T00:18:33.527 に答える