web-dev-qa-db-ger.com

Sind Git-Gabeln tatsächlich Git-Klone?

Ich höre immer wieder Leute sagen, dass sie Code in Git eingeben. Git "fork" klingt misstrauisch wie Git "clone" plus eine (bedeutungslose) psychologische Bereitschaft, auf zukünftige Zusammenschlüsse zu verzichten. Es gibt keinen Fork-Befehl in Git, oder?

GitHub macht Gabeln realistischer, indem Korrespondenz darauf geheftet wird. Das heißt, Sie drücken den Gabelknopf und später, wenn Sie den Pull-Request-Knopf drücken, ist das System intelligent genug, um dem Eigentümer eine E-Mail zu senden. Daher geht es ein wenig um das Eigentum und die Berechtigungen von Repositorys.

Ja Nein? Hat GitHub Angst davor, Git in diese Richtung auszudehnen? Oder irgendwelche Gerüchte darüber, dass Git die Funktionalität in sich aufnimmt?

787
Brian

Fork erweitert Git im GitHub-Kontext nicht.
Es erlaubt nur das Klonen auf der Serverseite.

Wenn Sie ein GitHub-Repository auf Ihrer lokalen Workstation klonen, können Sie nur dann einen Beitrag zum Upstream-Repository leisten, wenn Sie ausdrücklich als "Contributor" deklariert sind. Das liegt daran, dass Ihr Klon eine separate Instanz dieses Projekts ist. Wenn Sie zu dem Projekt beitragen möchten, können Sie forking folgendermaßen verwenden:

  • klonen Sie dieses GitHub-Repository auf Ihrem GitHub-Konto (das ist der "fork" -Teil , ein Klon auf der Serverseite)
  • tragen Sie Commits zu diesem GitHub-Repository bei (es befindet sich in Ihrem eigenen GitHub-Konto, sodass Sie das Recht haben, darauf zu pushen).
  • über die von Ihnen vorgenommenen Änderungen können Sie interessante Beiträge an das ursprüngliche GitHub-Repository (dh den Teil "Pull Request" zurücksenden auf Ihrem eigenen GitHub-Repository gemacht)

Überprüfen Sie auch " Collaborative GitHub Workflow ".

Wenn Sie eine Verknüpfung mit dem ursprünglichen Repository (auch als Upstream bezeichnet) beibehalten möchten, müssen Sie ein Remote-Verzeichnis hinzufügen, das auf das ursprüngliche Repository verweist.
Siehe " Was ist der Unterschied zwischen Origin und Upstream auf GitHub? "

fork and upstream

Ab Git 2.20 (Q4 2018) ist das Abrufen von Fork effizienter. mit Delta Islands .

900
VonC

Ich höre immer wieder Leute sagen, sie gaben Code in git. Git "fork" klingt verdächtig nach Git "clone" plus einer (bedeutungslosen) psychologischen Bereitschaft, auf zukünftige Zusammenschlüsse zu verzichten. Es gibt keinen Fork-Befehl in Git, oder?

"Forking" ist ein Konzept, das von keinem Versionskontrollsystem speziell unterstützt wird.

Die einfachste Art des Gabelns ist gleichbedeutend mit Verzweigen. Jedes Mal, wenn Sie einen Zweig erstellen, unabhängig von Ihrem VCS, haben Sie "gegabelt". Diese Gabeln lassen sich normalerweise leicht wieder zusammenfügen.

Die Art von Fork, von der Sie sprechen, bei der eine separate Partei eine vollständige Kopie des Codes nimmt und weggeht, geschieht zwangsläufig außerhalb des VCS in einem zentralisierten System wie Subversion. Ein verteiltes VCS wie Git bietet eine viel bessere Unterstützung für das Aufteilen der gesamten Codebasis und das effektive Starten eines neuen Projekts.

