253 votes

Quel est l'équivalent Git du numéro de révision ?

Nous utilisons SVN au travail, mais pour mes projets personnels, j'ai décidé d'utiliser Git. J'ai donc installé Git hier, et je me demande ce qu'est le numéro de révision équivalent dans Git .

Disons que nous travaillons sur la version 3.0.8 et que chaque correction de bug a son propre numéro de révision que nous pouvons utiliser lorsque nous parlons de cette correction de bug. Donc, si je marque le code dans Git à 3.0.8, que puis-je utiliser comme numéro de révision ou autre type d'identification plus détaillée ? Je trouve que le hachage n'est pas très convivial pour les humains.

0 votes

0 votes

Il y a un article pour l'une des solutions possibles. Cela pourrait sembler un peu lourd mais intégré dans la sortie de "git log" et ne nécessite aucune commande supplémentaire autre que "git push/pull/fetch".

0 votes

Malheureusement, l'article lié de @DmitryPavlenko est sur un domaine mort : gitsvn.x10.mx. Sans indication du sujet, il sera difficile pour quiconque de le trouver ailleurs.

195voto

mdorseif Points 7473

Avec un Git moderne (1.8.3.4 dans mon cas) et sans utiliser de branches, vous pouvez le faire :

$ git rev-list --count HEAD
68

23 votes

Envisagez d'utiliser git rev-list --count --first-parent HEAD

8 votes

Compte tenu de cette information (le nombre 68), existe-t-il un moyen de déterminer la révision pour réacquérir le code ? Supposons que la "révision 68" soit publiée dans un environnement de test, que le développement se poursuive et que, plus tard, un développeur ait besoin de récupérer la "révision 68" dans le contrôle de la source. Comment pourrait-il cibler la version spécifique à cloner ? Ou bien est-ce que je rate quelque chose à propos de Git qui rend cette opération inutile ?

10 votes

Gardez à l'esprit que cette solution donnerait des résultats différents pour différents développeurs. De même, le calcul à rebours depuis le "compte" jusqu'au commit donnerait des commits différents pour différents développeurs ! Ceci est dû à la nature distribuée de Git et au fait que les commits se produisent dans différents dépôts pendant le même laps de temps, mais peuvent ne pas être comptés dans la base de données de Git. git rev-list --count HEAD en fonction du moment où les dernières poussées et tractions ont été effectuées.

156voto

makdad Points 4670

Bonne ou mauvaise nouvelle pour vous, ce dièse EST le numéro de révision. J'ai également eu des problèmes avec cela lorsque j'ai fait le passage de SVN à git.

Vous pouvez utiliser le "tagging" dans git pour marquer une certaine révision comme étant la "release" d'une version spécifique, ce qui permet de se référer facilement à cette révision. Regardez ceci article de blog .

La chose essentielle à comprendre est que git ne peut pas avoir de numéros de révision - pensez à la nature décentralisée. Si les utilisateurs A et B committent tous deux dans leurs dépôts locaux, comment git peut-il raisonnablement attribuer un numéro de révision séquentiel ? A n'a aucune connaissance de B avant qu'ils ne poussent/tirent les changements de l'autre.

Une autre chose à examiner est la simplification des branches pour les branches de correction de bogues :

Commencez par une version : 3.0.8. Puis, après cette version, faites ceci :

git branch bugfixes308

Cela créera une branche pour les corrections de bogues. Vérifiez la branche :

git checkout bugfixes308

Maintenant, faites tous les changements que vous voulez pour corriger les bogues.

git commit -a

Livrez-les, et revenez à la branche master :

git checkout master

Ensuite, tirez ces changements de l'autre branche :

git merge bugfixes308

De cette façon, vous disposez d'une branche de correction de bogues distincte pour chaque version, mais vous tirez toujours les modifications de correction de bogues dans votre tronc de développement principal.

11 votes

J'ai compris que le hash est le numéro de révision mais j'espérais que ce n'était pas le cas :-))) merci pour cette très bonne explication et pour la suggestion que vous faites maintenant pour régler ce problème.

3 votes

Vous êtes le bienvenu. J'étais très frustré par git quand je l'ai pris pour la première fois à partir de SVN, mais maintenant je fais l'inverse...

4 votes

AUSSI, cela fait un moment que j'ai posté ceci, mais rappelez-vous que vous pouvez aussi faire "git checkout -b new_branch_name" pour faire "git branch foo" et "git checkout foo" en une seule ligne.

107voto

Greg Hewgill Points 356191

El git describe crée un nom un peu plus lisible par l'homme qui fait référence à un commit spécifique. Par exemple, à partir de la documentation :

Avec quelque chose comme git.git current tree, j'obtiens :

[torvalds@g5 git]$ git describe parent
v1.0.4-14-g2414721

Par exemple, la tête actuelle de ma branche "parent" est basée sur la v1.0.4, mais comme elle a quelques commits en plus, describe a ajouté le nombre de commits supplémentaires ("14") et un nom d'objet abrégé pour le commit lui-même ("2414721") à la fin.

Tant que vous utilisez des balises judicieusement nommées pour marquer des versions particulières, on peut considérer que cela équivaut à peu près à un "numéro de révision" SVN.

8 votes

Je voudrais juste noter que cela fonctionne uniquement si votre git a déjà des balises ; si ce n'est pas le cas, vous risquez d'obtenir git describe échoue avec "fatal : No names found, cannot describe anything". - Stack Overflow ce qui signifie que vous devez configurer vous-même les balises.

