Gitフォークは実際にGitクローンですか?


817

Gitでコードをforkしていると人々が言うのをよく耳にします。Gitの「フォーク」は、Gitの「クローン」のような疑わしい音に加えて、将来のマージを忘れるという(無意味な)心理的な意欲があります。Gitにはforkコマンドはありませんよね?

GitHubは、対応をステープルで留めることにより、フォークをもう少し現実的にします。つまり、フォークボタンを押し、その後プルリクエストボタンを押すと、システムは所有者に電子メールを送信するのに十分スマートです。したがって、リポジトリの所有権と権限については、少し踊りです。

はい・いいえ?この方向にGitを拡張するGitHubに対する不安はありますか?または、機能を吸収するGitの噂はありますか?


10
ええ、それはgithubデータベースによって追跡されているクローンの一種です。
–PaŭloEbermann 2011

15
GitHubは、(GitHubの独自のサーバー上の)ストレージ要件を2倍にすることを避けるために特別なことをしていませんか?
キーストンプソン

18
まだ言及されていません:プライベートリポジトリを削除すると、そのフォークがすべて削除されます。パブリックリポジトリを削除してもフォークは保持されますが、1つのフォークが新しい親リポジトリに昇格します。上司がパブリックリポジトリをプライベートにすると、既存のフォークがすべて破壊され、プライベートリポジトリへのプルリクエストを作成できなくなります。help.github.com/articles/…–
Plato

ここでの実際のメカニズムはGitの「代替」であると私は信じています(GitHubはこれを示していないため、証明はありません)。つまり、フォークは--reference使用済みのミラークローンです。パブリックリポジトリと削除がどのように処理されるかは明確ではありません(代替をランダムに選択された昇格済みリポジトリに移動しますか?すべてのフォークを元のフォークの一部ではないいくつかの一般的な代替にポイントしますか?)代替の使用は、さまざまな観察可能な動作を説明します。
torek

回答:


925

GitHubのコンテキストでは、 ForkはGitを拡張しません。
サーバー側でのみクローンを許可します。

ローカルワークステーションでGitHubリポジトリのクローンを作成する場合、「寄稿者」として明示的に宣言しない限り、上流のリポジトリに寄稿することはできません。これは、クローンがそのプロジェクトの個別のインスタンスであるためです。プロジェクトに貢献したい場合は、フォークを使用して次のように行うことができます。

  • そのGitHubリポジトリをGitHubアカウントに複製します(つまり、「フォーク」部分、サーバー側の複製)
  • そのGitHubリポジトリへのコミットを提供します(自分のGitHubアカウントにあるため、それにプッシュするすべての権利があります)
  • 興味深い貢献を元のGitHubリポジトリに戻します(独自のGitHubリポジトリで行った変更による「プルリクエスト」の部分です)。

コラボレーティブGitHubワークフロー」も確認してください。

元のリポジトリ(アップストリームとも呼ばれる)とのリンクを保持したい場合は、その元のリポジトリを参照するリモートを追加する必要があります。
GitHubのオリジンとアップストリームの違いは何ですか?」を参照してください

フォークと上流

Git 2.20(2018年第4四半期)以降ではデルタアイランドを使用する、フォークからのフェッチがより効率的になります


6
「ローカルワークステーションにGitHubリポジトリを複製する場合、「寄稿者」として明示的に宣言されていない限り、上流のリポジトリに寄稿することはできません。」---これは「フォーク」には当てはまりませんか?説明してください。
chharvey 2013

61
@ TestSubject528491いいえ、フォークがあります。つまり、GitHubサーバー側で独自のリポとしてアップストリームリポを複製しています。次に、その「フォーク」リポジトリをコンピューター上でローカルに複製し、そのフォークの作成者および所有者であるため、自由にプッシュバックできます。
VonC 2013

9
私にとって重要な点は、投稿者であると宣言されない限り、ローカルコピーからPRを送信できないことです。私は地元のリポジトリからPRを送信することに慣れていますが、それは私が常に貢献者としてマークされているためです。それについて考えた場合、PRを送信するには、リモートリポジトリにブランチをプッシュしてから、PRを作成する必要があります。ランダムな人があなたのリポジトリにブランチを作成したくない場合は、理にかなっていると思います。そして、彼らがそれをforkし、代わりにそのようにPRを提出することを彼らに好むことを。
Adam Zerner、2016

