web-dev-qa-db-ja.com

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

Gitのコードを偽造していると人々が言うのを耳にしています。 Gitの "fork"は、Gitの "clone"と、将来のマージを見送るという(無意味な)心理的な意欲のように疑わしく聞こえます。 Gitにはforkコマンドはありませんね。

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

はい・いいえ?この方向にGitを拡張するGitHubに対する不安はありますか?それともGitが機能を吸収しているという噂はありますか?

776
Brian

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

ローカルワークステーションでGitHubリポジトリを複製するとき、明示的に "contributor"として宣言されていない限り、上流のリポジトリに貢献することはできません。それはあなたのクローンがそのプロジェクトの別のインスタンスだからです。もしあなたがプロジェクトに貢献したいのなら、次のようにしてフォークすることができます。

  • あなたのGitHubアカウントにそのGitHubレポジトリを複製します(つまり、 "fork"部分 、サーバー側の複製)。
  • そのGitHubリポジトリへのコミットを投稿してください(それはあなた自身のGitHubアカウントにあるので、あなたはそれにプッシュするあらゆる権利を持っています)
  • オリジナルのGitHubレポジトリへの興味深い投稿を知らせましょう(それはあなた自身のGitHubレポジトリで行った変更によって"pull request" partです)

" Collaborative GitHub Workflow "もチェックしてください。

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

fork and upstream

そしてGit 2.20(Q4 2018)以降では、フォークからのフェッチがより効率的になります。 delta islands の場合。

882
VonC

私は人々が彼らがgitでコードをフォークしていると言うのを聞き続けます。 Gitの "fork"はgitの "clone"に加えて将来のマージを見送るという(無意味な)心理的な意欲のように疑わしく聞こえます。 gitにはforkコマンドがありませんね。

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

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

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

Git(GitHubではありません)は、いくつかの方法でリポジトリ全体の "フォーク"(つまり複製)をサポートしています。

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

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

この方向にGitを拡張するGithubに対する不安はありますか?それともgitが機能を吸収するという噂はありますか?

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

130
meagar

はい、フォークはクローンです。 あなたは彼らの許可なしに他人のコピーにプッシュすることはできません 。彼らはあなたのためにそれの copy を作ります( fork )、そこにはあなたも書き込み許可を持つでしょう。

将来的には、実際の所有者や他のユーザーがあなたの変更のようなフォークを持っている場合は、自分のリポジトリに戻すことができます。あるいは、あなたは彼らに "pull-request"を送ることができます。

77
ssapkota

この文脈での「フォーク」とは、「自分で変更を加えることができるように、それらのコードのコピーを作成する」という意味です。他に言うことはありません。すべてのクローンは本質的にフォークであり、変更をフォークから引き出すかどうかは、元のものに任されています。

37
Daenyth

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

25
Sam Johnson

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

10
Daniel Shen

あなたが何らかのプロジェクトに貢献することに決めたときに分岐が行われます。あなたはその履歴ログと共にプロジェクト全体のコピーを作成するでしょう。このコピーは完全にあなたのリポジトリの中で作られ、あなたがこれらの変更を加えると、あなたはpull requestを発行します。プルリクエストを受け入れて変更を元のコードに組み込むのは、ソースの所有者次第です。

Git cloneはユーザーがソースのコピーを入手することを可能にする実際のコマンドです。 git clone [URL]これはあなた自身のローカルリポジトリに[URL]のコピーを作成するはずです。

10
aliasav

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

しかし、フォークすると、実際には現在のファイルをマスターブランチに取得するだけです。それ以外の何もありません。これは他の枝などが手に入らないことを意味します。

したがって、元のリポジトリにマージして戻す必要がある場合は、リポジトリ間のマージであり、より高い権限が必要になります。

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

7
Deepak G M

ここで「フォーク」とは何かについて誤解があります。フォークは、実際にはユーザーごとのブランチの集合にすぎません。あなたがフォークにプッシュするとき、あなたは実際にオリジナルのリポジトリにプッシュします。それはそれが唯一のリポジトリなのでです。

これを試すには、フォークにプッシュし、コミットに注意してから元のリポジトリに移動し、コミットIDを使用します。コミットが元のリポジトリに「入って」いることがわかります。

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

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

GitHubは「ジョン」を「隠し」ます。私たちからのもので、私たちがGitHub上に私たち自身のリポジトリの「コピー」を持っているような錯覚を私たちに与えていますが、私たちは必要ではないし、必要でさえありません。

だから私のフォークのブランチ "master"は実際には "Korporal.master"と名付けられていますが、GitHub UIはこれを決して明らかにせず、私には "master"だけを示しています。

これは私が最近やっていることに基づいてとにかく私がフードの下で進行していると思うことのほとんどであり、あなたがそれを熟考するとき、とても良いデザインです。

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

5
Hugh

簡単に言えば、

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

そして

あなたが クローン作成 リポジトリであると言うとき、あなたはあなたのGitHubアカウントにコピーを持っていないであなたのシステム(PC /ラップトップ)に直接オリジナルのリポジトリのローカルコピーを作成しています。

3
anoNewb