849

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

GitHub は、フォークに対応を留めることで、フォークをもう少しリアルにします。つまり、フォーク ボタンを押した後、プル リクエスト ボタンを押すと、システムはスマートに所有者にメールを送信します。そのため、リポジトリの所有権とパーミッションをめぐるちょっとしたダンスです。

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

4

10 に答える 10

955

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

ローカル ワークステーションで GitHub リポジトリのクローンを作成すると、「貢献者」として明示的に宣言されない限り、アップストリーム リポジトリに貢献することはできません。これは、クローンがそのプロジェクトの別のインスタンスであるためです。プロジェクトに貢献したい場合は、次の方法で fork を使用できます。

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

「共同GitHubワークフロー」もチェックしてください。

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

フォークと上流

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

于 2011-06-09T00:37:30.077 に答える
142

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

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

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

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

Git (GitHub ではありません) は、いくつかの方法でリポジトリ全体の「フォーク」(つまり、クローン作成) をネイティブにサポートしています。

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

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

Github が git をこの方向に拡張することに対する懸念はありますか? または、git が機能を吸収するという噂はありますか?

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

于 2011-06-09T15:59:14.240 に答える
84

はい、フォークはクローンです。許可なく他人のコピーにプッシュすることはできないため、これが発生しました。彼らはあなたのためにそれのコピーを作成し(fork)、書き込み許可も持っています。

将来、実際の所有者またはあなたのようなフォークを持つ他のユーザーが変更を行った場合、彼らはそれを自分のリポジトリに戻すことができます。または、「プルリクエスト」を送信することもできます。

于 2011-06-09T21:12:43.730 に答える
39

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

于 2011-06-08T23:51:58.020 に答える
27

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

于 2011-06-09T00:24:57.017 に答える
11

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

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

于 2014-06-11T18:40:02.073 に答える
11

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

于 2013-06-04T19:30:37.690 に答える
11

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

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

これは非常に理にかなっていますが、明らかではありません (最近偶然発見しただけです)。

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

GitHub は「John」を「隠します」。私たちから、GitHub にリポジトリの独自の「コピー」があるという錯覚を与えてくれますが、必要もありませんし、必要もありません。

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

これは、私が最近行ってきたことに基づいて、とにかくボンネットの下で起こっていると思うことのほとんどであり、あなたがそれを熟考すると、非常に良いデザインです.

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

于 2017-08-26T18:38:05.307 に答える
5

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

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

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

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

于 2015-04-23T05:51:32.143 に答える