私は別の場所で2番目の「上流」のリモートアプローチを見てきましたが、「GitHub-Original」から「GitHub-Fork」に直接プルする方が簡単ではありませんか?2番目のリモートアプローチは、私のEclipseおよびeGitセットアップでは機能しないようで、「GitHub-Fork」リポジトリにプッシュできませんでした(プッシュするものはありません)。
ウィリアムT.マラード

気にしないでください、ここの情報リンクは私にいくつかの洞察を与えました。コントリビューターとして、「GitHub-Original」から「GitHub-Fork」にプルし、次に「-Fork」からローカルマシンにプルすることは理にかなっていますが、所有者である場合、おそらく私の「-Fork」から直接プルする必要があります。 「-Original」にプッシュする前に、最初に確認、テストなどを実行します。
ウィリアムT.マラード2016

135

私は人々がgitでコードをフォークしていると言うのを聞き続けます。Gitの「フォーク」はgitの「クローン」のように疑わしく聞こえますが、将来のマージを忘れるという(無意味な)心理的な意欲もあります。gitにはforkコマンドはありませんよね?

「フォーク」は概念であり、バージョン管理システムで特にサポートされているコマンドではありません。

最も単純な分岐は分岐と同じ意味です。VCSに関係なく、ブランチを作成するたびに、「分岐」してきました。これらのフォークは通常、マージして元に戻すのがかなり簡単です。

別の当事者がコードの完全なコピーを取得して立ち去るという、あなたが話している種類のフォークは、必然的にSubversionのような集中型システムのVCSの外部で発生します。Gitのような分散型VCSは、コードベース全体を分岐し、新しいプロジェクトを効果的に開始するためのサポートがはるかに優れています。

Git(GitHubではない)は、いくつかの方法でネイティブにリポジトリ全体の「フォーク」(つまり、複製)をサポートします。

  • クローンを作成すると、リモートコールoriginが作成されます
  • デフォルトでは、クローン内のすべてのブランチがorigin同等のものを追跡します
  • フォークした元のプロジェクトから変更をフェッチしてマージするのは簡単です

Gitは、元のプロジェクトの誰かにプルするように要求する、または変更を自分にプッシュするために書き込みアクセスを要求するのと同じくらい簡単に、フォークのソースに変更を貢献します。これは、GitHubによって容易になり、標準化される部分です。

Githubがこの方向にgitを拡張していることに不安を感じている人はいますか?または、機能を吸収するgitの噂はありますか?

あなたの仮定が間違っているので不安はありません。GitHubは、Gitの分岐機能をGUIとプルリクエストを発行する標準化された方法で「拡張」しますが、Git に機能を追加しません。フルレポフォークの概念は、基本的なレベルで分散バージョン管理に組み込まれています。いつでもGitHubを放棄しても、「フォーク」したプロジェクトを引き続きプッシュ/プルできます。


6
すばらしい回答をありがとう。明確にしたいのですが、これはgithubのコンテキストの外で、X project自分のマシンにクローンを作成できること意味します。ローカルで変更を行い、オリジンへの書き込みアクセス権がない場合は、プロジェクトの作成者に電子メールでプルを要求します。彼は私のローカルクローンへのURLになるリモートと呼ばれるギデオンを作成し、彼は引っ張ることができますよね?
ギデオン2013

1
変更をプロジェクトに提供したい場合は、それらをファイルに保存して(たとえば、git format-patchを使用して)、書き込みアクセス権を持つ人への電子メールに添付するか、独自のホスティングを取得して、それに作業をプッシュすることができます。そして、例えばgit request-pullコマンドを使用して、URLを電子メールで送信します。ワークステーションのリポジトリには、通常、オンラインで直接アクセスできません。
bdsl 2016年

しかし、はい。ワークステーションがインターネット経由でプロジェクトの作成者にアクセスできる場合は、URLを送信するだけで、リモートとして追加し、プルすることができます。
bdsl 2016年

