GitHubでの分岐と分岐


278

githubプロジェクトの分岐とgithubプロジェクトのブランチの作成の利点と欠点についてもっと知りたいのですが。

元のプロジェクトの共同編集者リストに登録する必要がないため、フォークを使用すると、プロジェクトのバージョンが元のバージョンから分離されます。プロジェクトは社内で開発しているので、人をコラボレーターとして追加しても問題ありません。ただし、プロジェクトをフォークすると、マージ変更をメインプロジェクトに戻すのが難しくなるかどうかを理解したいと思います。つまり、分岐によって2つのプロジェクトの同期を維持しやすくなるのではないかと思います。つまり、メインプロジェクトのバージョンとメインプロジェクトの間で分岐を行ったときに、変更をマージしてプッシュする方が簡単ですか。

回答:


279

特定のプロジェクトのコラボレーターとして登録されていないため、常にブランチを作成したり、既存のブランチをプルしてプッシュしたりすることはできません。

フォークは、GitHubサーバー側のクローンすぎません。

  • 直接押し戻す可能性なし
  • マージ要求を管理するために追加されたフォークキュー機能付き

次の方法で、フォークを元のプロジェクトと同期させます。

  • 元のプロジェクトをリモートとして追加する
  • その元のプロジェクトから定期的にフェッチする
  • 現在の開発を、そのフェッチから更新された関心のあるブランチの上にリベースします。

リベースにより、変更が単純であること(マージの競合が処理されないこと)を確認できるため、元のプロジェクトのメンテナーにパッチをプロジェクトに含めたい場合に、プルリクエストをより簡単に行うことができます。

直接参加が常に可能であるとは限らない場合でも、目標は本当にコラボレーションを可能にすることです。


GitHub側でクローンを作成するという事実は、2つの「中央」リポジトリ(「中央」は「複数の共同編集者から見える」として見える)を持っていることを意味します。1つのプロジェクトの
共同作業者として直接追加できる場合、別のプロジェクトを管理する必要はありません。フォーク付きのもの。

GitHubのフォーク

マージエクスペリエンスはほぼ同じですが、追加のレベルの間接性があります(最初にフォークを押してからプルを要求します。元のリポジトリが進化して、早送りマージが早送りされなくなるリスクがあります)。 。
つまり、正しいワークフローはgit pull --rebase upstream(アップストリームからの新しいコミットに基づいて作業をリベースする)であり、次にgit push --force origin、独自のコミットが常に元の(アップストリーム)リポジトリからのコミットの上にあるように履歴を書き換えるためです。 。

以下も参照してください。


3
私たちは社内でプロジェクトを開発しており、協力者として人を追加しても問題はありません。ただし、プロジェクトをフォークすると、変更をマージしてメインプロジェクトに戻すことが難しくなるかどうかを理解したいと思います。

7
@reprogrammer:コラボレーターを追加できる場合、フォーキングは不要です。ローカルでリベースしてからターゲットブランチにマージし、2つの中央リポジトリ(元のリポジトリとフォーク)を管理する代わりに、1つの中央リポジトリに直接プッシュできます。リベースもだいたい同じですが、フォークが関係する場合は追加の間接参照が行われます。ここでも必要ありません。回答を更新しました。
VonC、2010

14
正直なところ、必要がない場合でも、上級開発者、チームリーダー、または他の「信頼できる」人々のみが書き込み可能な神聖なリポジトリを用意することは常に良い考えです。他のすべてのチームメンバーは、フォーク(〜サンドボックス)で作業し、プルリクエストの形式で変更を提供する必要があります。DVCSがそれを可能にするので、私たちはそれを「ベストプラクティス」として適合させ、最小のプロジェクトでもこれをうまく使用します...
intland

1
あなたがより多くの「統合マネージャのワークフロー」に賛成しているので、@intlandで説明したようにstackoverflow.com/users/6309/vonc?tab=responses、その後?大企業でGitを導入したため、私は最初に集中化されたワークフローを採​​用する傾向があります(誰にとってもより馴染みのある)。その後、「統合マネージャー」のワークフローに移行します。
VonC 2012

15
私たちはフォークを「小枝」と呼ぶべきです。それらは枝から切り離され、まったく新しいツリーを開始するために使用されるからです。ちょうど私の2セント-私は樹上性のイディオムが好きです。
Eric

66

高レベルの違いは次のとおりです。

フォーク

長所

  • ユーザーごとにブランチを分離する
  • プライマリリポジトリの混乱を減らす
  • チームプロセスが外部の貢献者プロセスを反映している

短所

  • アクティブ(または非アクティブ)であるすべてのブランチを表示することをより困難にします。
  • ブランチでの共同作業はトリッキーです(フォークの所有者はその人をコラボレーターとして追加する必要があります)
  • Gitでの複数のリモートの概念を理解する必要がある
    • 追加のメンタルブックキーピングが必要
    • これにより、Gitにあまり慣れていない人にとってワークフローが難しくなります。