Git (nicht GitHub) unterstützt nativ das "Forken" eines gesamten Repos (dh das Klonen) auf verschiedene Arten:

  • wenn Sie klonen, wird eine Fernbedienung namens Origin für Sie erstellt
  • standardmäßig verfolgen alle Zweige im Klon ihre Origin Äquivalente
  • das Abrufen und Zusammenführen von Änderungen aus dem ursprünglichen Projekt, aus dem Sie die Abzweigung vorgenommen haben, ist ganz einfach

Mit Git können Sie einfach Änderungen an der Quelle des Fork zurückgeben, indem Sie jemanden aus dem ursprünglichen Projekt auffordern, sie von Ihnen abzurufen, oder Schreibzugriff auf Push-Änderungen anfordern. Dies ist der Teil, den GitHub vereinfacht und standardisiert.

Hast du Angst vor Github, der sich in diese Richtung erstreckt? Oder irgendwelche Gerüchte darüber, dass der Schwachsinn die Funktionalität absorbiert?

Es gibt keine Angst, weil Ihre Annahme falsch ist. GitHub "erweitert" die Forking-Funktionalität von Git mit einer netten GUI und einer standardisierten Methode zum Ausgeben von Pull-Anfragen, aber es tut nicht add die Funktionalität von Git. Das Konzept des Full-Repo-Forkings ist grundlegend in die verteilte Versionskontrolle eingeflossen. Sie können GitHub jederzeit verlassen und weiterhin Push/Pull-Projekte ausführen, die Sie "gegabelt" haben.

132
meagar

Ja, fork ist ein Klon. Es ist entstanden, weil Sie können nicht ohne deren Erlaubnis auf die Kopien anderer pushen. Sie machen eine Kopie davon für Sie ( Gabel ), wo Sie auch Schreibberechtigung haben.

Zukünftig können der tatsächliche Eigentümer oder andere Benutzer mit einem Zweig wie Ihren Änderungen diesen in ihr eigenes Repository zurückziehen. Alternativ können Sie ihnen eine "Pull-Anfrage" senden.

78
ssapkota

"Fork" bedeutet in diesem Zusammenhang "Kopie des Codes erstellen, damit ich meine eigenen Änderungen hinzufügen kann". Es gibt nicht viel zu sagen. Jeder Klon ist im Wesentlichen eine Gabel, und es liegt am Original, zu entscheiden, ob die Änderungen aus der Gabel gezogen werden sollen.

37
Daenyth

Beim Klonen wird eine Kopie des Git-Repositorys auf einem lokalen Computer erstellt, während beim Forken das Repository in ein anderes Repository geklont wird. Das Klonen ist nur für den persönlichen Gebrauch bestimmt (obwohl zukünftige Zusammenführungen auftreten können), aber mit dem Verzweigen kopieren Sie und öffnen einen neuen möglichen Projektpfad

26
Sam Johnson

Ich denke, Fork ist eine Kopie eines anderen Repositorys, aber mit Ihrer Kontoänderung. Wenn Sie beispielsweise ein anderes Repository direkt lokal klonen, verwendet das Remote-Objekt Origin weiterhin das Konto, von dem Sie klonen. Sie können Ihren Code nicht festschreiben und beitragen. Es ist nur eine reine Kopie von Codes. Andernfalls, wenn Sie ein Repository verzweigen, wird das Repository mit der Aktualisierung Ihrer Kontoeinstellungen in Ihrem Github-Konto geklont. Und dann das Repo im Kontext Ihres Kontos klonen, können Sie Ihre Codes festschreiben.

10
Daniel Shen

Das Verzweigen erfolgt, wenn Sie sich dazu entschließen, zu einem Projekt beizutragen. Sie würden eine Kopie des gesamten Projekts zusammen mit den Verlaufsprotokollen erstellen. Diese Kopie wird vollständig in Ihrem Repository erstellt. Sobald Sie diese Änderungen vorgenommen haben, geben Sie eine Pull-Anforderung aus. Nun obliegt es dem Eigentümer der Quelle, Ihre Pull-Anfrage zu akzeptieren und die Änderungen in den Originalcode zu übernehmen.

