Skip to content

quick start 03 branches

Julien Castiaux edited this page Mar 1, 2023 · 1 revision

Démarrage - Branches & Pull-Request

Ce tutoriel vous accompagne dans la collaboration à plusieurs sur un projet hébergé sur Github. À la différence du précédent tutoriel où tous les commits se faisaient directement sur la branche principale (main/master), ce tutoriel-ci s'intéresse à l'utilisation des branches pour mieux structurer le travail en cours et également également résoudre les nombreux autres désavantages listés dans le point [aller plus loin] du précédent tutoriel.

Ce tutoriel est le dernier tutoriel de cette série "Démarrage" et il repose sur les deux précédents tutoriels.

Préparation

Comme dans le précédent tutoriel, nous allons simuler plusieurs personnes qui collaborent en réutilisant les deux dossiers du tuto précédent: sandbox et bacasable. Assurez vous que l'état est identique dans les deux dossier (status et log), si ce n'est pas le cas vous pouvez repartir d'une base propre en supprimant les deux dossiers et en re-clonant le projet deux fois.

~/Ephec/sandbox$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
~/Ephec/sandbox$ git log --oneline
bd8f074 (HEAD -> main, origin/main, origin/HEAD) Merge branch 'main' of https://github.com/julien00859/sandbox
6d47ef0 doc(README): greeting from sandbox
45e6af4 doc(README): greeting from bacasable
b76619e doc(README): better greeting
daaec07 doc(README): greet new users
0efccf0 Initial commit

 

~/Ephec/bacasable$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
~/Ephec/bacasable$ git log --oneline
bd8f074 (HEAD -> main, origin/main, origin/HEAD) Merge branch 'main' of https://github.com/julien00859/sandbox
6d47ef0 doc(README): greeting from sandbox
45e6af4 doc(README): greeting from bacasable
b76619e doc(README): better greeting
daaec07 doc(README): greet new users
0efccf0 Initial commit

Création des nouvelle branches

Nous allons créer deux branches, chacune dans son dossier (l'une dans sandbox, l'autre dans bacasable) et nous allons rajouter un commit dans chaque branche. Le premier commit rajoutera un document pour expliquer comment contribuer au projet tandis que le second viendra rajouter une licence. Pour que l'exercice soit plus réaliste, nous allons faire en sorte qu'il y ait des conflits entre les deux branches pour pouvoir apprendre à les résoudre.

Vous pouvez vous positionner dans le dossier sandbox et vous déplacer sur une nouvelle branche (en la créant à la volée) avec git switch et l'option -c/--clear. Pour pouvoir s'y retrouver plus facilement, nous vous conseillons de commencer vos noms de branches par votre prénom.

~/Ephec/sandbox$ git switch -c julien/doc/how-to-contribute
Switched to a new branch 'julien/doc/how-to-contribute'
~/Ephec/sandbox$ git status
On branch julien/doc/how-to-contribute
nothing to commit, working tree clean

Nous vous faisons confiance pour reproduire les mêmes manipulations que nous et qui mènent au même git show que nous. C'est à dire créer le fichier CONTRIBUTING.md avec la même diff que ci-dessous et modifier le fichier README.md avec également la même diff que ci-dessous. Nous ne nous attardons toujours pas sur le message de commit.

~/Ephec/sandbox$ git show
commit c7d8d6f6b950a1c41108df6dd54d93d3c9d17198 (HEAD -> julien/doc/how-to-contribute)
Author: Julien Castiaux <j.castiaux@ephec.be>
Date:   Sun Feb 26 20:53:41 2023 +0100

    doc(CONTRIBUTING): steps to contribute

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..1dd49d2
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,6 @@
+# Comment contribuer
+
+Ouvrez une issue pour discuter des changements à apportez. Quand tout le monde
+est d'accord et que le travail à réalisé a été correctement identifié, vous
+pouvez alors *fork* le projet, créer une branche, apporter les changements
+désirés et les proposer via une *pull-request*.
diff --git a/README.md b/README.md
index df9e829..49e3b38 100644
--- a/README.md
+++ b/README.md
@@ -4,3 +4,5 @@ Un bac-à-sable pour s'entrainer avec git et github
 Bonjour tout le monde
 
 depuis sandbox et bacasable