分岐

長所

  • プロジェクトに関して行われているすべての作業を1か所に保持
  • すべての共同編集者が同じブランチにプッシュして共同で作業できます
  • 対処するGitリモートは1つだけです

短所

  • 放棄された枝はより簡単に積み上げることができます
  • チームの貢献プロセスが外部の貢献者プロセスと一致していません
  • チームメンバーが分岐する前に、そのメンバーをコントリビューターとして追加する必要があります

「外部貢献者プロセス」とはどういう意味ですか?
Kars Barendrecht 2016年

1
@KarsBarendrecht「外部貢献者」という用語を使用するように更新されました。writeリポジトリに対する権限を持っていない人。
Aidan Feldman

45

それはGitの一般的なワークフローと関係があります。メインプロジェクトのリポジトリに直接プッシュすることはできません。GitHubプロジェクトのリポジトリがブランチベースのアクセス制御をサポートしているかどうかはわかりません。たとえば、マスターブランチにプッシュする権限を誰にも付与したくないからです。

一般的なパターンは次のとおりです。

  • 元のプロジェクトのリポジトリをフォークして独自のGitHubコピーを作成し、そこに変更をプッシュすることができます。
  • GitHubリポジトリのクローンをローカルマシンに作成する
  • 必要に応じて、元のリポジトリをローカルリポジトリの追加のリモートリポジトリとして追加します。その後、そのリポジトリで公開された変更を直接取得できます。
  • ローカルで変更と独自のコミットを行います。
  • 変更をGitHubリポジトリにプッシュします(通常、プロジェクトのリポジトリに対する直接の書き込み権限はありません)。
  • プロジェクトのメンテナに連絡して、変更を取得してレビュー/マージするよう依頼し、プロジェクトのリポジトリにプッシュバックしてもらいます(必要に応じて)。

これがなければ、公共プロジェクトがだれでも自分のコミットを直接プッシュできるようにするのは非常に珍しいことです。


@RecoJohnson、まあ...私は私の回答で「プル」という単語を使用していません(ただし、「プル」はGit用語では実質的に「フェッチ」+「マージ」です)。「プッシュ」のどの使い方が間違っていると思いますか?
ブルーノ

2
@RecoJohnson貢献者としてのGitHubフォークへのプッシュ。プロジェクトのメンテナはあなたのフォークからあなたの貢献を引き出します。
mljrg

1
オープンソースの世界では、開発チームが明確に定義されているgitを現在使用している開発チームを持つ多くの組織よりも、コラボレーターが割り当てられる可能性が低いという仮定がより当てはまると思います。これは重要な違いであり、十分な違いではないと思います。おそらく、Gitlabのような企業が企業のニーズとコントロールのニーズを理解しているために成功している理由です。
code4は、2017年

8

Forkingは既存のリポジトリから完全に新しいリポジトリを作成します(単にgitHub / bitbucketでgit cloneを実行します)

フォークは最もよく使用されます。「分割」の目的が論理的に独立したプロジェクトを作成することであり、親と再会することは決してない場合があります。

ブランチ戦略は、既存/作業リポジトリ上に新しいブランチを作成します

ブランチは最もよく使用されます。ブランチを原点とマージすることを目的として、フィーチャを処理する一時的な場所として作成される場合。

より具体的に:- オープンソースプロジェクトでは、誰がリポジトリにプッシュできるかを決定するのはリポジトリの所有者です。ただし、オープンソースの考え方は、誰でもプロジェクトに貢献できるということです。

この問題はフォークによって解決されます。開発者がオープンソースプロジェクトの何かを変更したいときはいつでも、公式リポジトリを直接複製しません。代わりに、彼らはそれをフォークしてコピーを作成します。作業が完了すると、リポジトリの所有者が変更を確認し、変更をプロジェクトにマージするかどうかを決定できるように、プルリクエストを作成します。

コアの分岐は機能分岐に似ていますが、分岐を作成する代わりにリポジトリの分岐が作成され、マージ要求を実行する代わりにプル要求を作成します。

以下のリンクは、十分に説明された方法で違いを提供します。

https://blog.gitprime.com/the-definitive-guide-to-forks-and-branches-in-git/

https://buddy.works/blog/5-types-of-git-workflows

http://www.continuousagile.com/unblock/branching.html


この回答の「最もよく使用される」ステートメントは、ブランチがオープンソースプロジェクトのようなもののために機能することを妨げる多くの問題や、現実世界でのフォークの使用方法の現実を無視しているようです。フォークをプルリクエストと組み合わせて使用​​することで、特定のリポジトリを直接変更する権限のないプロジェクトで人々が共同作業できるようにすることは非常に一般的です。
StriplingWarrior 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.