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 sujet topic
) et les rejoue ailleurs (généralement à la pointe de votre branche d'intégration, par exemple master
). La rebase
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 était topic
auparavant mais apparaissant enraciné en haut de la branche d'intégration. Cette nouvelle branche est toujours appelée topic
par GIT, de sorte que l'ancienne référence est supprimée. J'étiquette de manière informelle topic-0
l'état d'origine de votre agence topic-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 pour commit
et les options -i
et --autosquash
sur rebase
), ce qui vous donne la possibilité de réécrire vos validations d'une manière plus facile à réviser. Il en résulte une branche topic-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 de master
.
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:
- Aucun code obsolète en revue.
- Pas de fausses critiques sur les «fusions étrangères» (le phénomène que vous avez décrit au 1er).
- Possibilité de réécrire les commits d'une manière propre.
Les inconvénients:
- Au lieu d'une branche
topic-0
, il y a trois branches artefacts topic-0
, topic-1
et topic-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» lemaster
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.