+
+Les [contributions](CONTRIBUTING.md) sont bienvenues !

Prenons un instant pour lire le résultat au niveau du git log avec l'option --graph:

~/Ephec/sandbox$ git log --oneline --graph
* c7d8d6f (HEAD -> julien/doc/how-to-contribute) doc(CONTRIBUTING): steps to contribute
*   bd8f074 (origin/main, origin/HEAD, main) Merge branch 'main' of https://github.com/julien00859/sandbox
|\  
| * 6d47ef0 doc(README): greeting from sandbox
* | 45e6af4 doc(README): greeting from bacasable
|/  
* b76619e doc(README): better greeting
* daaec07 doc(README): greet new users
* 0efccf0 Initial commit

Intuitivement nous nous serions attendu à ce que git nous affiche notre nouveau commit avec un bifurcation vers la droite, de la même manière que doc(README): greeting from sandbox. Nous nous serions attendu à ce résultat plutôt:

  * c7d8d6f (julien/doc/how-to-contribute) doc(CONTRIBUTING): steps to contribute
 /  
*   bd8f074 (origin/main, origin/HEAD) Merge branch 'main' of https://github.com/julien00859/sandbox

Git n'a pas affiché ce résultat car les historiques entre la branche julien/doc/how-to-contribute et main n'ont pas divergés. La branche main est uniquement en retard par rapport à la branche julien/doc/how-to-contribute. Il affiche donc les deux branches sur une même ligne. L'important n'est donc pas tellement les bifurcations gauche/droite mais bel et bien les étiquettes sur les commits. En étudiant les étiquettes ((HEAD -> julien/doc/how-to-contribute) et (origin/main, origin/HEAD, main)) et en étudiant l'enchaînement des commits, nous constatons que l'historique est cohérent avec les manipulations que nous avons fait en ligne de commande.

Pour avoir un affichage tel que "nous le voudrions" (visualiser la branche avec une bifurcation vers la droite). Nous pouvons retourner sur la branche main et rajouter un commit vide, ça aura pour effet de faire diverger les deux branches et donc d'avoir un affichage attendu (vous devrez utiliser l'option --all en plus).

~/Ephec/sandbox$ git switch main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
~/Ephec/sandbox$ git commit --allow-empty -m "empty commit"
[main c35fbf7] empty commit

~/Ephec/sandbox$ git log --oneline --graph --all
* c35fbf7 (HEAD -> main) empty commit
| * c7d8d6f (julien/doc/how-to-contribute) doc(CONTRIBUTING): steps to contribute
|/  
*   bd8f074 (origin/main, origin/HEAD) Merge branch 'main' of https://github.com/julien00859/sandbox
|\  
| * 6d47ef0 doc(README): greeting from sandbox
* | 45e6af4 doc(README): greeting from bacasable
|/  
* b76619e doc(README): better greeting
* daaec07 doc(README): greet new users
* 0efccf0 Initial commit

Maintenant que nous avons compris ce petit détail, nous pouvons annuler ce commit vide et revenir sur la branche julien/doc/how-to-contribute

~/Ephec/sandbox$ git reset HEAD~1
~/Ephec/sandbox$ git switch julien/doc/how-to-contribute

Création des pull-request

Vous pouvez maintenant envoyer votre branche sur Github. La première fois que vous envoyez une branche, vous devez préciser le remote, le nom de la branche locale et le nom de la branche distante, vous devez aussi rajouter l'option --set-upstream pour configurer git afin que tous les futurs push/pull à partir de cette branche locale se fassent automatiquement sur le même remote/branche-distante. Si vous ne précisez pas de branche distante, git utilisera le même nom de branche que localement. Ici nous allons utiliser le même nom de branche. git push --set-upstream <remote> <local>[:remote].

