Aller au contenu

Session de travail avec GIT

I. On développe dans la branche master.

=> HEAD pointe sur la branche master

Penser à valider la copie de travail avant de changer de branche.

$ git commit -a -m 'validation'

II. On bascule dans la branche prob53 que l'on crée en même temps.

$ git checkout -b prob53
Switched to a new branch "prob53"

=> HEAD pointe sur la branche prob53

III. On réalise une modification ...

$ vim index.html
$ git commit -a -m 'ajout d'un pied de page [problème 53]'

… avant de retourner dans la branche master:

$ git checkout master
Switched to branch "master"

=> HEAD pointe sur la branche master

IV. On a un correctif à réaliser. On crée donc une nouvelle branche correctif:

$ git checkout -b 'correctif'
Switched to a new branch "correctif"

On réalise le correctif:

$ vim index.html
$ git commit -a -m "correction d'une adresse mail incorrecte"
[correctif]: created 3a0874c: "correction d'une adresse mail incorrecte"
 1 files changed, 0 insertions(+), 1 deletions(-)

=> HEAD pointe sur la branche correctif

V. On réalise des tests sur le projet pour s'assurer que la correction est efficace.

Si tout est ok, il est temps de la fusionner dans la branche master pour la déployer en production:

$ git checkout master
$ git merge correctif
Updating f42c576..3a0874c
Fast forward
 LISEZMOI |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

=> HEAD pointe sur la branche master

Git a réalisé un Fast forward

VI. master et correctif pointent sur le même commit, on peut supprimer la branche correctif:

$ git branch -d correctif
Deleted branch correctif (3a0874c).

VII. On rebascule sur la branche prob53 pour continuer à travailler sur le problème:

$ git checkout prob53
Switched to branch "prob53"
$ vim index.html
$ git commit -a -m 'Nouveau pied de page terminé [problème 53]'
[prob53]: created ad82d7a: "Nouveau pied de page terminé [problème 53]"
 1 files changed, 1 insertions(+), 0 deletions(-)

=> HEAD pointe sur la branche prob53

Les travaux réalisés dans correctif ne sont pas contenu dans les fichiers de la branche prob53. Si vous avez besoin de les y rapatrier, vous pouvez fusionner la branche master dans la branche prob53 en lançant la commande git merge master.

VIII. ... suite du développement ...

IX. Les travaux sur la branche prob53 sont terminés et prêt à être fusionnés avec master:

$ git checkout master
$ git merge prob53
Merge made by recursive.
 README |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

=> HEAD pointe sur la branche master

Git a réalisé une simple fusion à trois sources et créer un commit de fusion.

X. Le travail a été fusionné, on n'a plus besoin de la branche prob53. On peut l'effacer et fermer manuellement le ticket dans l'outil de suivi de faits techniques:

$ git branch -d prob53

APPENDIX:

Conflits:

Si on modifie différemment la même partie du même fichier dans les deux branches que l'on souhaite fusionner, Git ne sera pas capable de réaliser proprement la fusion.

$ git merge prob53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

Git n'a pas automatiquement créé le commit du fusion.

Il a arrêté le processus le temps que vous résolviez le conflit. Lancez git status pour voir à tout moment après l'apparition du conflit de fusion quels fichiers n'ont pas été fusionnés :

[master*]$ git status
index.html: needs merge
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# unmerged:   index.html
#

Tout ce qui comporte des conflits de fusion et n'a pas été résolu est listé comme unmerged.

Git ajoute des marques de conflit standard dans les fichiers qui comportent des conflits:

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
  please contact us at support@github.com
</div>
>>>>>>> prob53:index.html

Au-dessus de la ligne ======= : version dans HEAD (master)

Au-dessous de la ligne ======= : version dans prob53

<div id="footer">
please contact us at email.support@github.com
</div>

… résout le conflit.

Après avoir résolu chacune de ces sections dans chaque fichier comportant un conflit, lancez git add sur chaque fichier pour le marquer comme résolu.

Si vous souhaitez utiliser un outil graphique pour résoudre ces problèmes, vous pouvez lancer git mergetool qui démarre l'outil graphique de fusion approprié et vous permet de naviguer dans les conflits :

$ git mergetool

This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge
Merging:
index.html

Normal merge conflict for 'index.html':
  {local}: modified file
  {remote}: modified file
Hit return to start merge resolution tool (opendiff):

Après avoir quitté l'outil de fusion, Git vous demande si la fusion a été réussie. Si vous répondez par la positive à l'outil, il indexe le fichier pour le marquer comme résolu.

Vous pouvez lancer à nouveau la commande git status pour vérifier que tous les conflits ont été résolus :

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   index.html
#

Si cela vous convient et que vous avez vérifié que tout ce qui comportait un conflit a été indexé, vous pouvez taper la commande git commit pour finaliser le commit de fusion.

Merge branch 'prob53'

Conflicts:
  index.html
#
# It looks like you may be committing a MERGE.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
#

Dernière mise à jour: September 16, 2018