web-dev-qa-db-fra.com

Les fourches de Git sont-elles réellement des clones de Git?

J'entends toujours des gens dire qu'ils falsifient du code dans Git. Git "fork" ressemble étrangement à "clone" de Git, auquel s'ajoute une volonté psychologique (dénuée de sens) de renoncer aux futures fusions. Il n'y a pas de commande fork dans Git, non?

GitHub rend les fourches un peu plus réelles en y agrafant la correspondance. Autrement dit, vous appuyez sur le bouton de la fourchette et, plus tard, lorsque vous appuyez sur le bouton de demande d'extraction, le système est suffisamment intelligent pour envoyer un courrier électronique au propriétaire. C'est donc un peu une danse autour de la propriété et des autorisations du référentiel.

Oui Non? Une angoisse sur GitHub qui étend Git dans cette direction? Ou des rumeurs de Git absorbant la fonctionnalité?

787
Brian

Fork, dans le contexte de GitHub, n'étend pas Git.
Il permet uniquement le clonage côté serveur.

Lorsque vous clonez un référentiel GitHub sur votre poste de travail local, vous ne pouvez pas contribuer au référentiel en amont à moins d'être explicitement déclaré en tant que "contributeur". C'est parce que votre clone est une instance distincte de ce projet. Si vous souhaitez contribuer au projet, vous pouvez utiliser le forking pour le faire, de la manière suivante:

  • clonez ce référentiel GitHub sur votre compte GitHub (c'est-à-dire le partie "fork" , un clone côté serveur)
  • contribuez à ce référentiel GitHub (il se trouve dans votre propre compte GitHub, vous avez donc le droit d'y accéder)
  • signalez toute contribution intéressante dans le dépôt GitHub d'origine (c'est-à-dire le partie "demande d'extraction" au moyen des modifications que vous avez apportées. faites sur votre propre dépôt GitHub)

Cochez également " workflow GitHub collaboratif ".

Si vous souhaitez conserver un lien avec le référentiel d'origine (également appelé en amont), vous devez ajouter un site distant référant à ce référentiel d'origine.
Voir " Quelle est la différence entre Origin et upstream sur GitHub? "

fork and upstream

Et avec Git 2.20 (T4 2018) et plus, l'extraction depuis fork est plus efficace, avec îles delta .

900
VonC

J'entends toujours des gens dire qu'ils transforment du code en git. Git "fork" ressemble étrangement à "clone" et à une certaine volonté psychologique (dénuée de sens) de renoncer aux futures fusions. Il n'y a pas de commande fork dans git, non?

"Forking" est un concept et non une commande spécifiquement prise en charge par tout système de contrôle de version.

Le type le plus simple de forking est synonyme de branchement. A chaque fois que vous créez une branche, quel que soit votre VCS, vous avez "forké". Ces fourches sont généralement assez faciles à fusionner.

Le type de branche dont vous parlez, où une partie distincte prend une copie complète du code et s'en va, se produit forcément en dehors du VCS dans un système centralisé comme Subversion. Un VCS distribué tel que Git prend beaucoup mieux en charge la création de la base de code complète et le démarrage effectif d’un nouveau projet.

Git (pas GitHub) supporte nativement le "forçage" d'un référentiel entier (c'est-à-dire, le clonage) de plusieurs manières:

  • lorsque vous clonez, une télécommande appelée Origin est créée pour vous
  • par défaut, toutes les branches du clone suivront leurs équivalents Origin.
  • il est très facile d'extraire et de fusionner les modifications du projet d'origine que vous avez créé.

Git apporte des modifications à apporter à la source de la source de façon simple: il suffit de demander à quelqu'un du projet d'origine de vous retirer l'application ou de demander un accès en écriture à Push vous-même. C'est la partie que GitHub facilite et normalise.

Une angoisse sur Github étendant git dans cette direction? Ou des rumeurs de git absorbant la fonctionnalité?

Il n'y a pas d'angoisse parce que votre hypothèse est fausse. GitHub "étend" la fonctionnalité de forçage de Git avec une interface graphique Nice et un moyen standard d'émettre des requêtes d'extraction, mais ce n'est pas ajouter la fonctionnalité à Git. Le concept de full-repo-forking est intégré dans le contrôle de version distribuée à un niveau fondamental. Vous pouvez abandonner GitHub à tout moment et continuer à pousser/tirer les projets que vous avez "créés".

132
meagar

Oui, fork est un clone. Il est apparu parce que, vous ne pouvez pas utiliser les copies des autres sans leur permission. Ils en font une copie pour vous ( fork ), où vous aurez également une permission en écriture.

À l'avenir, si le propriétaire actuel ou d'autres utilisateurs disposant d'une fourchette, à l'instar de vos modifications, peuvent la récupérer dans leur propre référentiel. Sinon, vous pouvez leur envoyer une "demande de tirage".

