---
title: "Tutoriel git <small><br> <hr> [introduction](index.html) | [installation](installation.html) | [dépôt local](depot_local.html) | [dépôt distant](depot_distant.html) | [branches](branches.html) | [forks](forks.html) <hr> </small>"
output:
    toc: true
---

* * * * *

# Forks 

Imaginons que Julien propose un dépôt public, visible par tout le monde, mais
non modifiable (pour éviter que n'importe qui y fasse n'importe quoi).  Si
Fabien (à qui il arrive parfois de faire n'importe quoi) veut proposer une
modification, il peut alors copier le dépôt de Julien (fork), faire ses
modifications dans son dépôt, puis les soumettre à Julien (pull request), qui
choisira ou non de les intégrer dans le dépôt initial (upstream).

Le fork est un mode de fonctionnement très répandu dans le monde de
l'open-source (github entre autres).
Le serveur gogs du SCOSI possède également une partie publique mais visible
après connexion (donc réservée aux étudiants et personnels de l'université).

Attention : pour les intervenants réguliers et de confiance, il est plus simple
de les autoriser à modifier directement le dépôt principal, en les ajoutant
comme collaborateurs (les deux systèmes sont complémentaires). 

## Forker un dépôt distant

Le dépôt de Julien est déjà sur le serveur, dans la partie publique. Fabien se
connecte sur le site gogs du SCOSI.  

![](forks_01.png)

Il explore la zone publique et sélectionne le dépôt de Julien.

![](forks_02.png)

Il demande de forker le projet.

![](forks_03.png)

Ce qui lui crée un nouveau dépôt...

![](forks_04.png)

... qui est une copie du dépôt initial.

![](forks_05.png)

Fabien peut ensuite cloner son nouveau dépôt...

![](forks_06a.png)

... y faire ses modifications, **de préférence dans une nouvelle branche**, ...

![](forks_06b.png)

... et les pusher sur son dépôt distant.

![](forks_06c.png)

## Envoyer un pull request

Un pull request est une demande d'intégrer une modification d'un dépôt forké
dans le dépôt initial (upstream).

Jusqu'ici, Fabien a forké le dépôt de Julien et fait des modifications sur son
dépôt forké. Pour soumettre ses modifications, il va sur la page correspondant
à son dépôt et clique sur le bouton pull request.

![](forks_07.png)

Il met un message pour Julien, expliquant ses modifications (ou pas).

![](forks_08.png)

Puis le pull request est envoyé à Julien.

![](forks_09.png)

## Gérer un pull request

De son côté, Julien reçoit le pull request de Fabien, pour le dépôt initial.

![](forks_j10.png)

Il peut alors regarder les modifications proposées, échanger des messages avec
Fabien puis finalement accepter (ou refuser) les modifications.

![](forks_j11.png)

Si le pull request est accepté, la modification est fusionné dans le dépôt.

![](forks_j12.png)

Elle apparait alors dans la liste des commits. 

![](forks_j13.png)

Si les modifications du fork ont été faites dans une nouvelle branche, il ne
faut pas oublier de fusionner dans la branche master sur le dépôt upstream. 

## Mettre à jour un dépôt forké, spécifier manuellement les dépots distants

Après un fork, les deux dépôts (fork et upstream) peuvent évoluer
indépendamment.  Pour récupérer les modifications du dépôt initial dans le
dépôt forké, il suffit de l'ajouter comme dépôt distant (généralement, on
utilise le nom "upstream") :

```
git remote add upstream https://gogs.univ-littoral.fr/jdehos/tutoriel_git
```

On peut ensuite récupérer les évolutions de upstream et les fusionner dans le
dépôt forké :

```
git fetch upstream
git merge upstream/master
```

Cette gestion des dépôts distants est très puissante. Elle permet, par exemple, de
créer un dépôt public et un dépôt privé pour un même projet et de les
synchroniser. Elle permet également de gérer un pull request manuellement (par
exemple pour fusionner dans une branche différente que celle du pull request) :

```
git remote add fork_fabien https://gogs.univ-littoral.fr/fteytaud/tutoriel_git
git fetch fork_fabien
git branch pull_request_fabien
git checkout pull_request_fabien
git merge fork_fabien/master
```


## Résumé et méthode de travail

Résumé des commandes git précédentes :

---|---|
`git remote add ...` | TODO |
`git fetch ...` | |
`git merge ...` | |

Quelques conseils de méthode de travail :

- TODO

## Exercice

TODO

* * * * *

[Retour au début de la page](#header)

[Retour à la page d'accueil](../../index.html)

Dernière mise à jour : 2016-03-05

