Forking vs. Branching in GitHub

278

Ich möchte mehr über die Vor- und Nachteile des Verzweigens eines Github-Projekts im Vergleich zum Erstellen eines Zweigs eines Github-Projekts erfahren.

Durch das Forken ist meine Version des Projekts stärker von der ursprünglichen Version isoliert, da ich nicht auf der Liste der Mitarbeiter des ursprünglichen Projekts stehen muss. Da wir ein Projekt im eigenen Haus entwickeln, ist es kein Problem, Mitarbeiter als Mitarbeiter hinzuzufügen. Wir möchten jedoch verstehen, ob das Verzweigen eines Projekts das Zusammenführen von Änderungen am Hauptprojekt erschweren würde. Das heißt, ich frage mich, ob die Verzweigung die Synchronisierung der beiden Projekte erleichtert. Mit anderen Worten, ist es einfacher, Änderungen zwischen meiner Version des Hauptprojekts und dem Hauptprojekt zusammenzuführen und zu verschieben, wenn ich verzweige?

Umprogrammierer
quelle

Antworten:

279

Sie können nicht immer eine Verzweigung erstellen oder eine vorhandene Verzweigung abrufen und zu dieser zurückschieben, da Sie nicht als Mitarbeiter für dieses bestimmte Projekt registriert sind.

Forking ist nichts anderes als ein Klon auf der GitHub-Serverseite :

  • ohne die Möglichkeit, direkt zurückzudrücken
  • mit Gabelwarteschlangenfunktion hinzugefügt, um die Zusammenführungsanforderung zu verwalten

Sie halten eine Gabelung mit dem Originalprojekt synchron, indem Sie:

  • Hinzufügen des ursprünglichen Projekts als Fernbedienung
  • regelmäßig von diesem ursprünglichen Projekt abrufen
  • Stellen Sie Ihre aktuelle Entwicklung auf den Zweig des Interesses zurück, den Sie von diesem Abruf aktualisiert haben.

Mit der Rebase können Sie sicherstellen, dass Ihre Änderungen unkompliziert sind (kein Zusammenführungskonflikt zu behandeln), was Ihre Pulling-Anforderung einfacher macht, wenn der Betreuer des ursprünglichen Projekts Ihre Patches in sein Projekt aufnehmen soll.

Das Ziel ist wirklich, die Zusammenarbeit zu ermöglichen, obwohl eine direkte Teilnahme nicht immer möglich ist.


Die Tatsache, dass Sie auf der GitHub-Seite klonen, bedeutet, dass Sie jetzt zwei "zentrale" Repositorys haben ("zentral" als "von mehreren Mitarbeitern sichtbar").
Wenn Sie sie direkt als Mitarbeiter für ein Projekt hinzufügen können , müssen Sie kein anderes verwalten einer mit einer Gabel.

Gabel auf GitHub

Das Zusammenführungserlebnis wäre ungefähr das gleiche, jedoch mit einer zusätzlichen Indirektionsebene (zuerst auf die Gabel drücken und dann nach einem Zug fragen, wobei das Risiko von Entwicklungen im ursprünglichen Repo besteht, sodass Ihre Schnellvorlauf-Zusammenführungen nicht mehr schnell vorspulen). .
Das bedeutet, dass der richtige Workflow darin besteht, git pull --rebase upstream(Ihre Arbeit auf neue Commits von Upstream neu zu gründen) und danngit push --force origin , um den Verlauf so umzuschreiben, Ihre eigenen Commits immer über den Commits aus dem ursprünglichen (Upstream-) Repo zu stehen .

Siehe auch:

