git branch, fourche, d'extraction, de fusion, rebase et clone, quelles sont les différences?

Quelqu'un peut-il m'aider à comprendre la différence entre une branche, une fourchette et un clone en Git?

de même, qu'est-ce que cela signifie Quand je fais un git fetch par opposition à un git pull ?

que signifie rebase par rapport à merge ?

Comment puis-je écraser les individus qui s'engagent ensemble?

Comment sont-ils utilisés, pourquoi sont-ils utilisés et que représentent-ils?

comment GitHub apparaît-il?

477
demandé sur IlyaK 2010-07-25 20:14:23

5 réponses

Un clone est simplement une copie d'un dépôt. En surface, son résultat est équivalent à svn checkout , où vous téléchargez le code source d'un autre dépôt. La différence entre les VCS centralisés comme Subversion et les DVCSs comme Git est que dans Git, lorsque vous clonez, vous copiez en fait l'ensemble du dépôt source, y compris toute l'histoire et les branches. Vous avez maintenant un nouveau dépôt sur votre machine et toutes les propagations que vous faites vont dans ce dépôt. Personne ne verra de toute change jusqu'à ce que vous poussiez ces propagations vers un autre dépôt (ou vers l'original) ou jusqu'à ce que quelqu'un retire les propagations de votre dépôt, si celui-ci est accessible au public.

une branche est quelque chose qui se trouve dans un dépôt. Sur le plan conceptuel, elle représente un fil conducteur du développement. Vous avez habituellement une branche principale, mais vous pouvez aussi avoir une branche où vous travaillez sur une fonction xyz, et une autre pour corriger le bogue abc. Lorsque vous avez extrait une branche, tout engage que vous faites restez sur cette branche et ne partagez pas avec d'autres branches jusqu'à ce que vous les fusionniez ou les rebasez sur la branche en question. Bien sûr, Git semble un peu bizarre quand il s'agit de branches jusqu'à ce que vous regardez le modèle sous-jacent de la façon dont les branches sont mises en œuvre. Plutôt que de l'expliquer moi-même (j'en ai déjà trop dit, me semble-t-il), je vais faire un lien vers l'explication "informatique" de la façon dont git modélise les branches et les commits, tirée du site Web Git:

http://eagain.net/articles/git-for-computer-scientists /

Une fourchette n'est pas un Git concept vraiment, c'est plus une politique/social idée. C'est-à-dire, si certaines personnes ne sont pas satisfaites de la façon dont un projet se déroule, elles peuvent prendre le code source et travailler dessus elles-mêmes séparé des développeurs originaux. Ce serait considéré comme une fourchette. Git rend le travail facile parce que tout le monde a déjà sa propre copie "maître" du code source, donc c'est aussi simple que de couper les liens avec les développeurs de projet originaux et ne nécessite pas d'exporter l'histoire d'un dépôt partagé comme vous pourriez avoir à faire avec SVN.

EDIT: puisque je n'étais pas au courant de la définition moderne de "fourche" comme utilisé par des sites tels que GitHub, s'il vous plaît jeter un oeil aux commentaires et aussi réponse de Michael Durrant ci-dessous le mien pour plus d'informations.

355
répondu siride 2017-05-23 11:47:20

Git

ma réponse inclut github comme beaucoup de gens ont demandé à ce sujet aussi.

Dépôts Locaux

Git (local) a un répertoire (.git) dans lequel vous propagez vos fichiers et c'est votre "dépôt local". C'est différent des systèmes comme svn où vous ajoutez et commutez immédiatement dans le dépôt distant.

git stocke chaque version d'un fichier qui change en sauvegardant le fichier entier. Il est également différent de svn à cet égard car vous pouvez aller à n'importe quelle version individuelle sans la "recréer" par des modifications delta.

