Pour comprendre pourquoi Git n'offre pas une sorte de ce que vous faites référence à un "mécanisme d'héritage" (n'impliquant pas un commit), vous devez d'abord comprendre l'un des concepts de base de ces SCMs (Git vs ClearCase par exemple)
ClearCase utilise une version linéaire de stockage: chaque version d'un élément (fichier ou répertoire) est liée directement linéaire de la relation avec la précédente version d'un même élément.
Git utilise un DAG - Graphe Dirigé Acyclique: chaque "version" d'un fichier est en fait partie d'un ensemble global des changements dans un arbre qui est lui-même partie d'un commit. La version précédente de ce qui se trouve dans une précédente livraison, accessible via un unique graphe dirigé acyclique chemin.
Dans un système linéaire, une config spec pouvez spécifier plusieurs règles pour la réalisation de cet "héritage" vous voyez (pour un fichier, sélectionnez d'abord une certaine version, et si non présent, puis sélectionnez une autre version, et si non présent, puis sélectionnez un troisième, et ainsi de suite).
La direction est d'une fourchette dans un linéaire de l'histoire d'une version donnée d'une donnée, sélectionnez la règle (toutes les autres règles de sélection avant que l'on s'appliquent toujours, d'où le "héritage" de l'effet)
Dans un DAG, un commit représente tous les "héritage" que vous obtiendrez jamais; il n'y a pas de "montant cumulatif des" sélection de versions. Il y a seulement un chemin dans ce graphe pour sélectionner tous les fichiers que vous verrez sur ce point exact (commit).
Une branche est juste un nouveau chemin dans ce graphe.
Pour appliquer, dans Git, certaines autres versions, vous devez:
- fusionner dans votre branche certains autres commit (comme dans le git pull" mentionné par stsquad de réponse) ou
- rebase votre branche (comme Greg mentions)
Mais depuis Git est un DAG à base de SCM, il sera toujours le résultat dans un nouveau commit.
Ce que vous "perdre" avec Git est une sorte de "composition" (lorsque vous sélectionnez les différentes versions successives de sélectionner des règles), mais qui ne serait pas pratique dans un DVCS (comme dans "Distribué"): lorsque vous effectuez une branche Git, vous avez besoin de le faire avec un point de départ et un contenu clairement défini et facile à reproduire à d'autres dépôts.
Dans un but purement centrale VCS, vous pouvez définir votre espace de travail (dans ClearCase, votre "vue", soit instantané ou dynamique) avec toutes les règles que vous souhaitez.
inconnu-google ajoute dans le commentaire (et dans sa question ci-dessus):
Donc, une fois que nous voyons les deux modèles peuvent réaliser des choses différentes (linéaire vs DAG), ma question est: qui sont les véritables scénarios de vie (en particulier pour les entreprises de plus de OSS) où linéaire peut faire des choses pas possible pour DAG? Sont-ils la peine?
Quand il s'agit de "scénario de la vie réelle" en terme de règles de sélection, ce que vous pouvez faire dans un modèle linéaire est d'avoir plusieurs règles de sélection pour le même ensemble de fichiers.
Considérer cette "config spec" (c'est à dire "spécification de la configuration" pour les règles de sélection avec ClearCase):
element /aPath/... aLabel3 -mkbranch myNewBranch
element /aPath/... aLabel2 -mkbranch myNewBranch
Il sélectionne tous les fichiers portant la mention"aLabel2
"(et de la branche à partir de là), à l'exception de ceux portant la mention"aLabel3
' - et de la direction générale à partir de là (parce que la règle qui précède celui de mentionner 'aLabel2
').
Est-il utile?
Pas de.
En fait, l'UCM, la saveur de ClearCase (le "Unifiée de Gestion de la Configuration" méthodologie inclus avec ClearCase produit, et représentant tous les "meilleures pratiques" déduite à partir de la base de ClearCase utilisation) ne le permet pas, pour des raisons de simplificity. Un ensemble de fichiers est appelé un "composant", et si vous voulez de la branche pour une étiquette donnée (appelée "ligne de base"), qui devrait être traduit comme ceci à la suite de config spec:
element /aPath/... .../myNewBranch
element /aPath/... aLabel3 -mkbranch myNewBranch
element /aPath/... /main/0 -mkbranch myNewBranch
Vous avez à choisir un point de départ (ici, 'aLabel3
') et à partir de là.
Si vous souhaitez également les fichiers à partir de 'aLabel2
', vous pourrez faire une fusion de toutes les 'aLabel2
' fichiers à celles dans "myNewBranch'.
C'est une "simplification" vous n'avez pas à faire avec un DAG, où chaque nœud du graphe représente un unique défini "point de départ" pour une branche, ce qui est de l'ensemble des fichiers concernés.
De fusion et rebase sont assez pour combiner le point de départ avec d'autres versions d'un ensemble de fichiers, afin d'atteindre les objectifs de "composition", tout en gardant cette histoire dans l'isolement dans une branche.
L'objectif général est de raisonner en "cohérent opérations de Contrôle de Version appliquée à un cohérentde composants".
Une "cohérence" ensemble de fichiers est dans des conditions bien définies cohérente de l'état:
- si étiquetés, tous ses fichiers sont étiquetés
- si ramifiée, tous ses fichiers branche à partir de la même et unique point de départ
C'est facile à faire dans un groupe de disponibilité du système; il peut être plus difficile dans un système linéaire (en particulier avec la "Base de ClearCase" où la "config spec" peut être délicat), mais il est mis à exécution avec l'UCM méthodologie de la même linéaire en fonction de l'outil.
Au lieu de réaliser que la "composition" par le biais d'un "privé de sélection de la règle truc" (avec ClearCase, certains sélectionnez la règle de l'ordre), vous obtenez seulement avec les VCS opérations (rebase ou de fusion), qui laissent une trace apparente pour tout le monde à suivre (par opposition à une config spec privé pour un développeur, ou partagés entre certains, mais pas tous les développeurs).
Encore une fois, qu'il applique un sens de la cohérence, par opposition à une "souplesse dynamique", que vous pouvez avoir un moment difficile de reproduire plus tard.
Qui vous permet de quitter le domaine de la VCS (Version Control System) et entrez dans le domaine du SCM (Logiciel de Gestion de la Configuration), qui s'occupe principalement de la "reproductibilité". Et que (SCM fonctions) peuvent être obtenus avec un linéaire ou d'un DAG à base de VCS.