1
再:怒り、私にとって唯一のそのようなものは、クリックするためのリンクやボタンがなく、pit-from-my-repo's-perspectiveボタンを作成して、GitHubが50コミット遅れていることを通知することです。アップストリームからGitHubフォークにプルするリクエストも含めるために「プルリクエスト」という用語を使用していることを知っているので、大したことはありません。Gitは難しいです。
ウィリアムT.マラード2016

80

はい、フォークはクローンです。それは、あなたが彼らの許可なしに他人のコピーにプッシュすることができないので、現れました。彼らはあなたのためにそれのコピーを作る(フォーク)、そこにはあなたも書き込み権限があります。

将来、実際の所有者や、フォークのある他のユーザーが変更を気に入った場合は、自分のリポジトリにプルすることができます。または、「プルリクエスト」を送信することもできます。


単純にリポジトリをローカルマシンに複製し、ブランチを作成して、プルリクエストを元の所有者に送信できますか?コードの更新を容易にするためだけに、GitHub全体で複数のreposのコピーをホストするのは冗長なようです。
ケーシー

4
@Casey GitHub自体からGitHubを介してプルリクエストを送信できるだけであり、GitHubに存在するブランチからのみGitHubプルリクエストを送信できます。問題のリポジトリのコラボレーターでない場合、GitHubプルリクエストを開始できるブランチを作成する方法はありません。昔ながらの方法でメールでそれを行うことを妨げるものは何もありませんが、GitHubはその役割を果たしません。
ボーシメンセン、2015

2
@Casey、理由は通常、他の人がワークステーションにURLアクセスできないことです。GitHub forkは、GitHubサーバー上に作業のコピーが存在することを意味します。これは、あなたがpushアクセスでき、他の人がアクセスできるように他の人がアクセスできるURLですpull。これpull requestは、コピーのURL(GitHub上にあります)を取得するための標準的な方法にすぎないため、コピーをリポジトリに簡単に取り込むことができます。
ジェシーチザム2013年

これは私が信じる正しい/受け入れられた答えであるべきです。15-20人の開発者のチームがブランチを作成してオリジンにプッシュするシーンと、15-20人の開発者が同じリポジトリの独自のコピーを持ち、多くのブランチを作成して変更を加えてプッシュバックするシーンの混乱を想像してみてください。その後、元のリポジトリの作成者は、必要な変更のみをプルできます。
Kishor Pawar

37

この文脈での「フォーク」とは、「自分の変更を追加できるように、コードをコピーする」ことを意味します。他に言うことはあまりありません。すべてのクローンは本質的にフォークであり、フォークから変更をプルするかどうかを決定するのはオリジナルです。


2
具体的on the GitHub serverには、「自分の変更を追加できるように、コードのコピーを作成しますand others can have URL access to my version」。ほとんどのローカルワークステーションは、誰でもプルできるURLアクセスを提供していません。ただし、サーバーのフォークにプッシュすると、プルのURLを取得できます。
ジェシーチザム2013年

問題は、一般的なフォークに関するものではなく、GitHubフォークに関するものです。
reinierpost 2017年

26

クローニングでは、gitリポジトリのコピーをローカルマシンに作成しますが、フォークでは、リポジトリを別のリポジトリにクローニングします。クローンは個人的な使用のみを目的としています(ただし、将来のマージが発生する可能性があります)が、フォークを使用すると、新しい可能なプロジェクトパスをコピーして開きます


11

フォークは、プロジェクトに貢献することを決定したときに行われます。履歴ログとともにプロジェクト全体のコピーを作成します。このコピーは完全にリポジトリに作成され、これらの変更を行うと、プルリクエストが発行されます。これで、プルリクエストを受け入れ、変更を元のコードに組み込むのは、ソースの所有者次第です。

Git cloneは、ユーザーがソースのコピーを取得できるようにする実際のコマンドです。git clone [URL]これにより、独自のローカルリポジトリに[URL]のコピーが作成されます。


10

フォークは他のリポジトリのコピーだと思いますが、あなたのアカウントは変更されています。たとえば、ローカルで他のリポジトリを直接複製する場合、リモートオブジェクトのオリジンは、複製元のアカウントをまだ使用しています。コードをコミットして提供することはできません。コードの単なるコピーです。それ以外の場合、リポジトリをフォークすると、githubアカウントのアカウント設定の更新でリポジトリが複製されます。そして、アカウントのコンテキストでリポジトリを複製すると、コードをコミットできます。