~/Ephec/sandbox$ git push --set-upstream origin julien/doc/how-to-contributeEnumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 684 bytes | 684.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote: 
remote: Create a pull request for 'julien/doc/how-to-contribute' on GitHub by visiting:
remote:      https://github.com/Julien00859/sandbox/pull/new/...
remote: 
To https://github.com/Julien00859/sandbox.git
 * [new branch]      julien/doc/how-to-contribute -> julien/doc/how-to-contribute
Branch 'julien/doc/how-to-contribute' set up to track remote branch 'julien/doc/how-to-contribute' from 'origin'.

Remarquez que Github vous propose de directement créer une pull-request en suivant un lien dans votre console. "Create a pull request for 'julien/doc/how-to-contribute' on GitHub by visiting https://github.com/Julien00859/sandbox/pull/new/..."

Nous vous invitons à vous rendez à cette URL, vous arrivez sur une page pour créer une nouvelle pull-request. Soyez attentif à la première ligne en haut de l'écran, il s'agit de l'endroit où vous devez préciser depuis quelle branche (à droite) créer la PR et vers quelle branche (à gauche) les commits devront être mergés. Vérifiez donc que vous voulez ouvrir une PR vers main et depuis votre branche (julien/doc/how-to-contribute dans notre cas). Vous pouvez alors créer la PR.

pull request

Une fois la PR créée, laissez-la ouverte et revenez au bureau. Ouvrez alors le dossier bacasable dans votre terminal et cette fois-ci encore, créez une branche nommée julien/doc/license basée sur main avec un commit pour la licence à la manière suivante:

~/Ephec/bacasable$ git show
commit d2904ed1be0ed2d4ef42421aec5b5234c76193f2 (HEAD -> julien/doc/license)
Author: Julien Castiaux <julien.castiaux@gmail.com>
Date:   Mon Feb 27 18:02:08 2023 +0100

    doc(README): include license

diff --git a/README.md b/README.md
index df9e829..7e91c55 100644
--- a/README.md
+++ b/README.md
@@ -4,3 +4,8 @@ Un bac-à-sable pour s'entrainer avec git et github
 Bonjour tout le monde
 
 depuis sandbox et bacasable
+
+## Licence
+
+Ce projet ainsi que le wiki adjacent est mis à disposition sous la
+[Licence MIT](LICENSE)

Envoyez alors votre branche sur github et via le lien, créez la pull-request:

~/Ephec/bacasable$ git push --set-upstream origin julien/doc/license 
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 441 bytes | 441.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote: 
remote: Create a pull request for 'julien/doc/license' on GitHub by visiting:
remote:      https://github.com/Julien00859/sandbox/pull/new/...
remote: 
To https://github.com/Julien00859/sandbox.git
 * [new branch]      julien/doc/license -> julien/doc/license
Branch 'julien/doc/license' set up to track remote branch 'julien/doc/license' from 'origin'.

pull request

Merge d'une pull-request et constatation du conflit

Vous pouvez retourner dans l'onglet où vous aviez préparer la première pull-request, celle pour le fichier CONTRIBUTING.md, et merger cette PR en utilisant la stratégie Merge pull-request qui s'appelle également Create a merge commit dans le menu déroulant. Les différences entre merge, squash et rebase ne sont pas discutées ici, gardez juste en tête que create a merge commit n'est pas idéale avec la méthodologie feature-branch qui est enseigné dans ce cours. Ce seront des considérations pour plus tard.

Mergez donc la pull-request "doc(CONTRIBUTING): steps to contribute" avec la technique Merge pull-request/Create a merge commit et déplacez vous sur la seconde pull-request, celle pour la licence.

Vous devriez constater (peut-être après une seconde ou un rafraîchissement de la page, le temps que Github se rende compte du problème) qu'il n'est plus possible de merger la pull-request depuis l'interface de Github à cause d'un conflit dans le fichier README.md

conflit

Github propose un bouton pour corriger ce conflit, utiliser ce bouton aura pour effet de créer un nouveau commit sur la branche, nous ne voulons pas avoir un commit juste pour corriger un conflit. Nous allons donc résoudre le conflit directement sur l'ordinateur et en profiter pour apprendre une nouvelle technique de fusion de branches, le rebase.

