---
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 (forker) le dépôt de Julien, 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 de l'université possède
également une partie publique propice aux forks (cette partie publique est
cependant réservée aux personnes ayant des identifiants à l'université).

Remarque : 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 (forks et collaboration) 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 de l'université.  

![](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 permet de demander d'intégrer d'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 d'ailleurs).

![](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ée 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 la fusionner dans le master, sur le dépôt upstream.

En cas de conflit, le pull request doit être intégré manuellement (voir section
suivante).

## 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 nouvelles 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 du dépôt 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, pour un même projet, un dépôt distant public et un dépôt distant privé
(éventuellement sur des serveurs différents) et de les synchroniser. 

Ainsi, pour 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 <nom> <url>` | ajoute un dépôt distant |
`git fetch <nom>` | récupère les commits d'un dépôt distant |

Quelques conseils de méthode de travail :

- ajoutez les membres du projet comme collaborateurs du dépôt distant
- pour les dépôts publics, utilisez les pull requests pour récupérer les
  éventuelles contributions de la communauté

## Exercice 1

- associez-vous à un ou deux collègues : l'un d'entre vous va créer un dépôt
  public, les autres vont le forker et soumettre des pull-requests

## Exercice 2

- créez deux dépôts distants, l'un publique, l'autre privé
- clonez le dépôt privé, faites-y quelques commits et pushez le tout
- toujours dans le dépôt privé local, créez une branche "public", fusionnez-y
  le master et pushez-la sur le dépôt distant privé et sur le dépôt distant
public
- faites un nouveau commit dans le master, fusionnez-le dans la branche
  "public" et pushez le tout
- clonez le dépôt public et mettez-le à jour avec la branche "public" du dépôt
  distant privé

* * * * *

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

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

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