10

ここで「フォーク」とは何かについて誤解があります。実際、フォークはユーザーごとのブランチのセットにすぎません。フォークにプッシュすると、実際には元のリポジトリにプッシュされます。これは唯一のリポジトリであるためです。

これを試すには、フォークにプッシュし、コミットを確認してから元のリポジトリに移動し、コミットIDを使用すると、コミットが元のリポジトリ内にあることがわかります。

これは非常に理にかなっていますが、明白とはほど遠いです(これを最近偶然発見しただけです)。

JohnがリポジトリSuperProjectをフォークすると、実際に発生するように見えるのは、ソースリポジトリ内のすべてのブランチが「John.master」、「John.new_gui_project」などの名前で複製されることです。

GitHubは「ジョン」を「非表示」にします。GitHubにリポジトリの「コピー」があるという幻想を私たちに与えてくれますが、私たちにはありませんし、必要でもありません。

したがって、私のフォークのブランチ「マスター」は実際には「Korporal.master」という名前ですが、GitHub UIはこれを明らかにせず、「マスター」のみを表示します。

これは、私が最近行ったことに基づいて、とにかく内部で何が起こっていると思います。そして、あなたがそれを熟考すると、非常に良いデザインです。

このため、MicrosoftがVisual Studio Team ServicesオファリングにGitフォークを実装するのは非常に簡単だと思います。


親愛なるヒュー、あなたの応答の半分は実際には正しくありません-フォークは、すべてのブランチと履歴とともに、あるユーザーアカウントから別のユーザーアカウントへのリポジトリ全体のクローンです。フォークをコミットしても、フォークした元のリポジトリは何も変わりません。しかし、「フォーク」とは何かについてのあなたの側のこれらのいくつかの誤解に加えて、いくつかの良いニュースがあります:Visual Studio Teamサービスには、「フォーク」機能が含まれています。;)
Sorin Postelnicu

1
@SorinPostelnicuソース?私はここでヒューを信じる傾向があります。これは、フォークがリポジトリの単純なクローンであることに矛盾する方法で動作するフォークの個人的な経験によるものです。たとえば、アップストリームが削除されると、フォークが削除され(OPの質問のコメントで述べたように)、プルリクエストを受け入れると、何もせずにアップストリームがフォークのブランチにマージしてしまうことがあります。
ジャガイモ

実際、これは事実であるように見えます。結局のところ、git clone誰かが「フォーク」ボタンを押すたびに、GitHubが文字通りまったく新しいリポジトリ(「ベア」リポジトリであっても)を作成するのは信じられないほど愚かです。。
グレッグA.ウッズ

7

クローンはサーバーからマシンへであり、フォークはサーバー自体にコピーを作成するという事実とは別に、重要な違いは、クローンを作成すると、実際にはすべてのブランチ、ラベルなどが取得されることです。

しかし、フォークすると、実際にはmasterブランチの現在のファイルのみが取得され、それ以外は何も取得されません。これは、他のブランチなどを取得しないことを意味します。

したがって、元のリポジトリに何かをマージする必要がある場合、それはリポジトリ間マージであり、間違いなくより高い特権が必要になります。

ForkはGitのコマンドではありません。これはGitHubが実装する概念にすぎません。Gitは、マスターコピーと同期する必要なしに、ピアツーピア環境で機能するように設計されていることを思い出してください。サーバーは別のピアですが、マスターコピーと見なします。


7
えっ?フォークはすべてのブランチを取得しますが、どこを見るかを知っている必要があります(ヒント:)git branch -a
tripleee

3

簡単に言えば、

あなたがフォークしていると言うときリポジトリいる、基本的にはGitHubアカウントのGitHub IDの下に元のリポジトリのコピーを作成しています。

そして

あなたがしていると言うときクローニングリポジトリを、あなたが直接あなたのGitHubのアカウントにコピーしなくても、お使いのシステム(PC /ノートPC)で元のリポジトリのローカルコピーを作成しています。

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