Pense-Bête Git sur la gestion des branches
Le grand intérêt de Git c'est son système de branches, si on fait du git juste parce que c'est à la mode et qu'on a pas une forêt... ben fallait mieux rester sous SVN! J'exagère un peu mais l'idée est là.
On trouves plein de posts sur les manips classiques du style récupérer le dépôt, faire un commit... Et le but n'étant pas de faire une présentation de Git, ni de faire un tuto pour débutant, je me suis cantonnée à la gestion des branches principalement.
La façon que j'ai trouvé la plus pratique de présenter ce pense-bête est de définir des situations, puis de lister les manips à faire pour s'en sortir.
Toutes mes commandes partent du principe que les developpements se font sur la branche develop (pour que master reste une image de la production et que les merge de develop vers master ne se fasse que avant une mise en production comme le conseille cet article: http://nvie.com/posts/a-successful-git-branching-model/ qui fait reférence).
J'ai une fonctionnalité à faire
Je crée une branche!
git pull -–ff-only origin/develop #je mets ma branche à jour git fetch #je mets mon dépôt à jour git checkout -b feat-mafonctionnalite origin/develop #je crée une branche et je m'y positionne
Et je peux commencer à developper.
Oups, j'ai commencé à développer sans faire de branche
Pas de panique!!
Pour la création de nouveaux fichiers, aucun problème. Tant qu'ils ne sont pas tracker, git passent les fichiers de branches en branches sans broncher.
Pour les fichiers modifiés, c'est le moment de découvrir les stash.
git stash #je mets en ''cache'' mes modifs git checkout -b feat-mafonctionnalite origin/develop git stash apply #j'applique mes modifs sur ma nouvelle branche
Je n'ai pas mis à jour develop volontairement pour ne pas risquer de conflit.
Je peux mettre à jour ma branche?
Question délicate...
Tant qu'on a rien commité on peut toujours récupérer develop
git pull -–ff-only origin/develop
Par contre ensuite pour gérer correctement les conflits il faut faire un rebase et là même si c'est possible ce n'est pas recommandé de le faire plusieurs fois sur la même branche, comme on rejoue tous les commits depuis sa création...
Donc personnellement je dirais non.
Je peux partager?
Bien sûr!!
Vous pouvez toujours créer votre branche sur le dépôt distant:
git push origin feat-mafonctionnalite
De plus, cela fait une sauvegarde.
J'ai fini ma fonctionnalité
C'est le moment de mettre tout ça dans develop. La manipulation la plus délicate, à faire tranquillement, en prenant son temps...
On vérifie qu'on a tout commité, voir pushé et on se lance:
git checkout develop #on retourne sur develop git pull -–ff-only origin/develop #on met à jour git checkout feat-mafonctionnalite #on retourne sur notre branche git rebase develop
git applique les commits un par un dans une sorte de branche de transition.
Si un problème survient on verra dans les messages CONFLIT devant un/des nom de fichiers.
Dans ce cas on corrige le ou les fichiers dans n'importe quel éditeur puis:
git add mon_fichier_en_conflit git rebase --continue
Une fois que le rebase est terminée et que tout s'est bien passé
git checkout develop git merge --no-ff feat-mafonctionnalite git push origin develop
Comme les conflits ont été gérés dans la branche, le merg se fait sans encombre.
Je fais quoi de ma branche ensuite?
Quand on est sûr que le merge s'est bien passé et qu'on ne veut vraiment plus de la branche, on peux la supprimer (attention commandes à faire depuis une autre branche).
git branch -D feat-mafonctionnalite
Si on l'avait pushé, il faut aussi la supprimer du repository distant:
git push origin :feat-mafonctionnalite
Attention, il n'y a aucune confirmation sur ces commandes.
Une petite apparté sur les branches du repo distant.
La commande git fetch permet de mettre à jour son repo local par rapport aux nouvelles branches et à quel commit ils sont.
Pour visualiser les branches que l'on a sur son dépôt, la commande est:
git branch
Si on ajoute l'option -a on visualise toutes les branches présentent sur le repo distant.
Mais, bizarrement, si des branches sont supprimés sur le repo distant par d'autres personnes, elles sont toujours présentes lorsque l'on fait git branch -a.
Pour mettre à jour notre repository avec les suppressions, la commande est:
git fetch --prune
Voilà, je crois avoir fait le tour des commandes que j'utilise souvent pour gérer mes branches git.
Je compléterais peut être plus tard avec des cas un peu plus tordus.
Ajouter un commentaire