Git ne "verrouille" pas du tout les fichiers et évite ainsi la fonctionnalité de "verrouillage exclusif" pour une édition (les anciens systèmes comme pvcs viennent à l'esprit), de sorte que tous les fichiers peuvent toujours être édités, même lorsqu'ils sont hors ligne. Il fait en fait un travail incroyable de la fusion des changements de dossier (dans le même fichier!) ensemble lors de pulls ou de fetches/pushs vers un dépôt distant tel que github. La seule fois où vous avez besoin de faire des modifications manuelles (éditant en fait un fichier) est si deux modifications impliquent la même ligne de code.


Branches

Les Branches

vous permettent de conserver le code principal (la branche 'master'), de faire une copie (une nouvelle branche) et de travailler ensuite au sein de cette nouvelle branche. Si le travail prend du temps ou le maître reçoit beaucoup de les mises à jour depuis que la branche a été faite, alors la fusion ou le rebasement (souvent préféré pour une meilleure histoire et plus facile à résoudre les conflits) contre la branche principale devrait être fait. Lorsque vous avez terminé, vous fusionnez les changements effectués dans la branche vers le dépôt principal. De nombreuses organisations utilisent des branches pour chaque travail, qu'il s'agisse d'une fonctionnalité, d'un bug ou d'un élément de travail. D'autres organisations n'utilisent les branches que pour les changements majeurs tels que les mises à niveau de versions. Fourche: avec une branche, vous contrôlez et gérez le alors qu'avec une fourchette, quelqu'un d'autre contrôle l'acceptation du code.

De façon générale, il y a deux approches principales pour faire des directions générales. La première est de garder la plupart des changements sur la branche principale, en n'utilisant les branches que pour les choses plus grandes et plus longues comme les changements de version où vous voulez avoir deux branches disponibles pour des besoins différents. La seconde consiste à faire une branche pour chaque requête de fonctionnalité, Correction de bug ou corvée et ensuite décider manuellement quand pour fusionner ces branches dans la branche principale. Bien que cela semble fastidieux, c'est une approche commune et c'est celle que j'utilise actuellement et recommande parce que cela garde la branche principale propre et c'est le maître que nous promouvons à la production, donc nous voulons seulement du code complet et testé, via le rebasing et la fusion de branches.

la méthode standard pour amener une branche "in "à master est de faire un merge . Les Branches peuvent également être rebase d à 'nettoyer 'l'histoire. Il n'affecte pas l'état actuel et est fait pour donner une histoire "propre". Fondamentalement, l'idée est que vous ramifié à partir d'un certain point (généralement à partir de maître). Depuis que vous avez ramifié "maître" lui-même a progressé. Donc ce serait plus propre si tout ce que vous avez changé dans une branche est joué contre le maître le plus récent avec tous ses changements. Ainsi, le processus est: enregistrer les modifications; obtenir le "nouveau" maître, puis réappliquer les modifications de nouveau contre. Soyez conscient que rebase, tout comme la fusion, peut entraîner des conflits que vous devez résoudre manuellement (éditer).

Un 'guide' note: Seulement "rebase" si la branche est local et que vous n'avez pas poussé à distance encore! c'est principalement parce que le rebasement peut modifier l'histoire que d'autres personnes voient qui peut inclure leurs propres commits.

Suivi des branches

ce sont les branches qui sont nommées origine/branch_name (as plutôt que de simplement branch_name). Quand vous poussez et tirez le code vers/depuis des dépôts distants, c'est en fait le mécanisme par lequel cela se produit. Par exemple, lorsque vous git push une branche appelée 'building_groups', votre branche va d'abord à origin/building_groups et ensuite au dépôt distant (en fait, c'est une simplification excessive mais assez bonne pour le moment). De même, si vous faites un git fetch building_groups le fichier est extrait est placé dans votre origine/building_groups direction. Vous pouvez ensuite choisir de fusionner cette branche dans votre copie locale. Notre pratique est de toujours faire un git fetch et une fusion manuelle plutôt qu'une simple git pull (ce qui fait les deux ci-dessus en une seule étape).

Fetch

obtention de nouvelles branches: au point initial d'un clone vous aurez toutes les branches. Cependant, si d'autres développeurs ajoutent des branches et les poussent vers la télécommande, il doit y avoir un moyen de "savoir" branches et leurs noms afin d'être en mesure de les tirer vers le bas localement. Cela se fait via un git fetch qui récupérera toutes les branches nouvelles et modifiées dans le dépôt local en utilisant les branches de suivi (par exemple origin/). Une fois fetch ed, on peut git branch --remote pour lister les branches de suivi et git checkout [branch] pour passer réellement à l'une quelconque.

Fusion

Fusion est le processus de combinaison des changements de code de différentes branches, ou à partir de différentes versions de la même branche (par exemple, lors d'une branche locale et à distance sont désynchronisés.). Si l'on a développé le travail dans une branche et que le travail est terminé, prêt et testé, alors il peut être fusionné dans la branche master . Ceci est fait par git checkout master pour passer à la branche master , puis git merge your_branch . La fusion rassemblera tous les différents fichiers et même les modifications différentes aux mêmes fichiers ensemble. Cela signifie qu'il sera effectivement changez le code à l'intérieur des fichiers pour fusionner tous les changements. En faisant le checkout de master il est également recommandé de faire un git pull origin master pour obtenir la toute dernière version du maître à distance fusionné dans votre maître local. Si le maître distant a changé, c.-à-d. moved forward , vous verrez l'information qui reflète que pendant que git pull . Si c'est le cas (maître changé) vous êtes conseillé à git checkout your_branch et puis rebase il à maîtriser afin que vos changements obtiennent effectivement "rejoué" en haut de la "nouvelle" de maître. Puis, continuer avec l'obtention de maître à jour comme indiqué dans le paragraphe suivant.

S'il n'y a pas de conflits, alors master ajoutera les nouveaux changements. S'il y a des conflits, cela signifie que les mêmes fichiers ont des changements autour de lignes de code similaires qu'ils ne peuvent pas fusionner automatiquement. Dans ce cas, git merge new_branch signalera qu'il y a des conflits à résoudre. Vous 'résoudre' en éditant les fichiers (qui sera avoir les deux modifications dans eux), en sélectionnant les modifications que vous voulez, en supprimant littéralement les lignes des modifications que vous ne voulez pas, puis en sauvegardant le fichier. Les changements sont marqués par des séparateurs tels que ======== et <<<<<<<<

une fois que vous aurez résolu tous les conflits, vous aurez à nouveau git add et git commit ces modifications pour poursuivre la fusion (vous obtiendrez des commentaires de git au cours de ce processus pour vous guider). Lorsque le processus ne fonctionne pas bien, vous trouverez ce git merge --abort est très pratique pour réinitialiser les choses.

Interactif complet et en écrasant / réorganisation / retrait s'engage

si vous avez fait beaucoup de petits pas, par exemple si vous commettez du code en tant que 'travail en cours' chaque jour, vous pouvez vouloir" écraser " ces nombreuses petites propagations en quelques plus grandes propagations. Cela peut être particulièrement utile lorsque vous voulez faire des revues de code avec des collègues. Vous ne voulez pas rejouer toutes les 'étapes' que vous avez prises (via commits), vous voulez juste dire ici est l'effet de fin (diff) de tous mes changements pour ce travail dans une commit. Le facteur clé à évaluer lors de la considération de faire ceci est si les commits multiples sont contre le même dossier ou les dossiers plus d'une fois (mieux pour écraser commits dans ce cas). Cela se fait avec l'outil de rebasage interactif. Cet outil vous permet d'écraser les commits, supprimer les commits, reformuler les messages, etc. Par exemple git rebase -i HEAD~10 notez que c'est un ~ pas un - :

interactive rebasing in Git Être prudent et d'utiliser cet outil avec précaution'. Faites un squash / delete / reorder à la fois, exit et save that commit, puis retournez l'outil. Si les commits ne sont pas contigus, vous pouvez les réorganiser (puis les écraser au besoin). Vous pouvez effectivement supprimer commet ici aussi, mais vous avez vraiment besoin d'être sûr de ce que vous faites quand vous faites cela!

Fourches

il existe deux approches principales à la collaboration dans les dépôts git. Le premier, détaillé ci-dessus est directement via les branches que les gens tirent et poussent de/à. Ces collaborateurs ont leurs clés ssh enregistrées dans le dépôt distant. Cela leur permettra de pousser directement vers ce dépôt. L'inconvénient est que vous devez maintenir la liste des utilisateurs. L'autre approche-bifurcation-permet à n'importe qui de "bifurquer" le dépôt, en faisant essentiellement une copie locale dans leur propre dépôt git compte. Ils peuvent alors effectuer des modifications et, lorsqu'ils ont terminé, envoyer une "requête pull" (en fait, c'est plutôt une requête "push" et une requête "pull" pour le responsable du dépôt) pour faire accepter le code.

Cette seconde méthode, qui utilise des fourches, ne pas nécessite quelqu'un pour maintenir une liste des utilisateurs pour le dépôt.


Github

github (à distance le dépôt) est une source distante à laquelle vous poussez et retirez normalement les changements engagés si vous avez (ou si vous êtes ajouté) un tel dépôt, donc les sources locales et distantes sont en fait assez distinctes. Une autre façon de penser d'un dépôt distant est que c'est une .structure de répertoire git qui vit sur un serveur distant.

lorsque vous "bifurquez" - dans l'interface GitHub du navigateur Web, vous pouvez cliquer sur enter image description here - vous créez une copie ("clone") du code dans votre" compte github 1519420920". Il peut être un peu subtil la première fois que vous le faites, alors assurez-vous de vérifier sous quel dépôt une base de code est listée-soit le propriétaire d'origine ou "Fourché de" et vous, par exemple enter image description here

Une fois que vous avez la copie locale, vous pouvez faire les changements que vous voulez (en les tirant et en les poussant vers une machine locale). Une fois que vous avez terminé, vous soumettez une "requête pull" au propriétaire/administrateur du dépôt original. (sonne fantaisie, mais en fait vous cliquez juste sur ce:- enter image description here ) et ils 'pull'.

Plus courant pour une équipe travaillant sur le code ensemble est de "cloner" le dépôt (cliquez sur l'icône "Copier" sur l'écran principal du dépôt). Ensuite, tapez localement git clone [paste] cela vous configurera localement et vous pouvez aussi push et pull à l'emplacement GitHub (partagé).

Clones

Comme indiqué dans la section sur github, un clone est une copie d'un dépôt. Lorsque vous avez un dépôt distant, vous lancez la commande git clone contre son URL et vous vous retrouvez avec une copie locale, ou un clone du dépôt. Ce clone a tout , les fichiers, la branche principale, les autres branches, toutes les propagations existantes, tout le shebang. C'est ce clone contre lequel vous faites vos additions et vos propagations et le dépôt distant lui-même est ce vers quoi vous poussez ces propagations. C'est ce concept local / à distance qui rend git (et des systèmes similaires comme Mercurial) un DVCS ( distribué Version Control System) par opposition aux CVS plus traditionnels (Code Versioning Systems) tels que SVN, PVCS, CVS, etc. où vous vous engagez directement dans le dépôt distant.

visualisation

Visualisation des concepts de base peut être vu à

http://marklodato.github.com/visual-git-guide/index-en.html et

http://ndpsoftware.com/git-cheatsheet.html#loc=index

si vous voulez un affichage visuel de la façon dont les changements fonctionnent, vous ne pouvez pas battre l'outil visuel gitg (gitx pour mac) avec une interface graphique que j'appelle "la carte du métro" (esp. London Underground), excellent pour montrer qui a fait quoi, comment les choses changent, divergés et fusionnés, etc.

vous pouvez également l'utiliser pour ajouter, commit et gérer vos modifications !

gitg/gitx interface

bien que gitg/gitx soit relativement minime, au cours des 2-3 dernières années (2009-2012) le nombre d'outils d'interface graphique continue à augmenter. De nombreux utilisateurs Mac utilisent la fourchette de gitx de brotherbard et pour Linux une excellente option est smart-git avec une interface intuitive mais puissante:

smart-git GUI

Notez que même avec un outil gui, vous ferez probablement beaucoup de commandes en ligne de commande.

Pour cela j'ai les alias suivants dans mon~/.bash_aliases fichier (qui est appelé de mon ~/.fichier bashrc pour chaque session de terminal:

# git
alias gst='git status' # Warning: gst conflicts with gnu-smalltalk (when used).
alias gb='git branch'
alias gco='git checkout'
alias gcob='git checkout -b '
alias ga='git add '
alias gc='git commit'
alias gg='git grep ' #  A great very FAST search option, easier then `find`

enfin, 6 sauveurs de vie clés:

1) vous gâchez votre succursale locale et voulez simplement revenir à ce que vous aviez la dernière fois que vous avez fait un git pull:

git reset --hard origin/master  # You will need to be comfortable doing this!

2) vous commencez à faire des changements localement, vous éditez une demi-douzaine de fichiers et puis, oh merde, vous êtes toujours dans la branche maître (ou une autre):

git checkout -b new_branch_name  # just create a new branch
git add .                      # add the changes files
git commit -m"your message"    # and commit them

3) vous gâchez un fichier particulier dans votre branche courante et vous voulez fondamentalement "réinitialiser" ce fichier (perdre des changements) à la façon dont il était la dernière fois que vous l'avez tiré du dépôt distant: git checkout your/directories/filename cela réinitialise effectivement le fichier (comme de nombreuses commandes git, il n'est pas bien nommé pour ce qu'il fait ici).

4 ) vous faites quelques modifications localement, vous voulez vous assurer que vous ne les perdez pas pendant que vous faites une réinitialisation git ou rebase: je fais souvent une copie manuelle de l'ensemble du projet ( cp -r ../my_project ~/ ) quand je ne suis pas sûr que je pourrais me tromper dans git ou perdre des changements importants.

