Was ist der Unterschied zwischen Forking und Cloning auf GitHub?


186

Ich würde gerne die Unterschiede zwischen einem Fork eines Projekts und einem clonedavon kennenlernen.

Kann ich Pull-Anfragen nur über GitHub senden, wenn ich ein Projekt gegabelt habe?



2
Für Leute, die hier landen und nach einer Erklärung für "Fork" mit Git suchen (nicht GitHub). Es gibt keinen "Fork" -Befehl auf Git. Es ist eher ein GitHub (nicht Git) -Konzept. Eine Unterscheidung, die leicht vergessen wird.
Ambassallo

Antworten:


113

Grundsätzlich ja. A forkist nur eine Aufforderung an GitHub, das Projekt zu klonen und unter Ihrem Benutzernamen zu registrieren . GitHub verfolgt auch die Beziehung zwischen den beiden Repositorys, sodass Sie die Commits und Pulls zwischen den beiden Projekten (und anderen Gabeln) visualisieren können.

Sie können weiterhin verlangen, dass Personen aus Ihrem geklonten Repository forkabgerufen werden , auch wenn Sie es nicht verwenden. Sie müssen sich jedoch selbst darum kümmern, es öffentlich verfügbar zu machen. Oder senden Sie den Entwicklern Patches (siehe git format-patch), die sie auf ihre Bäume anwenden können.


4
Das Aktualisieren von Gabeln erfordert viel mehr Arbeit als das Klonen. Ein Klon kann mit einem einfachen aktualisiert werden git pull. Eine Gabel nimmt mehrere Befehle auf. Und nicht überraschend, fast jede Gabel, die ich mir ansehe, ist veraltet. Gabeln sind wie das Maven-Repository-Problem bei Steroiden. Anstelle eines veralteten Repos (Maven) gibt es Tausende von ihnen (Git).
JWW

@jww klingt wie es am besten ist, einfach beim Klonen zu bleiben - warum dann Gabel verwenden?
Serup

@serup - Der Grund dafür ist, dass die gegabelte Kopie bearbeitet werden kann, git pullsodass immer noch eine Beziehung besteht. Wenn Sie die gesamte Kopie geklont haben, befindet sie sich auf Ihrem eigenen lokalen Computer und ist vom ursprünglichen Repo getrennt.
JonH

134

Wenn Sie sagen , Sie sind Forking ein Repository Sie im Grunde eine Kopie des Repository unter dem GitHub - ID erstellen. Der wichtigste Punkt, den Sie hier beachten sollten, ist, dass alle Änderungen, die am ursprünglichen Repository vorgenommen wurden, in Ihre gegabelten Repositorys übernommen werden (Sie müssen sie abrufen und neu starten). Wenn Sie jedoch Änderungen an Ihrem gegabelten Repository vornehmen, müssen Sie explizit eine Pull-Anforderung an das ursprüngliche Repository erstellen . Wenn Ihre Pull-Anforderung vom Administrator des ursprünglichen Repositorys genehmigt wurde , werden Ihre Änderungen festgeschrieben / mit der vorhandenen ursprünglichen Codebasis zusammengeführt. Bis dahin werden Ihre Änderungen nur in der von Ihnen gegabelten Kopie wiedergegeben .

Zusamenfassend:

Mit dem Fork & Pull-Modell kann jeder ein vorhandenes Repository verzweigen und Änderungen an seiner persönlichen Verzweigung vornehmen, ohne dass ein Zugriff auf das Quell-Repository erforderlich ist. Die Änderungen müssen dann vom Projektbetreuer in das Quell-Repository gezogen werden.

Beachten Sie, dass Sie nach dem Gabeln Ihr Repository (das unter Ihrem Namen) lokal auf Ihrem Computer klonen können. Nehmen Sie Änderungen daran vor und verschieben Sie sie in Ihr gegabeltes Repository. Um Ihre Änderungen im ursprünglichen Repository widerzuspiegeln, muss Ihre Pull-Anforderung jedoch genehmigt werden.

Einige andere interessante Diskussionen -

Sind Git-Gabeln tatsächlich Git-Klone?

Wie aktualisiere ich ein gegabeltes GitHub-Repository?


24
"Der wichtigste Punkt, den Sie hier beachten sollten, ist, dass alle am ursprünglichen Repository vorgenommenen Änderungen wieder in Ihre gegabelten Repositorys übernommen werden." Das ist ein bisschen irreführend, denke ich. AFAIK, Änderungen, die nach dem Fork am ursprünglichen Repository vorgenommen wurden, werden nicht automatisch im Fork wiedergegeben. Sie müssen diese Änderungen manuell verschieben. Änderungen, die vor der Gabelung vorgenommen wurden, werden in die neue Gabelung kopiert, wenn Sie auf die Gabelschaltfläche klicken.
Ajedi32

"Alle am ursprünglichen Repository vorgenommenen Änderungen werden wieder in Ihre gegabelten Repositorys übernommen." .. wirklich ?? Nicht automatisch hoffe ich
KansaiRobot

Ich habe für ein Kundenprojekt gearbeitet und das Klon- und Push-Modell für die Arbeit verwendet. Eines Tages gabelte ich es und bekam sofort eine Nachricht, was die Notwendigkeit ist, das komplette Repo zu teilen. Ich verstehe wirklich nicht, wie das als falsch angesehen wird.
user3075740

Änderungen, die nach der Abzweigung am ursprünglichen Repository vorgenommen wurden, werden nicht automatisch in der Abzweigung übernommen. Überprüfen Sie dazu Schritt 3 dieses Blogs: - help.github.com/articles/fork-a-repo
Suhas Chikkanna