VonC
quelle
3
Wir entwickeln ein Projekt im eigenen Haus und es ist kein Problem, Mitarbeiter als Mitarbeiter hinzuzufügen. Wir möchten jedoch verstehen, ob das Verzweigen eines Projekts das Zusammenführen von Änderungen zum Hauptprojekt erschweren würde.
Reprogrammierer
7
@reprogrammer: Wenn Sie Mitarbeiter hinzufügen können, ist kein Forking erforderlich. Sie können lokal neu basieren, dann auf dem Zielzweig zusammengeführt und dann direkt zu einem zentralen Repo verschoben werden , anstatt zwei zentrale Repos (das ursprüngliche und die Gabelung) verwalten zu müssen. Die Rebase wäre ungefähr gleich, aber mit einer zusätzlichen Indirektion, wenn eine Gabel beteiligt ist. Wieder: hier nicht benötigt. Ich habe meine Antwort aktualisiert.
VonC
14
Ehrlich gesagt, auch wenn Sie es nicht müssen, ist es immer eine gute Idee, ein heiliges Repo zu haben, das nur für leitende Entwickler, Teamleiter oder andere "vertrauenswürdige" Personen beschreibbar ist . Alle anderen Teammitglieder sollten in ihren Gabeln (~ Sandboxen) arbeiten und ihre Änderungen in Form einer Pull-Anfrage einbringen. Da DVCS dies ermöglicht, haben wir es als "Best Practice" angepasst und dies auch in kleinsten Projekten erfolgreich eingesetzt ...
Intland
1
@intland Sie sind also eher für einen "Integration-Manager-Workflow", wie unter stackoverflow.com/users/6309/vonc?tab=responses beschrieben ? Nachdem ich Git in einem großen Unternehmen eingeführt habe, tendiere ich dazu, zuerst einen zentralisierten Workflow zu verwenden (der allen besser bekannt ist), bevor ich zu einem "Integration-Manager" übergehe.
VonC
15
Wir sollten Gabeln "Zweige" nennen, da sie von einem Ast abgebrochen sind und dazu dienen, einen ganz neuen Baum zu beginnen. Nur meine zwei Cent - ich mag die Baumsprache.
Eric
66

Hier sind die allgemeinen Unterschiede:

Gabeln

Vorteile

  • Hält Zweige nach Benutzer getrennt
  • Reduziert die Unordnung im primären Repository
  • Ihr Teamprozess spiegelt den Prozess der externen Mitarbeiter wider

Nachteile

  • Erschwert das Anzeigen aller aktiven (oder inaktiven) Zweige.
  • Die Zusammenarbeit in einem Zweig ist schwieriger (der Gabelbesitzer muss die Person als Mitarbeiter hinzufügen).
  • Sie müssen das Konzept mehrerer Fernbedienungen in Git verstehen
    • Erfordert zusätzliche mentale Buchhaltung
    • Dies erschwert den Workflow für Leute, die mit Git nicht besonders vertraut sind

Verzweigung

Vorteile

  • Hält alle Arbeiten rund um ein Projekt an einem Ort
  • Alle Mitarbeiter können sich an denselben Zweig wenden, um daran zusammenzuarbeiten
  • Es gibt nur eine Git-Fernbedienung

Nachteile

  • Äste, die verlassen werden, können sich leichter stapeln
  • Ihr Teambeitragsprozess stimmt nicht mit dem externen Beitragsprozess überein
  • Sie müssen Teammitglieder als Mitwirkende hinzufügen, bevor sie verzweigen können
Aidan Feldman
quelle
Was ist mit "dem Prozess der externen Mitwirkenden" gemeint?
Kars Barendrecht
1
@KarsBarendrecht Aktualisiert, um den Begriff "externer Mitwirkender" zu verwenden. Jemand, der keine writeBerechtigungen für das Repository hat.
Aidan Feldman
45

Es hat mit dem allgemeinen Workflow von Git zu tun. Es ist unwahrscheinlich, dass Sie direkt in das Repository des Hauptprojekts wechseln können. Ich bin mir nicht sicher, ob das Repository des GitHub-Projekts eine verzweigungsbasierte Zugriffssteuerung unterstützt, da Sie beispielsweise niemandem die Berechtigung erteilen möchten, auf den Hauptzweig zu pushen.

