# Session de travail avec GIT



I. On développe dans la branche **master**.

=> <u>HEAD pointe sur la branche **master**</u>

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

```bash
$ git commit -a -m 'validation'
```



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

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

=> <u>HEAD pointe sur la branche **prob53**</u>



III. On réalise une modification ...

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

… avant de retourner dans la branche **master**:

```bash
$ git checkout master
Switched to branch "master"
```

=> <u>HEAD pointe sur la branche **master**</u>



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

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

On réalise le correctif:

```bash
$ 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(-)
```

=> <u>HEAD pointe sur la branche **correctif**</u>



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:

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

=> <u>HEAD pointe sur la branche **master**</u>

*Git a réalisé un Fast forward*



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

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



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

```bash
$ 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(-)
```

=> <u>HEAD pointe sur la branche prob53</u>

*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**:

```bash
$ 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 <u>commit de fusion</u>.*



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

```bash
$ 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.

```bash
$ 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 :

```bash
[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:

```html
<<<<<<< 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

```html
<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 :

```bash
$ 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 :

```bash
$ 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.

```bash
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.
#
```

