web-dev-qa-db-fra.com

Forking vs. Branching dans GitHub

J'aimerais en savoir plus sur les avantages et les inconvénients de forger un projet github par rapport à la création d'une branche d'un projet github.

Forking rend ma version du projet plus isolée de la version originale car je n'ai pas besoin de figurer sur la liste des collaborateurs du projet d'origine. Depuis que nous développons un projet en interne, il n’ya aucun problème à ajouter des personnes en tant que collaborateurs. Cependant, nous aimerions comprendre si le fait de créer un projet rendrait plus difficile la fusion des modifications apportées au projet principal. Autrement dit, je me demande si la création de branches facilite la synchronisation des deux projets. En d'autres termes, est-il plus facile de fusionner et de transférer des modifications entre ma version du projet principal et le projet principal lorsque je crée une branche? 

234
reprogrammer

Vous ne pouvez pas toujours créer une branche ou extraire une branche existante et y accéder de nouveau, car vous n'êtes pas inscrit en tant que collaborateur pour ce projet spécifique.

Le fork est simplement un clone du côté du serveur GitHub:

  • sans la possibilité de repousser directement
  • avec fork queue fonctionnalité ajoutée pour gérer la demande de fusion

Vous gardez une fourchette en phase avec le projet d'origine en:

  • ajout du projet d'origine en tant que télécommande
  • aller chercher régulièrement à partir de ce projet original
  • rebassez votre développement actuel au-dessus de la branche d'intérêt que vous avez mise à jour à partir de cette récupération.

La nouvelle base vous permet de vous assurer que vos modifications sont simples (pas de conflit de fusion à gérer), ce qui rend votre demande d'extraction plus facile lorsque vous souhaitez que le responsable du projet d'origine inclue vos correctifs dans son projet. 

Le but est vraiment de permettre la collaboration même si la participation {directe n'est pas toujours possible.


Le fait que vous cloniez du côté de GitHub signifie que vous avez maintenant le référentiel deux _ "central" ("central" en tant que "visible de plusieurs collaborateurs).
Si vous pouvez les ajouter directement en tant que collaborateur pour un projet un, vous n'avez pas besoin d'en gérer un autre avec un fork. 

fork on GitHub

L'expérience de fusion serait à peu près la même chose, mais avec un niveau d'indirection supplémentaire (appuyer d'abord sur la fourche, puis demander un pull, avec le risque d'évolution sur le référentiel d'origine rendant plus rapide la fusion accélérée) .
Cela signifie que le flux de travail correct est git pull --rebase upstream (rebassez votre travail par-dessus les nouveaux commits en amont), puis git Push --force Origin, afin de réécrire l'historique de telle manière que vos propres commits soient toujours au-dessus des commits du repo d'origine (en amont).

Voir également:

243
VonC

Voici les différences de haut niveau:

Fourche

Avantages

  • Maintient les branches séparées par l'utilisateur
  • Réduit l'encombrement dans le référentiel principal
  • Votre processus d'équipe reflète le processus de contributeur externe

Les inconvénients

  • Cela rend plus difficile de voir toutes les branches qui sont actives (ou inactives, d'ailleurs)
  • Collaborer sur une branche est plus compliqué (le propriétaire de la fourche doit ajouter la personne en tant que collaborateur)
  • Vous devez comprendre le concept de télécommandes multiples dans Git
    • Nécessite une comptabilité mentale supplémentaire
    • Cela rendra le flux de travail plus difficile pour les personnes qui ne sont pas très à l'aise avec Git

Ramification

Avantages

  • Conserve tout le travail effectué autour d'un projet au même endroit
  • Tous les collaborateurs peuvent appuyer sur la même branche pour collaborer sur celle-ci.
  • Il n'y a qu'une seule télécommande Git à traiter

Les inconvénients

  • Les branches abandonnées peuvent s'accumuler plus facilement
  • Le processus de contribution de votre équipe ne correspond pas au processus du contributeur externe
  • Vous devez ajouter des membres de l'équipe en tant que contributeurs avant de pouvoir créer une branche.
55
Aidan Feldman

Cela a à voir avec le flux de travail général de Git. Il est peu probable que vous puissiez accéder directement au référentiel du projet principal. Je ne sais pas si le référentiel du projet GitHub prend en charge le contrôle d'accès basé sur les branches, car vous ne voudriez accorder à personne l'autorisation de pousser vers la branche principale, par exemple.

Le schéma général est le suivant:

  • Définissez le référentiel du projet d'origine pour disposer de votre propre copie GitHub, sur laquelle vous serez ensuite autorisé à envoyer des modifications.
  • Clonez votre référentiel GitHub sur votre machine locale
  • Ajoutez éventuellement le référentiel d'origine en tant que référentiel distant supplémentaire sur votre référentiel local. Vous pourrez alors récupérer directement les modifications publiées dans ce référentiel.
  • Faites vos modifications et vos propres commits localement.
  • Transférez vos modifications dans votre référentiel GitHub (car vous ne disposez généralement généralement pas des autorisations d'écriture sur le référentiel du projet).
  • Contactez les responsables du projet et demandez-leur de récupérer vos modifications et de les réviser/fusionner, puis de les laisser repasser dans le référentiel du projet (si vous et eux le souhaitez).

Sans cela, il est assez inhabituel que des projets publics laissent directement à qui que ce soit leur propre engagement.

43
Bruno

Forking crée un dépôt entièrement nouveau à partir d'un dépôt existant (il suffit de faire un clonage de git sur gitHub/bitbucket) 

Les fourchettes sont mieux utilisées: lorsque l’intention de la division est de créer un projet logiquement indépendant, qui ne pourra jamais être réuni avec son parent.

La stratégie de branche crée une nouvelle branche sur le référentiel existant/actif

Les branches sont mieux utilisées: lorsqu'elles sont créées en tant qu'emplacements temporaires pour travailler sur une fonctionnalité, dans le but de fusionner la branche avec l'origine.

Plus spécifique: - Dans les projets open source, c'est le propriétaire du référentiel qui décide qui peut accéder au référentiel. Cependant, l'idée de l'open source est que tout le monde peut contribuer au projet.

Ce problème est résolu par des fourchettes: chaque fois qu'un développeur souhaite modifier quelque chose dans un projet open source, il ne clone pas directement le référentiel officiel. Au lieu de cela, ils le bifurquent pour créer une copie. Lorsque le travail est terminé, ils effectuent une demande d'extraction afin que le propriétaire du référentiel puisse examiner les modifications et décider de les fusionner avec son projet.

En principe, le forking est similaire à la création de branches, mais au lieu de créer des branches, un fork du référentiel est créé et, au lieu de faire une demande de fusion, vous créez une demande d'extraction.

Les liens ci-dessous fournissent la différence d'une manière bien expliquée:

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

0
srinivas y