78
ssapkota

"Fork" dans ce contexte signifie "Faites une copie de leur code afin que je puisse ajouter mes propres modifications". Il n'y a pas grand chose d'autre à dire. Chaque clone est essentiellement une fork, et c'est à l'original de décider s'il faut extraire les modifications de la fork.

37
Daenyth

Le clonage implique la création d'une copie du référentiel git sur une machine locale, tandis que le forking consiste à cloner le référentiel dans un autre référentiel. Le clonage est uniquement destiné à un usage personnel (bien que des fusions futures puissent se produire), mais vous copiez et ouvrez un nouveau chemin de projet possible.

26
Sam Johnson

Je pense que fork est une copie d'un autre référentiel mais avec la modification de votre compte. Par exemple, si vous clonez directement un autre référentiel localement, l'objet distant Origin utilise toujours le compte à partir duquel vous clonez. Vous ne pouvez pas commettre et contribuer votre code. Ce n'est qu'une copie des codes. Sinon, si vous branchez un référentiel, le référentiel sera cloné avec la mise à jour de votre compte dans votre compte github. Et puis en clonant le référentiel dans le contexte de votre compte, vous pouvez valider vos codes.

10
Daniel Shen

Le fork est fait lorsque vous décidez de contribuer à un projet. Vous feriez une copie de l'intégralité du projet avec ses historiques. Cette copie est entièrement réalisée dans votre référentiel et une fois ces modifications effectuées, vous émettez une demande d'extraction. C'est maintenant au propriétaire de la source d'accepter votre demande d'extraction et d'incorporer les modifications dans le code d'origine.

Git Clone est une commande qui permet aux utilisateurs d’obtenir une copie de la source. git clone [URL] Ceci devrait créer une copie de [URL] dans votre propre référentiel local.

10
aliasav

Outre le fait que le clonage est effectué d'un serveur à un autre sur votre machine et que la copie est copiée sur le serveur lui-même, une différence importante est que lorsque nous clonons, nous obtenons toutes les branches, étiquettes, etc.

Mais lorsque nous divisons, nous n’obtenons que les fichiers actuels dans la branche principale, rien d’autre que cela. Cela signifie que nous ne recevons pas les autres branches, etc.

Par conséquent, si vous devez fusionner quelque chose dans le référentiel d'origine, il s'agit d'une fusion entre référentiels et vous aurez certainement besoin de privilèges plus élevés.

Fork n'est pas une commande en Git; c'est juste un concept que GitHub implémente. Rappelez-vous que Git a été conçu pour fonctionner dans un environnement d'égal à égal, sans qu'il soit nécessaire de synchroniser des éléments avec une copie principale. Le serveur est juste un autre pair, mais nous le considérons comme une copie maîtresse.

7
Deepak G M

Il y a un malentendu ici en ce qui concerne ce qu'est une "fourchette". Une fourchette n'est en réalité rien de plus qu'un ensemble de branches par utilisateur. Lorsque vous appuyez sur une branche, vous appuyez réellement sur le référentiel d'origine, car il s'agit du référentiel UNIQUEMENT.

Vous pouvez essayer ceci en poussant vers un fork, en notant la validation, puis en accédant au référentiel d'origine et en utilisant l'ID de validation, vous verrez que la validation est "dans" le référentiel d'origine.

Cela a beaucoup de sens, mais c'est loin d'être évident (je ne l'ai découvert que par hasard récemment).

Lorsque John forks SuperProject de référentiel, il semble que toutes les branches du référentiel source soient répliquées avec un nom tel que "John.master", "John.new_gui_project", etc.

GitHub "cache" le "John". de nous et nous donne l’illusion que nous avons notre propre "copie" du dépôt sur GitHub, mais nous n’en avons pas besoin et nous n’en avons même pas besoin.

Donc, la branche "maître" de ma fourche est en réalité nommée "Korporal.master", mais l'interface utilisateur de GitHub ne le révèle jamais, me montrant uniquement "maître".

C’est à peu près ce que je pense qui se passe sous le capot de toute façon, basé sur ce que j’ai fait récemment et, lorsque vous y réfléchissez, c’est un très bon design.

Pour cette raison, je pense qu'il serait très facile pour Microsoft d'implémenter les fourchettes Git dans leur offre Visual Studio Team Services.

5
Hugh

En termes simples,

Lorsque vous dites que vous forgez un référentiel, vous créez essentiellement une copie du référentiel d'origine sous votre identifiant GitHub dans votre compte GitHub.

et

Lorsque vous dites que vous clonez un référentiel, vous créez une copie locale du référentiel d'origine directement sur votre système (PC/ordinateur portable), sans en avoir une copie. dans votre compte GitHub.

3
anoNewb