5) vous rebasez mais les choses se gâte:

git rebase --abort # To abandon interactive rebase and merge issues

6) ajouter votre branche git à votre invite PS1 (voir https://unix.stackexchange.com/a/127800/10043 ), p.ex. enter image description here

La succursale est selenium_rspec_conversion

516
répondu Michael Durrant 2017-11-23 20:47:40

Voici L'image D'Oliver Steele de la façon dont tout s'emboîte ensemble:

enter image description here

140
répondu Contango 2016-11-11 11:58:24

juste pour ajouter à d'autres, une note spécifique à bifurcation.

il est bon de réaliser que techniquement, le clonage repo et la fourche repo sont la même chose. Do:

git clone $some_other_repo

et vous pouvez vous taper sur le dos---vous avez juste bifurqué un autre repo.

Git, en tant que VCS, est en fait tout au sujet de Clonage fourche. En dehors de la "simple navigation" à l'aide de L'interface utilisateur distante comme cgit, il y a très peu pour faire avec Git repo qui n'implique pas bifurcation clonage de la repo à un moment donné.

cependant,

  • quand quelqu'un dit je bifurquais repo X , ils veulent dire qu'ils ont créé un clone de la repo ailleurs avec l'intention de exposer il à d'autres, par exemple pour afficher certaines expériences, ou d'appliquer les différents mécanisme de contrôle d'accès (par exemple. permettre personnes sans accès Github mais avec le compte interne de l'entreprise pour collaborer).

    fait que: le repo est très probablement créé avec une autre commande que git clone , qu'il est très probablement hébergé quelque part sur un serveur comme opposé à l'ordinateur portable de quelqu'un, et a très probablement légèrement différent format (c'est un "nu repo", c'est à dire. sans arbre de travail) sont tous simplement détails techniques.

    Le fait qu'il sera probablement contenir différents de branche, balises ou commet est probablement la raison pour laquelle ils l'ont fait dans la première lieu.

    (ce que Github fait quand on clique sur "fork", c'est cloner avec added sucre: il clone la pension pour vous, le met sous votre compte, les enregistrements le "forké" quelque part, ajoute à distance nommé "en amont", et la plupart des surtout, il joue la belle animation.)

  • quand quelqu'un dit j'ai cloné le rapport , il signifie que ils ont créé un clone de la repo locale sur leur ordinateur portable ou de bureau avec intention étudiez-le, jouez avec, contribuez-y, ou construisez quelque chose à partir de la source du code.

la beauté de Git est qu'il rend tout cela parfaitement ensemble: tous ces repos partagent la partie commune de bloc chaîne de commit donc il est possible de fusionner en toute sécurité (voir note ci-dessous) les changements d'avant en arrière entre tous ces repos que vous voyez bon.


Remarque: "en toute sécurité" tant que vous n'avez pas de réécrire la partie commune de la chaîne, et tant que les modifications ne sont pas contradictoires.

6
répondu Alois Mahdal 2015-08-26 18:02:52

Fork Vs. Clone-deux mots qui signifient tous les deux copie

voir ce diagramme . (originaire de http://www.dataschool.io/content/images/2014/Mar/github1.png ).

.-------------------------.     1. Fork     .-------------------------.
| Your GitHub repo        | <-------------- | Joe's GitHub repo       |
| github.com/you/coolgame |                 | github.com/joe/coolgame |
| ----------------------- | 7. Pull Request | ----------------------- |
| master -> c224ff7       | --------------> | master -> c224ff7 (c)   |
| anidea -> 884faa1 (a)   |                 | anidea -> 884faa1 (b)   |
'-------------------------'                 '-------------------------'
    |                 ^
    | 2. Clone        |
    |                 |
    |                 |
    |                 |
    |                 |
    |                 | 6. Push (anidea => origin/anidea)
    v                 |
.-------------------------.
| Your computer           |  3. Create branch 'anidea'
| $HOME/coolgame          |
| ----------------------- |  4. Update a file
| master -> c224ff7       |
| anidea -> 884faa1       |  5. Commit (to 'anidea')
'-------------------------'

(a) - after you have pushed it
(b) - after Joe has accepted it
(c) - eventually Joe might merge 'anidea' (make 'master -> 884faa1')

Fourche

  • une copie de votre compte rendu à distance (cloud) qui le relie à Joe's
  • une copie que vous pouvez ensuite cloner à votre repo local et F * %$ - up
  • quand vous avez terminé vous pouvez repousser à votre télécommande
  • vous pouvez alors demander à Joe s'il veut l'utiliser dans son projet en cliquant pull-request

Clone

  • une copie locale sur votre repo (disque dur)
5
répondu Timothy L.J. Stewart 2017-12-06 18:14:09