Sur votre ordinateur, dans chacun de vos dossiers sandbox et bacasable, déplacez vous sur la branche main dans chacune des branches et récupérez les changements avec git pull.

Dans le dossier sandbox:

~/Ephec/sandbox $ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

~/Ephec/sandbox $ git pull
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (4/4), 1.04 KiB | 1.04 MiB/s, done.
From https://github.com/Julien00859/sandbox
   bd8f074..a1f3ea4  main               -> origin/main
 * [new branch]      julien/doc/license -> origin/julien/doc/license
Updating bd8f074..a1f3ea4
Fast-forward
 CONTRIBUTING.md | 6 ++++++
 README.md       | 2 ++
 2 files changed, 8 insertions(+)
 create mode 100644 CONTRIBUTING.md

~/Ephec/sandbox $ git log --oneline
a1f3ea4 (HEAD -> main, origin/main, origin/HEAD) Merge pull request #1 from Julien00859/julien/doc/how-to-contribute
c7d8d6f (origin/julien/doc/how-to-contribute, julien/doc/how-to-contribute) doc(CONTRIBUTING): steps to contribute
bd8f074 Merge branch 'main' of https://github.com/julien00859/sandbox
6d47ef0 doc(README): greeting from sandbox
45e6af4 doc(README): greeting from bacasable
b76619e doc(README): better greeting
daaec07 doc(README): greet new users
0efccf0 Initial commit

Dans le dossier bacasable:

~/Ephec/bacasable$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

~/Ephec/bacasable$ git pull
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 2), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (5/5), 1.15 KiB | 391.00 KiB/s, done.
From https://github.com/Julien00859/sandbox
   bd8f074..a1f3ea4  main                         -> origin/main
 * [new branch]      julien/doc/how-to-contribute -> origin/julien/doc/how-to-contribute
Updating bd8f074..a1f3ea4
Fast-forward
 CONTRIBUTING.md | 6 ++++++
 README.md       | 2 ++
 2 files changed, 8 insertions(+)
 create mode 100644 CONTRIBUTING.md

~/Ephec/bacasable$ git log --oneline
a1f3ea4 (HEAD -> main, origin/main, origin/HEAD) Merge pull request #1 from Julien00859/julien/doc/how-to-contribute
c7d8d6f (origin/julien/doc/how-to-contribute) doc(CONTRIBUTING): steps to contribute
bd8f074 Merge branch 'main' of https://github.com/julien00859/sandbox
6d47ef0 doc(README): greeting from sandbox
45e6af4 doc(README): greeting from bacasable
b76619e doc(README): better greeting
daaec07 doc(README): greet new users
0efccf0 Initial commit

Le regard attentif aura vu la petite différence au niveau du git log, dans le dossier sandbox il existe une branche locale julien/doc/how-to-contribute qui n'existe bien pas dans le dossier bacasable. Par contre les deux dossiers connaissent la branche sur github origin/julien/doc/how-to-contribute. Mettre à jour le dossier sandbox n'était pas strictement nécessaire pour la suite.

Déplacez vous dans le dossier bacasable, sur la branche main et lancez la commande git log --all --graph --oneline:

~/Ephec/bacasable$ git log --all --graph --oneline
*   a1f3ea4 (HEAD -> main, origin/main, origin/HEAD) Merge pull request #1 from Julien00859/julien/doc/how-to-contribute
|\  
| * c7d8d6f (origin/julien/doc/how-to-contribute) doc(CONTRIBUTING): steps to contribute
|/  
| * d2904ed (origin/julien/doc/license, julien/doc/license) doc(README): include license
|/  
*   bd8f074 Merge branch 'main' of https://github.com/julien00859/sandbox
|\  
| * 6d47ef0 doc(README): greeting from sandbox
* | 45e6af4 doc(README): greeting from bacasable
|/  
* b76619e doc(README): better greeting
* daaec07 doc(README): greet new users
* 0efccf0 Initial commit