"Alle am ursprünglichen Repository vorgenommenen Änderungen werden wieder in Ihre gegabelten Repositorys übernommen." - Meinst du, dass dies nach dem Klonen nicht möglich ist?
Variable

26
  • Das gegabelte Projekt befindet sich in Ihrem Online-Repository (Repo).
  • Das geklonte Projekt befindet sich auf Ihrem lokalen Computer (ich klone normalerweise nach dem Verzweigen des Repos).

Sie können sich auf Ihr Online-Repo festlegen (oder auf Ihr lokales Repo festlegen und dann auf Ihr Online-Repo übertragen) und dann eine Pull-Anfrage senden.

Der Projektmanager kann dies akzeptieren, um Ihre Änderungen in seiner Online-Hauptversion zu erhalten.


13

Bei einem Klon werden zwei (möglicherweise unterschiedliche) Versionen eines Repositorys ordnungsgemäß dupliziert und zwischen diesen getrennt. Wenn ein Repo geändert wird, muss der neue Inhalt mit einem Push-Befehl aktiv in das andere Repo kopiert werden. Und Änderungen im anderen Repo abgerufen.

Wenn Sie ein Repo auf einem Server teilen, müssen Sie keine Inhalte duplizieren, da beide Repos denselben [festen Objekt] Inhalt von demselben Server verwenden. Der "Trick" besteht darin, die verschiedenen Benutzeransichten so zu verwalten, dass jeder Benutzer glaubt, eine vollständige persönliche Kopie des Repos zu haben. Durch Drücken und Abrufen zwischen Gabeln werden lediglich die Zeiger des Benutzers aktualisiert.

Auf einer niedrigeren Ebene macht git intern dasselbe. Wenn Sie drei verschiedene Dateien haben, die jeweils enthalten Hello World, "gabelt" git einfach seine einzelne Kopie des Hello World-Blobs und bietet sie nach Bedarf an jeder der drei Stellen an.

Die Möglichkeit, den Server zu verzweigen, bedeutet, dass Githubs große Speicherkapazität im Durchschnitt nicht so groß ist, da jeder Körper das einzige zugrunde liegende Repo teilt.


5

Kurz gesagt, Forking ist vielleicht dasselbe wie "Klonen unter Ihrer GitHub-ID / Ihrem GitHub-Profil". Eine Gabel ist mit wenigen Ausnahmen natürlich immer besser als ein Klon. Das gegabelte Repository wird im Gegensatz zu einem geklonten Repository immer überwacht / mit dem ursprünglichen Repository verglichen. Auf diese Weise können Sie die Änderungen verfolgen, Pull-Anforderungen initiieren und die im ursprünglichen Repository vorgenommenen Änderungen manuell mit Ihrem gegabelten Repository synchronisieren.


5

Während @ AniketThakur Antwort ist sehr gut. Die folgende Frage hat noch niemand beantwortet.

Kann ich Pull-Anfragen nur über GitHub senden, wenn ich ein Projekt gegabelt habe?

Nein. Wenn Sie einen Beitrag zu einem Repository leisten, können Sie: einen lokalen Klon erstellen. Machen Sie eine lokale Niederlassung. Fügen Sie diesem Zweig Commits hinzu. Schieben Sie den lokalen Zweig zurück zu Github (erstellen Sie dabei einen Remote-Zweig). Stellen Sie eine Pull-Anforderung, um die Zusammenführung dieses Zweigs mit dem Hauptzweig (oder einem beliebigen Zweig) anzufordern.


3

Wenn Sie das getan haben, was der Fragesteller angedeutet hat (vergessen, ein Repo zu teilen und nur lokal geklont, Änderungen vorgenommen und jetzt eine Pull-Anfrage stellen müssen), können Sie wieder auf Kurs kommen:

  1. Fork das Repo, an das Sie eine Pull-Anfrage senden möchten
  2. Übertragen Sie Ihre lokalen Änderungen auf Ihre Fernbedienung
  3. Pull-Anfrage ausgeben

2

Ein weiterer seltsamer subtiler Unterschied bei GitHub ist, dass Änderungen an Gabeln nicht in Ihrem Aktivitätsprotokoll gezählt werden, bis Ihre Änderungen in das ursprüngliche Repo übernommen wurden. Um eine Gabel in einen richtigen Klon zu verwandeln, müssen Sie sich anscheinend an den Github-Support wenden.

Von Warum werden meine Beiträge nicht angezeigt :

Commit wurde in einer Gabel gemacht

In einer Gabelung eingegangene Verpflichtungen werden nicht auf Ihre Beiträge angerechnet. Damit sie zählen, müssen Sie einen der folgenden Schritte ausführen:

Öffnen Sie eine Pull-Anforderung , damit Ihre Änderungen im übergeordneten Repository zusammengeführt werden. Wenden Sie sich an den GitHub-Support, um die Gabel zu entfernen und sie in ein eigenständiges Repository auf GitHub umzuwandeln . Wenn der Fork über eigene Gabeln verfügt, teilen Sie dem Support mit, ob die Gabeln mit Ihrem Repository in ein neues Netzwerk verschoben werden sollen oder im aktuellen Netzwerk verbleiben sollen. Weitere Informationen finden Sie unter "Informationen zu Gabeln ".


2

Kurz gesagt, "fork" erstellt eine Kopie des Projekts, das auf Ihrem eigenen GitHub-Konto gehostet wird.

"Clone" verwendet Git-Software auf Ihrem Computer, um den Quellcode und den gesamten Versionsverlauf auf diesen Computer herunterzuladen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.