Mon équipe et moi utilisons des branches de fonctionnalités (avec git). Je me demande quelle est la meilleure stratégie de révision de code avant de fusionner pour maîtriser.
- Je vérifie une nouvelle branche du maître, appelons-la fb_ # 1
- Je m'engage plusieurs fois et que je veux le fusionner de nouveau pour le maîtriser
- Avant de fusionner, quelqu'un est censé faire une révision de code
Il y a maintenant 2 possibilités:
1er
- Je fusionne master à fb_ # 1 ( pas fb_ # 1 à master) pour le rendre le plus à jour possible
- Un coéquipier examine les changements entre la tête principale et la tête fb_ # 1
- Si fb_ # 1 est ok on fusionne fb_ # 1 pour master
- Avantages: aucun code obsolète en revue
- Inconvénients: si quelqu'un d'autre fusionne quelque chose entre "1". et "2." ses modifications apparaissent dans la revue, bien qu'elles appartiennent à une autre revue.
2e
- Un coéquipier examine les changements entre le point de paiement (git merge-base master fb_ # 1) et fb_ # 1 head
- Avantages: nous voyons exactement ce qui a été changé pendant le travail sur la branche de fonctionnalité
- Inconvénients: du code obsolète peut apparaître dans la revue.
Quelle manière pensez-vous est la meilleure et pourquoi ? Peut-être existe-t-il une autre approche plus appropriée?
la source
git show HEAD
. Comme ce sera le fm commit de fusion , il listera les deux parents. Donc, vous avez le hachage de mm . Alternativement, vous pouvez voir trivialement le parent dansgitk
ou tout autre navigateur git3e
Vous rebasez la branche sur le maître pour la mettre à jour et garder les modifications séparées.
Cela crée une nouvelle histoire de la branche. Ce seront de nouvelles révisions avec de nouveaux ID qui auront le même contenu, mais qui seront dérivées du dernier maître et ne seront pas liées aux anciennes révisions. Les anciennes révisions sont toujours accessibles dans "reflog" si vous devez vous y référer, par exemple parce que vous trouvez que vous avez fait une erreur dans la résolution des conflits. En plus de cela, ils ne valent rien. Git taille par défaut le reflog après 3 mois et supprime les anciennes révisions.
Vous utilisez un rebase interactif (
git rebase -i
etgit commit --amend
) pour réorganiser, modifier et nettoyer les modifications afin que chacune effectue une modification fermée logiquement.Cela crée à nouveau un nouvel historique, cette fois avec l'avantage supplémentaire que vous pouvez restructurer les modifications pour les rendre plus pertinentes pendant la révision.
Avantages:
Habituellement, le travail supplémentaire signifie que vous passez d'abord en revue le code vous-même, ce qui entraînera également de nombreux problèmes.
C'est ce que font Linux et Git. Et il n'est pas rare de voir des séries de 20 à 25 correctifs soumis pour examen et réécrits plusieurs fois dans ces projets.
En fait, Linux l'a fait dès le début du projet lorsque leur contrôle de version préféré était des tarballs et des correctifs. Lorsque de nombreuses années plus tard, Linus a décidé de créer git, c'était la principale raison de la mise en œuvre de la
rebase
commande et de sa variante interactive. De plus, git a une notion distincte d' auteur et de committer . L'auteur est celui qui a créé la révision en premier et le committer est celui qui l'a touchée en dernier. Étant donné que sous Linux et Git, les correctifs sont toujours envoyés par e-mail, les deux ne sont presque jamais la même personne.la source
merge --no-ff
qui montrera clairement que la branche sur master au lieu de la fonctionnalité disparaît simplement dans le reste des--no-ff
a ses avantages et ses inconvénients. Personnellement, je trouve ça plus de bruit qu'autre chose. YMMV.Il y a en fait une troisième possibilité - et probablement beaucoup d'autres, car GIT est plus une implémentation d'un cadre SCM qu'une implémentation d'une méthodologie SCM. Cette troisième possibilité est basée sur
rebase
.La
rebase
sous-commande GIT prend une série de validations (généralement de votre point de branchement à la pointe de votre branche de sujettopic
) et les rejoue ailleurs (généralement à la pointe de votre branche d'intégration, par exemplemaster
). Larebase
sous-commande génère de nouveaux validations, ce qui donne la possibilité de réorganiser les validations sous une forme plus facile à examiner. Cela donne une nouvelle série de commit, similaire à ce qui étaittopic
auparavant mais apparaissant enraciné en haut de la branche d'intégration. Cette nouvelle branche est toujours appeléetopic
par GIT, de sorte que l'ancienne référence est supprimée. J'étiquette de manière informelletopic-0
l'état d'origine de votre agencetopic-1
et ainsi de suite ses différents refactoring.Voici ma suggestion pour votre
topic
branche:(Étape facultative) Vous rebasez de manière interactive votre branche de sujet
topic
sur son point de branchement (voir l'--fixup
option pourcommit
et les options-i
et--autosquash
surrebase
), ce qui vous donne la possibilité de réécrire vos validations d'une manière plus facile à réviser. Il en résulte une branchetopic-1
.Vous rebasez votre branche de sujet en haut de votre branche d'intégration, c'est comme faire une fusion, mais «ne pollue pas» l'histoire avec une fusion qui n'est qu'un artefact d'ingénierie logicielle. Il en résulte une branche
topic-2
.Envoyer
topic-2
à un coéquipier qui l'examine contre la pointe demaster
.Si tout
topic-2
va bien, fusionnez-le avec master.REMARQUE Les branches - où branche fait référence à l'arbre de validation - seront toutes appelées de la même manière par GIT. Ainsi, à la fin du processus, seule la branche
topic-2
a un nom dans GIT.Avantages:
Les inconvénients:
topic-0
, il y a trois branches artefactstopic-0
,topic-1
ettopic-2
qui sont créés dans le commettras arbre. (Bien qu'à tout moment, un seul d'entre eux ait un nom dans GIT.)Dans votre 1er scénario «si quelqu'un a fusionné quelque chose entre« 1 ». et "2." »fait référence au temps qui s'écoule entre la création du point de branchement et le moment où vous décidez de fusionner. Dans ce scénario «si quelqu'un a fusionné quelque chose entre« 1 ». et "2." »se réfère à l'intervalle de temps entre le rebase et la fusion, qui est généralement très court. Ainsi dans le scénario que je propose, vous pouvez «verrouiller» le
master
branche pour le temps de la fusion sans perturber significativement votre workflow, alors que cela n'est pas pratique dans le 1er scénario.Si vous faites des revues de code systématiques, c'est probablement une bonne idée de réorganiser les commits de manière adéquate (étape facultative).
La gestion des artefacts de branche intermédiaire ne présente une difficulté que si vous les partagez entre les référentiels.
la source
topic-0
,topic-1
et lestopic-2
branches. A la seconde où le rebase est terminé, la version précédente n'a plus d'importance. Donc , tout ce qu'il y aurait esttopic@{1}
,topic@{2}
,topic@{yesterday}
,topic@{3.days.ago}
etc. pour sauver vos fesses si vous trouvez que vous déconné la résolution des conflits dans le rebasage.topic
. Parce que branch in git n'est que le nom.topic
I étiquetée dans GIT, il est toujours l' une des branches (une branche comme COMMIT arbre, pas comme référence GIT)topic-0
,topic-1
,topic-2
.