Nous voyons ici qu'il a existé 3 bifurcations, la 1e bifurcation en bas, qui a été faite dans le précédent tutoriel pour les deux commits directement créés sur la branche main et qui étaient en conflit l'un avec l'autre.

Une 2e bifurcation pour la branche julien/doc/license qui a été créé dans ce dossier. Notons que cette branche est basée sur le commit bd8f074 Merge branch 'main' of https://github.com/julien00859/sandbox de la branche main.

Une 3e bifurcation pour la branche julien/doc/how-to-contribute qui est aussi basée sur le même commit de la branche main, càd basée sur le commit bd8f074 Merge branch 'main' of https://github.com/julien00859/sandbox et qui a depuis été incluse dans la branche main.

Si nous nous déplaçons dans la branche julien/doc/license, les nouveaux commits faits dans la branche main nous sont inconnus. Vous pouvez le constater avec un git log --graph --oneline.

* d2904ed (HEAD -> julien/doc/license, origin/julien/doc/license) doc(README): include license
*   bd8f074 Merge branch 'main' of https://github.com/julien00859/sandbox
|\  
| * 6d47ef0 doc(README): greeting from sandbox
* | 45e6af4 doc(README): greeting from bacasable
|/  
* b76619e doc(README): better greeting
* daaec07 doc(README): greet new users
* 0efccf0 Initial commit

Il manque donc les deux commits, c7d8d6f doc(CONTRIBUTING): steps to contribute et a1f3ea4 Merge pull request #1 from Julien00859/julien/doc/how-to-contribute dans la branche julien/doc/license. Impossible de pouvoir résoudre le conflit sans récupérer ces commits de prime abord.

Rebase et correction du conflit

Il existe plusieurs solutions pour récupérer les commits manquants dans notre branche. Nous allons nous intéresser ici à la technique de rebase, re-base, "changer la base". Cette technique consiste à changer le parent (la base) du plus ancien commit de notre branche pour lui affecter un autre parent. Dans le cas présent notre plus ancien commit d2904ed doc(README): include license est donc basé sur le commit bd8f074 Merge branch 'main' of https://github.com/julien00859/sandbox. On dira donc que bd8f074 Merge branch 'main' of https://github.com/julien00859/sandbox est le parent de d2904ed doc(README): include license.

Dans notre cas présent, nous voudrions changer la parent de d2904ed pour qu'il pointe non plus sur bd8f074 mais sur le commit le plus récent de la branche main, sur a1f3ea4 Merge pull request #1 from Julien00859/julien/doc/how-to-contribute donc.

Nous voudrions faire ceci :

+  * xxxxxxx (julien/doc/license) doc(README): include license
+ /
 *   a1f3ea4 (main) Merge pull request #1 from Julien00859/julien/doc/how-to-contribute
 |\
 | * c7d8d6f doc(CONTRIBUTING): steps to contribute
 |/
-| * d2904ed (julien/doc/license) doc(README): include license
-|/
 *   bd8f074 Merge branch 'main' of https://github.com/julien00859/sandbox
 |\
 | * 6d47ef0 doc(README): greeting from sandbox
 * | 45e6af4 doc(README): greeting from bacasable
 |/
 * b76619e doc(README): better greeting
 * daaec07 doc(README): greet new users
 * 0efccf0 Initial commit