Das allgemeine Muster ist wie folgt:

  • Verzweigen Sie das Repository des Originalprojekts in eine eigene GitHub-Kopie, in die Sie dann Änderungen übertragen können.
  • Klonen Sie Ihr GitHub-Repository auf Ihren lokalen Computer
  • Fügen Sie optional das ursprüngliche Repository als zusätzliches Remote-Repository in Ihrem lokalen Repository hinzu. Sie können dann Änderungen, die in diesem Repository veröffentlicht wurden, direkt abrufen.
  • Nehmen Sie Ihre Änderungen und Ihre eigenen Commits vor Ort vor.
  • Übertragen Sie Ihre Änderungen in Ihr GitHub-Repository (da Sie im Allgemeinen nicht direkt über die Schreibberechtigungen für das Projekt-Repository verfügen).
  • Wenden Sie sich an die Projektbetreuer, und bitten Sie sie, Ihre Änderungen abzurufen und zu überprüfen / zusammenzuführen. Lassen Sie sie dann in das Projekt-Repository zurückkehren (wenn Sie und sie dies möchten).

Ohne dies ist es für öffentliche Projekte ziemlich ungewöhnlich, dass jemand seine eigenen Verpflichtungen direkt durchsetzen kann.

Bruno
quelle
@RecoJohnson, na ja ... Ich habe das Wort "pull" in meiner Antwort nicht verwendet (aber "pull" ist in Git-Begriffen effektiv "fetch" + "merge"). Welche Verwendung von "Push" ist Ihrer Meinung nach falsch?
Bruno
2
@RecoJohnson Sie als Mitwirkender drücken auf Ihre GitHub-Gabel; Die Projektbetreuer ziehen Ihren Beitrag von Ihrer Gabel.
mljrg
1
Ich denke, die Annahme, dass Ihnen wahrscheinlich kein Mitarbeiter zugewiesen wird, trifft in der Open Source-Welt mehr zu als in vielen Organisationen, in denen Entwicklungsteams jetzt git verwenden, wo das Entwicklungsteam gut definiert ist. Ich denke, dies ist eine wichtige Unterscheidung, die nicht genug getroffen werden muss, wahrscheinlich, warum Unternehmen wie gitlab florieren, weil sie die Bedürfnisse des Unternehmens und die Notwendigkeit von Kontrollen verstehen.
Code4Cause
8

Forking erstellt ein völlig neues Repository aus dem vorhandenen Repository (einfach git clone auf gitHub / bitbucket)

Gabeln werden am besten verwendet: Wenn die Absicht des "Split" darin besteht, ein logisch unabhängiges Projekt zu erstellen, das möglicherweise nie wieder mit seinem übergeordneten Projekt zusammengeführt wird.

Die Zweigstellenstrategie erstellt einen neuen Zweig über dem vorhandenen / funktionierenden Repository

Zweige werden am besten verwendet: Wenn sie als temporäre Orte zum Durcharbeiten eines Features erstellt werden, mit der Absicht, den Zweig mit dem Ursprung zusammenzuführen.

Spezifischer: - In Open Source-Projekten entscheidet der Eigentümer des Repositorys, wer in das Repository pushen kann. Die Idee von Open Source ist jedoch, dass jeder zum Projekt beitragen kann.

Dieses Problem wird durch Gabeln gelöst: Jedes Mal, wenn ein Entwickler etwas in einem Open Source-Projekt ändern möchte, klont er das offizielle Repository nicht direkt. Stattdessen gabeln sie es, um eine Kopie zu erstellen. Wenn die Arbeit abgeschlossen ist, stellen sie eine Pull-Anforderung, damit der Eigentümer des Repositorys die Änderungen überprüfen und entscheiden kann, ob sie mit seinem Projekt zusammengeführt werden sollen.

Im Kern ähnelt das Forking dem Verzweigen von Features, aber anstatt Zweige zu erstellen, wird ein Fork des Repositorys erstellt, und anstatt eine Zusammenführungsanforderung auszuführen, erstellen Sie eine Pull-Anforderung.

Die folgenden Links geben den Unterschied auf gut erläuterte Weise wieder:

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

Wer bin ich
quelle
Die "am besten verwendeten" Aussagen in dieser Antwort scheinen viele der Probleme zu ignorieren, die verhindern, dass Verzweigungen für Dinge wie Open-Source-Projekte funktionieren, sowie die Realität, wie Gabeln in der realen Welt verwendet werden. Es kommt sehr häufig vor, dass Gabeln in Verbindung mit Pull-Anforderungen verwendet werden, damit Benutzer an einem Projekt zusammenarbeiten können, für das nicht alle die Berechtigung haben, ein bestimmtes Repository direkt zu ändern.
StriplingWarrior