Description: ce document contient des instructions git en ligne de commande pour un travail collaboratif sur un dépôt commun, après avoir créé un dépôt distant, et après avoir générer le dépôt sur la machine locale et établit le pont entre les deux. Il est possible de reproduire les principes décrits, sans ligne de commande, en utilisant uniquement l'interface utilisateur web des services GIT distants (ithub, Gitlab, Gitea, Bitbucket, ...). Il existe aussi d'autres façon d'utiliser GIT de façon collaborative. ---- ====== Instructions GIT en ligne de commande recommandées pour un travail collaboratif via un dépôt GIT distant commun unique ====== **Contexte:** Un dépôt GIT distant commun est créé. Des personnes contribuent à plusieurs sur ce dépôt distant, en faisant des modifications sur leurs machines locales, et en établissant des ponts avec le dépôt distant, en ligne de commande. **Pré-requis:** * Un dépôt GIT distant est créé * Les réglages de ce dépôt GIT distant sont réalisés (création des 2 branches éternelles, protégées, celle qui n'est pas "master" a le statut "par défaut") * Les personnes qui contribuent à distance de façon participative collaborative au dépôt GIT distant depuis leur machine locale, savent utiliser les lignes de commandes de GIT sur leur machine locale. ===== Convention pour le nommage des branches ===== ==== Nom des deux branches éternelles ==== * `master` - doit être protégée sur le dépôt distant * `develop` - branche à créer sur le dépôt distant, lui donner le statut de "branche par défaut", et la protéger sur le dépôt distant Nota: la branche "develop" peut avoir un autre nom, celui que vous voulez. Dans ce cas, il faut adapter tout ce qui suit avec cet autre nom. ==== Nom des branches éphémères ==== === Exemple de principe général pour les noms des branches éphémères: === * "`NOM-CATEGORIE-DE-LA-BRANCHE`" (+) "`/`" (+) "`Nom-De-La-Branche`" "`NOM-CATEGORIE-DE-LA-BRANCHE`" en majuscule dont les mots sont séparés par des tirets du 6 ("`-`"), suivi du séparateur "`/`", suivi du "`Nom-De-La-Branche`" en minuscule dont les mots sont séparés par des tirets du 6 ("`-`"). === Exemple de 3 uniques catégories de branches éphémères: === * **PROPOSITIONS** # branche éphémère pour proposer des améliorations * **VERSIONNAGE** # branche éphémère pour préparer une version * **CORRECTIF** # branche éphémère pour effectuer une correction sur une version === Exemple de noms de branches éphémères: === * PROPOSITION/ma_jolie_proposition * VERSIONNAGE/3.0.beta.2 * CORRECTIF/3.0.beta.3 * PROJET/10_caracteristiques ==== Exemple de principe de numérotage des versions ==== * [MAJEUR].[MINEUR].[CORRECTIF]-[phases].[Numéro de phase] * [MAJEUR]= 0 => pré-versions d'essais, de dev, de brouillon, etc ... * [phases]: pre-alpha < alpha < beta < rc * Hiérarchie: 1.0.0-pre-alpha < 1.0.0-pre-alpha.1 < 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0. ===== Enchaînement du workflow GIT en lignes de commandes ===== **Rappel:** l'enchaînement des commandes GIT ci-dessous, s'envisage lorsqu'un dépôt distant est ouvert, qu'il a été configuré de ses deux branches éternelles, et que plusieurs personnes effectuent un travail collaboratif via ce dépôt GIT distant à partir de leurs machines locales. ==== Mettre à jour le dépôt local ==== ``` git checkout master git pull origin master git status git checkout develop git pull origin develop git status ``` ==== Créer une proposition ==== Prendre connaissance de la convention des noms des branches (ci-dessus). Puis: ``` git checkout develop git branch -a git branch PROPOSITION/Nom-De-La-Proposition git checkout PROPOSITION/Nom-De-La-Proposition git push -u origin PROPOSITION/Nom-De-La-Proposition ``` ==== Travaillez sur votre proposition ==== === Produire le contenu de la proposition en local === Produisez vos contenus, ajoutez, supprimez, modifiez, etc ... === Enregistrer les changements en local === ``` git checkout PROPOSITION/Nom-De-La-Proposition git add -A . git commit -m "commentaire descriptif" ``` === Régulièrement, rembobiner === Attention: bien écrire la commande rebase en plaçant un "/" devant la branche concernée par le rembobinage. Sinon, vous aurez des erreurs. ``` git checkout PROPOSITION/Nom-De-La-Proposition git fetch origin git rebase origin/master git rebase origin/develop git rebase origin/PROPOSITION/Nom-De-La-Proposition ``` Si conflits, résolvez ! === Partager sur le site distant pour favoriser le travail collaboratif et obtenir des avis: === Plus c'est partagé tôt, mieux c'est ! Cela permet aux autres de savoir ce que vous faites. Cela peut leur donner des idées d'améliorations à partager avec vous. ``` git checkout PROPOSITION/Nom-De-La-Proposition git push -u origin PROPOSITION/Nom-De-La-Proposition ``` === Répéter autant de fois que nécessaire === Répétez les étapes du workflow de production de votre proposition, autant de fois que vous le souhaitez, tout au long de la progression de vos travaux de production. ==== Prépararer la fusion ==== === Faire un dernier rembobinage: === Attention: bien écrire la commande rebase en plaçant un "/" devant la branche concernée par le rembobinage. Sinon, vous aurez des erreurs. ``` git checkout PROPOSITION/Nom-De-La-Proposition git fetch origin git rebase origin/master git rebase origin/develop git rebase origin/PROPOSITION/Nom-De-La-Proposition ``` Si conflits, résolvez ! === Demander une autorisation de fusion, une fois le travail accompli ! === ``` git checkout PROPOSITION/Nom-De-La-Proposition git push -o merge_request.create -o merge_request.target=PROPOSITION/Nom-De-La-Proposition ``` === Effectuer les modifications demandées === S'il vous est demandé de faire des modifications, re-travaillez votre proposition, effectuez les éventuelles modifications demandées, recommencez les étapes relatives à la production de la proposition, puis rembobinez, puis redemandez une autorisation de fusionner votre branche dans `develop`. Recommencez ces opérations tant que l'autorisation de fusion n'est pas obtenue. Une fois que tout va bien, passez à l'étape d'après. ==== Fusionner ==== une fois l'autorisation de fusion obtenue **A T T E N T I O N - D A N G E R !!!** Ne faites pas ce qui suit si vous avez l'intention de revenir sur votre branche pour continuer des travaux. Si vous voulez continuer à travailler sur votre branche, continuez à répéter les instructions précédentes. **Sinon, vous allez au devant de grandes difficultés !!!** ``` git checkout PROPOSITION/Nom-De-La-Proposition git rebase -i develop git checkout develop git pull origin develop git merge --no-ff PROPOSITION/Nom-De-La-Proposition git push origin develop git branch -d PROPOSITION/Nom-De-La-Proposition git push origin --delete PROPOSITION/Nom-De-La-Proposition ``` ==== Versionner ==== === Choisir un numéro de version === Informez-vous sur la convention de numéros des versions - voir début de document. Puis, regardez dans la liste des versions existantes: ``` git checkout develop git tag ``` Décidez d'un nouveau numéro de version, arrivant à la suite des précédents selon la liste [NumVersion]. === Repérer le numéro abbrégé du commit pour la version === ``` git checkout develop git log --abbrev-commit ``` Décidez du numéro de commit sur lequel versionner [NumCommit] === Procéder au versionnage === ``` git checkout develop git branch VERSIONNAGE/NumVersion NumCommit git checkout VERSIONNAGE/NumVersion git tag NumVersion git checkout develop git merge VERSIONNAGE/NumVersion git push --tags origin develop git branch -d VERSIONNAGE/NumVersion git checkout master git merge --f-only NumVersion ``` ==== Corriger des versions publiées ==== Utilisez ces instructions de "correctifs", uniquement pour appliquer des correctifs rapides à une version publiée (notion de rustine, de patch, de hot-fix). Si vous envisagez de produire d'importantes modifications, alors ce ne sont pas des correctifs, mains plutôt de nouveaux travaux de production d'une nouvelle version. Dans ce cas, il vous faut vous référer aux sections précédentes. === Déterminer correctement le numéro de correctif à appliquer === Repérez le numéro de la version sur laquelle vous allez opérer un correctif: ``` git checkout master git tag ``` Le numéro de correctif [NumCorrectif], que vous allez appliquer, est le numéro de version à corriger augmenté d'un cran supérieur (exemple: 2.1.0 -> 2.1.1; 0.1.pre-alpha.1 -> 0.1.pre-alpha.2) === Créer la branche du correctif à produire === ``` git branch CORRECTIF/NumCorrectif master git checkout CORRECTIF/NumCorrectif ``` === Appliquer le correctif === ``` git checkout CORRECTIF/NumCorrectif git tag NumCorrectif git checkout develop git merge CORRECTIF/NumCorrectif git push --tags origin develop git branch -d CORRECTIF/NumCorrectif git checkout master git merge --ff-only NumCorrectif ``` ===== Voir aussi ===== * ===== Sources, inspirations, remerciements: ===== * [le workflow "oneflow" d'endoflineblog.com](https://www.endoflineblog.com/oneflow-a-git-branching-model-and-workflow) * [le workflow "simple git workflow d'Atlasian.com"](https://www.atlassian.com/blog/git/simple-git-workflow-simple) {{tag>[git]}}