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.

Il n'y aucun commentaire