Git-Klon ist ein tatsächlicher Befehl, mit dem Benutzer eine Kopie der Quelle abrufen können. git clone [URL] Dies sollte eine Kopie von [URL] in Ihrem eigenen lokalen Repository erstellen.

10
aliasav

Abgesehen von der Tatsache, dass das Klonen vom Server auf Ihren Computer erfolgt und das Kopieren eine Kopie auf dem Server selbst erstellt, besteht ein wichtiger Unterschied darin, dass wir beim Klonen tatsächlich alle Zweige, Etiketten usw. erhalten.

Aber wenn wir verzweigen, erhalten wir tatsächlich nur die aktuellen Dateien im Master-Zweig, nichts anderes als das. Das bedeutet, dass wir die anderen Zweige usw. nicht bekommen.

Wenn Sie also etwas mit dem ursprünglichen Repository zusammenführen müssen, handelt es sich um eine Zusammenführung zwischen Repositorys, für die auf jeden Fall höhere Berechtigungen erforderlich sind.

Fork ist kein Befehl in Git; Es ist nur ein Konzept, das GitHub implementiert. Denken Sie daran, Git wurde für die Arbeit in einer Peer-to-Peer-Umgebung entwickelt, ohne dass die Inhalte mit einer Masterkopie synchronisiert werden müssen. Der Server ist nur ein weiterer Peer, aber wir betrachten ihn als Masterkopie.

7
Deepak G M

Es gibt hier ein Missverständnis in Bezug darauf, was eine "Gabel" ist. Eine Abzweigung ist in der Tat nichts anderes als eine Reihe von Zweigen pro Benutzer. Wenn Sie an eine Abzweigung pushen, tun Sie dies tatsächlich, indem Sie auf das ursprüngliche Repository pushen, da dies das EINZIGE Repository ist.

Sie können dies ausprobieren, indem Sie auf einen Zweig drücken, das Commit notieren und dann zum ursprünglichen Repository gehen und die Commit-ID verwenden. Sie werden feststellen, dass das Commit im ursprünglichen Repository "in" ist.

Das macht sehr viel Sinn, ist aber alles andere als offensichtlich (ich habe das erst kürzlich aus Versehen entdeckt).

Wenn John das Repository SuperProject gabelt, scheint es tatsächlich so zu sein, dass alle Zweige im Quell-Repository mit einem Namen wie "John.master", "John.new_gui_project" usw. repliziert werden.

GitHub "versteckt" den "John". von uns und gibt uns die Illusion, wir hätten eine eigene "Kopie" des Repositorys auf GitHub, aber wir brauchen und brauchen keine.

Der Zweig "master" meiner Gabel heißt also eigentlich "Korporal.master", aber die GitHub-Benutzeroberfläche gibt dies nie preis und zeigt mir nur "master".

Das ist so ziemlich das, was meiner Meinung nach sowieso unter der Haube passiert, basierend auf Dingen, die ich in letzter Zeit gemacht habe, und wenn man darüber nachdenkt, ist es sehr gutes Design.

Aus diesem Grund wäre es meiner Meinung nach für Microsoft sehr einfach, Git-Forks in ihr Visual Studio Team Services-Angebot aufzunehmen.

5
Hugh

In einfachsten Worten,

Wenn Sie sagen, dass Sie gabeln ein Repository sind, erstellen Sie im Grunde eine Kopie des ursprünglichen Repositorys unter Ihrer GitHub-ID in Ihrem GitHub-Konto.

und

Wenn Sie sagen, dass Sie Klonen ein Repository sind, erstellen Sie direkt eine lokale Kopie des ursprünglichen Repository in Ihrem System (PC/Laptop), ohne eine Kopie in Ihrem GitHub-Konto zu haben.

3
anoNewb