14 votes

@sdaau : Si tu utilises ceci dans un script ou quelque chose et que tu veux git describe pour ne jamais échouer, utilisez le git describe --always option.

0 votes

Est-ce que la sortie de git describe être utilisé pour trouver le commit source, en quelque sorte ? A part compter manuellement les commits dans le journal, je veux dire.

68voto

OderWat Points 1363

Les autres posters ont raison, il n'y a pas de "revision-number".

Je pense que le meilleur moyen est d'utiliser les tags pour les "sorties" !

Mais j'ai utilisé les éléments suivants pour faux numéros de révision (juste pour que les clients puissent voir les révisions et la progression, car ils voulaient avoir les mêmes révisions croissantes de git que celles auxquelles ils étaient habitués par subversion).

Montrer la "révision actuelle" de "HEAD" est simulé en utilisant ceci :

git rev-list HEAD | wc -l

Mais que faire si le client me dit qu'il y a un bogue dans la "révision" 1302 ?

Pour cela, j'ai ajouté ce qui suit à la section [alias] de mon ~/.gitconfig :

show-rev-number = !sh -c 'git rev-list --reverse HEAD | nl | awk \"{ if(\\$1 == "$0") { print \\$2 }}\"'

en utilisant git show-rev-number 1302 imprimera alors le dièse pour la "révision" :)

J'ai fait un Blog Post (en allemand) sur cette "technique" il y a quelque temps.

0 votes

@Radek - "il faut parfois savoir ce que 'code change=commit' a corrigé" - puis git bisect (lien) est l'outil approprié pour identifier ce qui a été modifié, quand et par qui.

0 votes

@Radek Oui, c'est un nombre en constante augmentation. Il compte juste les révisions que vous avez validées sur le HEAD. Donc chaque commit est une nouvelle révision. Cela ne fonctionnera pas pour des branches différentes.

1 votes

J'aime votre solution. Veuillez noter que vous pouvez la simplifier : show-rev-number = !sh -c 'git rev-list --reverse HEAD | awk NR==$0'

28voto

I GIVE CRAP ANSWERS Points 12429

Git n'a pas le même concept de numéros de révision que subversion. Au lieu de cela, chaque instantané fait avec un commit est marqué par une somme de contrôle SHA1. Pourquoi ? Il y a plusieurs problèmes avec un revno en cours dans un système de contrôle de version distribué :

Tout d'abord, le développement n'étant pas du tout linéaire, l'attachement d'un nombre est un problème plutôt difficile à résoudre de manière à satisfaire votre besoin en tant que programmeur. Essayer de résoudre ce problème en ajoutant un nombre peut rapidement devenir problématique lorsque le nombre ne se comporte pas comme vous l'attendez.

Deuxièmement, les numéros de révision peuvent être générés sur différentes machines. Cela rend la synchronisation des numéros beaucoup plus difficile - d'autant plus que la connectivité est unidirectionnelle ; vous n'avez peut-être même pas accès à toutes les machines qui possèdent le référentiel.

Troisièmement, dans git, un peu à l'initiative du système OpenCM, aujourd'hui disparu, la fonction identité d'un commit (ce que le commit est) est équivalent à son nom (l'identifiant SHA). Ce site dénomination = identité Le concept est très fort. Lorsque vous êtes assis avec un nom de commit en main, il identifie également le commit d'une manière infalsifiable. Cela vous permet de vérifier tous vos commits jusqu'au premier initial pour corruption avec le git fsck comando.

Maintenant, puisque nous avons un DAG (Directed Acyclic Graph) de révisions et que celles-ci constituent l'arbre actuel, nous avons besoin de quelques outils pour résoudre votre problème : comment distinguer les différentes versions. Tout d'abord, vous pouvez omettre une partie du hachage si un préfixe donné, 1516bd disons, identifie de façon unique votre engagement. Mais ceci est aussi plutôt artificiel. A la place, l'astuce est d'utiliser des tags et/ou des branches. Une étiquette ou une branche est une sorte de "note jaune" que vous attachez à un commit SHA1-id donné. Les tags sont, par essence, censés être immobiles alors qu'une branche se déplace lorsque de nouveaux commits sont effectués dans son HEAD. Il existe des moyens de faire référence à un commit autour d'un tag ou d'une branche, voir la page de manuel de git-rev-parse.

Habituellement, si vous avez besoin de travailler sur un morceau de code spécifique, ce morceau est en cours de changement et devrait en tant que telle être une branche avec un nom de sujet parlant. La création de nombreuses branches (20-30 par programmeur n'est pas rare, avec 4-5 branches publiées pour que d'autres puissent travailler dessus) est le secret d'un git efficace. Chaque morceau de travail devrait commencer comme une branche à part entière et être ensuite fusionné lorsqu'il est testé. Les branches non publiées peuvent être entièrement réécrites et cette partie de destruction de l'histoire est une force de git.

Lorsque le changement est accepté en master elle se fige quelque peu et devient de l'archéologie. À ce stade, vous pouvez l'étiqueter, mais le plus souvent une référence au commit particulier est faite dans un bug tracker ou un issue tracker via la somme sha1. Les balises sont généralement réservées aux changements de version et aux points de branchement des branches de maintenance (pour les anciennes versions).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X