Déplacez vous sur la branche julien/doc/license et demandez à git de changer la base vers la branche main (git est assez malin pour comprendre que par main, vous entendez le dernier commit de la branche main, c'est-à-dire le commit a1f3ea4 dans le cas présent).

Précisons que parce qu'il y a un conflit, la commande va s'interrompre pour vous demander de régler le conflit avant de continuer.

~/Ephec/bacasable$ git status
On branch julien/doc/license
Your branch is up to date with 'origin/julien/doc/license'.

nothing to commit, working tree clean

~/Ephec/bacasable$ git rebase main
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
error: could not apply d2904ed... doc(README): include license
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply d2904ed... doc(README): include license

~/Ephec/bacasable$ git status
On branch julien/doc/license
Your branch is up to date with 'origin/julien/doc/license'.

nothing to commit, working tree clean
~/Ephec/bacasable$ git rebase main
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
error: could not apply d2904ed... doc(README): include license
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply d2904ed... doc(README): include license

Le second git status, celui effectué après la commande git rebase main regorge d'informations précieuse. Correctement comprendre ce qui y est dit est fondamental. Nous y reviendrons dans un autre guide dédié aux différences entre merge, rebase et squash. Pour le moment nous allons nous contenter du minimum syndical, c'est-à-dire régler le conflit dans notre éditeur, marquer le conflit comme résolu avec git add, ne pas faire de nouveau commit et laisser git continuer son rebase avec git rebase --continue.

Ouvrez donc le fichier README.md et constatez le conflit:

# sandbox
Un bac-à-sable pour s'entrainer avec git et github

Bonjour tout le monde

depuis sandbox et bacasable

<<<<<<< HEAD
Les [contributions](CONTRIBUTING.md) sont bienvenues !
=======
## Licence

Ce projet ainsi que le wiki adjacent est mis à disposition sous la
[Licence MIT](LICENSE)
>>>>>>> d2904ed (doc(README): include license)

Nous constatons effectivement que du côté "HEAD" (c'est à dire du côté de la branche main comme nous venons de changer la base), la fin du fichier se termine avec une ligne à propos des contributions tandis que du côté de notre commit, la fin du fichier se termine avec un message à propos de la licence. Pour résoudre ce conflit fort peu compliqué, nous proposons de simplement faire se suivre les deux textes de la manière suivante:

# sandbox
Un bac-à-sable pour s'entrainer avec git et github

Bonjour tout le monde

depuis sandbox et bacasable

Les [contributions](CONTRIBUTING.md) sont bienvenues !

## Licence

Ce projet ainsi que le wiki adjacent est mis à disposition sous la
[Licence MIT](LICENSE)

Vous pouvez alors marquer le conflit dans ce fichier comme résolu avec git add, constater que tout est devenu vert avec git status et laisser git reprendre son rebase avec git rebase --continue. Git vous demandera peut-être de changer le message de commit, c'est pour vous donner l'opportunité de changer le message si vous aviez du faire quelque chose de compliqué pour résoudre le conflit, dans le cas présent il n'y a pas besoin de changer ce message donc vous pouvez simplement sauver et quitter.

~/Ephec/bacasable$ git add README.md 
~/Ephec/bacasable$ git status
interactive rebase in progress; onto a1f3ea4
Last command done (1 command done):
   pick d2904ed doc(README): include license
No commands remaining.
You are currently rebasing branch 'julien/doc/license' on 'a1f3ea4'.
  (all conflicts fixed: run "git rebase --continue")

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   README.md

~/Ephec/bacasable$ git rebase --continue
[detached HEAD 04952de] doc(README): include license
 1 file changed, 5 insertions(+)
Successfully rebased and updated refs/heads/julien/doc/license.

Une fois le rebase effectué, vous pouvez alors relancer la commande git log --oneline --graph pour constater que les deux commits ont bel et bien été récupéré dans votre branche (on se rappelle que git n'affiche pas de bifurcation à droite lorsque l'historique entre deux branches est cohérent, qu'il n'a pas divergé):

~/Ephec/bacasable$ git log --oneline --graph
* 04952de (HEAD -> julien/doc/license) doc(README): include license
*   a1f3ea4 (origin/main, origin/HEAD, main) Merge pull request #1 from Julien00859/julien/doc/how-to-contribute
|\  
| * c7d8d6f (origin/julien/doc/how-to-contribute) doc(CONTRIBUTING): steps to contribute
|/  
*   bd8f074 Merge branch 'main' of https://github.com/julien00859/sandbox
|\  
| * 6d47ef0 doc(README): greeting from sandbox
* | 45e6af4 doc(README): greeting from bacasable
|/  
* b76619e doc(README): better greeting
* daaec07 doc(README): greet new users
* 0efccf0 Initial commit

Push with lease et merge de la seconde PR

Maintenant que nous avons résolu le conflit, nous pouvons alors push ces modifications sur Github:

~/Ephec/bacasable$ git push
To https://github.com/Julien00859/sandbox.git
 ! [rejected]        julien/doc/license -> julien/doc/license (non-fast-forward)
error: failed to push some refs to 'https://github.com/Julien00859/sandbox.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Github nous a empêché de push notre branche parce que:

Updates were rejected because the tip of your current branch is behind its remote counterpart. Integrate the remote changes (e.g. 'git pull ...') before pushing again. See the 'Note about fast-forwards' in 'git push --help' for details.

Le message d'erreur de Github n'est pas correcte. Il y est dit que notre branche serait "derrière", "plus vielle" que la branche sur Github. En réalité Github affiche ce message d'erreur dès que l'historique de la branche locale n'est pas cohérent avec l'historique de la branche distante, en d'autre termes, à chaque fois que vous allez utiliser rebase vous aller avoir ce message d'erreur.

Juste en lisant ce message d'erreur, nous ne pouvons pas savoir si github l'a écrit juste parce que (1) on a juste rebase notre branche, ou bien si (2) il y a effectivement des commits qui sont arrivés entre-temps dans cette branche sur github (à la manière du précédent tutoriel quand 2 personnes ont tenté de push des commits en même temps).

Pour lever cette ambiguïté, il existe l'option --force-with-lease pour git push qui sert justement à autoriser notre push dans le cas d'un rebase mais de tout de même rejeter les modifications dans le cas où des commits sont arrivés entre temps (commits qu'on devra récupérer en premier avant de re-push).

~/Ephec/bacasable$ git push --force-with-lease
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 412 bytes | 412.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/Julien00859/sandbox.git
 + d2904ed...04952de julien/doc/license -> julien/doc/license (forced update)

Si nous avions utiliser --force à la place de --force-with-lease, nous aurions pris le risque d'écraser des commits réalisés par d'autres personnes. Ce n'est jamais une bonne idée d'écraser les commits des autres sans leur en parler d'abord. Nous vous recommandons donc de ne jamais utiliser --force et de toujours utiliser --force-with-lease lorsque vous réécrivez l'historique de vos branches (avec rebase par exemple).

Vous pouvez alors vous rendre sur Github et constater que le conflit a été résolu et qu'il vous est possible de merger la branche.

conflit résolu

Vous pouvez alors encore une fois merger la branche depuis Github avec la technique Merge pull-request/Create a merge commit, récupérer les changements dans vos dossiers avec git pull et constater les changements avec git log.

~/Ephec/sandbox$ git switch main
~/Ephec/sandbox$ git pull
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 4 (delta 2), reused 3 (delta 2), pack-reused 0
Unpacking objects: 100% (4/4), 641 bytes | 641.00 KiB/s, done.
From https://github.com/Julien00859/sandbox
   a1f3ea4..ec50bd9  main       -> origin/main
 + d2904ed...04952de julien/doc/license -> origin/julien/doc/license  (forced update)
Updating a1f3ea4..ec50bd9
Fast-forward
 README.md | 5 +++++
 1 file changed, 5 insertions(+)
~/Ephec/sandbox$ git log --graph --oneline
*   ec50bd9 (HEAD -> main, origin/main, origin/HEAD) Merge pull request #2 from Julien00859/julien/doc/license
|\  
| * 04952de (origin/julien/doc/license) doc(README): include license
|/  
*   a1f3ea4 Merge pull request #1 from Julien00859/julien/doc/how-to-contribute
|\  
| * c7d8d6f (origin/julien/doc/how-to-contribute, julien/doc/how-to-contribute) doc(CONTRIBUTING): steps to contribute
|/  
*   bd8f074 Merge branch 'main' of https://github.com/julien00859/sandbox
|\  
| * 6d47ef0 doc(README): greeting from sandbox
* | 45e6af4 doc(README): greeting from bacasable
|/  
* b76619e doc(README): better greeting
* daaec07 doc(README): greet new users
* 0efccf0 Initial commit