Annuler des modifications non indexées
Les fichiers modifiés n’ont ici pas encore été indexés avec git add.
Dans le cas d’un fichier unique :
$ git checkout -- filename
Ou, si plusieurs fichiers ont été modifiés dans l’espace de travail :
$ git checkout -- .
Annuler des modifications indexées
Les fichiers modifiés ont ici déjà été indexés avec git add.
Dans le cas d’un fichier unique :
$ git reset HEAD filename $ git checkout -- filename
Ou, si plusieurs fichiers ont été modifiés dans l’espace de travail :
$ git reset HEAD . $ git checkout -- .
Annuler les changements du dernier commit
Un nouveau commit, de type Revert, signalant le retour à la version précédente sera créé.
$ git revert HEAD
Rétablir la copie de travail d’un hash antérieur
Tous les hashes plus récents que le hash spécifié seront supprimés de l’historique et la copie de travail sera identique à celle du hash spécifié.
$ git reset --hard SHA1
Apporter de modifications au précédent commit
Il s’agit ici de modifier des fichiers et d’inclure a posteriori ces modifications à un commit déjà validé.
Généralement il s’agit de modifications mineures que l’on a oublié d’ajouter au précédent commit.
$ nano filename $ git add filename $ git commit --amend -m "Message remplaçant le message du précédent commit"
ou, alternativement, on peut rétablir le commit antérieur et apporter les modifications désirées :
$ git reset HEAD~1 $ nano filename $ git add filename $ git commit -m "Message remplaçant le message du précédent commit"
La commande git reset ci-dessus se déplace à l’état staging juste avant le commit à redéfinir. Les modifications de fichiers sont présentes dans l’index.
Déplacer un fichier
$ git mv filename destination/
Le fichier est copié et indexé à sa destination et supprimé à la source. Il est prêt à être commité.
Equivaut à :
$ mv filename destination/ $ git add destination/filename $ git rm filename
Résoudre un conflit simple
$ nano filename $ git add filename $ git commit -m "Message de commit"
Scénario 01

$ git checkout -b bugFix $ git commit $ git checkout master $ git commit $ git merge bugFix
Scénario 02

$ git checkout -b bugFix $ git commit $ git checkout master $ git commit $ git checkout bugFix $ git rebase master
Scénario 03

$ git checkout C1 $ git checkout master $ git commit $ git checkout C2
Scénario 04

$ git branch -f master C6 $ git checkout HEAD~1 $ git branch -f bugFix HEAD~1
Scénario 05

$ git reset HEAD~1 $ git checkout pushed $ git revert HEAD
Scénario 06

git tag v1 side~1 git tag v0 master~2 git checkout v1
Scénario 07

$ git rebase master bugFix $ git rebase bugFix side $ git rebase side another $ git rebase another master
Scénario 08

$ git checkout HEAD~1 $ git checkout HEAD^2 $ git checkout HEAD~2
Equivaut à :
$ git checkout HEAD~1^2~2
Scénario 09

$ git checkout one $ git cherry-pick C4 C3 C2 $ git checkout two $ git cherry-pick C5 C4 C3 C2 $ git branch -f three C2
Scénario 10

$ git fetch $ git rebase origin/master side1 $ git rebase side1 side2 $ git rebase side2 side3 $ git rebase side3 master $ git push
Scénario 11

$ git checkout -b side origin/master $ git commit $ git pull --rebase $ git push
Scénario 12
On part du commit cfa3f0e sur lequel pointent la brancge master et la brancge testing :
* cfa3f0e - (HEAD -> master, origin/master, testing) 2018-06-22 | Initial commit (HEAD -> master, origin/master, testing) [darwinos]
Scénario 12-A
On crée 2 commits sur la branche testing puis 2 commits sur la branche master :
* b215e88 - (HEAD -> master) 2018-06-22 | Add file02.txt (HEAD -> master) [darwinos] * 6ea1a95 - 2018-06-22 | Add file01.txt [darwinos] | * a79ce47 - (testing) 2018-06-22 | Add file02-t.txt (testing) [darwinos] | * 83a2616 - 2018-06-22 | Add file01-t.txt [darwinos] |/ * cfa3f0e - (origin/master) 2018-06-22 | Initial commit (origin/master) [darwinos]
On fusionne la branche testing sur la brancge master (on intégre le travail de testing sur master) :
$ git merge master Déjà sur 'master' $ git merge testing Merge made by the 'recursive' strategy. file01-t.txt | 0 file02-t.txt | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 file01-t.txt create mode 100644 file02-t.txt
Ceci génère un commit de fusion grâce à une fusion récursive :
* c24bb00 - (HEAD -> master) 2018-06-22 | Merge branch 'testing' (HEAD -> master) [darwinos] |\ | * a79ce47 - (testing) 2018-06-22 | Add file02-t.txt (testing) [darwinos] | * 83a2616 - 2018-06-22 | Add file01-t.txt [darwinos] * | b215e88 - 2018-06-22 | Add file02.txt [darwinos] * | 6ea1a95 - 2018-06-22 | Add file01.txt [darwinos] |/ * cfa3f0e - (origin/master) 2018-06-22 | Initial commit (origin/master) [darwinos]
Mais la branche testing est en retard sur master :
$ git checkout testing $ git merge master
ou
$ git checkout testing $ git rebase master
Aucun commit n’est créé, la branche testing rattrape la branche master :
* c24bb00 - (HEAD -> testing, master) 2018-06-22 | Merge branch 'testing' (HEAD -> testing, master) [darwinos] |\ | * a79ce47 - 2018-06-22 | Add file02-t.txt [darwinos] | * 83a2616 - 2018-06-22 | Add file01-t.txt [darwinos] * | b215e88 - 2018-06-22 | Add file02.txt [darwinos] * | 6ea1a95 - 2018-06-22 | Add file01.txt [darwinos] |/ * cfa3f0e - (origin/master) 2018-06-22 | Initial commit (origin/master) [darwinos]
Les deux branches sont au même niveau.
Scénario 12-B
On crée 2 commits sur la branche testing puis 2 commits sur la branche master :
* b215e88 - (HEAD -> master) 2018-06-22 | Add file02.txt (HEAD -> master) [darwinos] * 6ea1a95 - 2018-06-22 | Add file01.txt [darwinos] | * a79ce47 - (testing) 2018-06-22 | Add file02-t.txt (testing) [darwinos] | * 83a2616 - 2018-06-22 | Add file01-t.txt [darwinos] |/ * cfa3f0e - (origin/master) 2018-06-22 | Initial commit (origin/master) [darwinos]
On rebase la branche testing sur la branche master :
$ git checkout testing Basculement sur la branche 'testing' $ git rebase master Application de Add file01-t.txt Application de Add file02-t.txt
Aucun commit n’a été créé, les commits de la branche testing ont été réécrits et basés sur la branche master :
* 1933587 - (HEAD -> testing) 2018-06-22 | Add file02-t.txt (HEAD -> testing) [darwinos] * d9b745d - 2018-06-22 | Add file01-t.txt [darwinos] * b215e88 - (master) 2018-06-22 | Add file02.txt (master) [darwinos] * 6ea1a95 - 2018-06-22 | Add file01.txt [darwinos] * cfa3f0e - (origin/master) 2018-06-22 | Initial commit (origin/master) [darwinos]
Mais la branche master est en retard sur la branche testing :
$ git checkout master $ git rebase testing
ou
$ git checkout master $ git merge testing
Aucun commit n’est créé, la branche master rattrape la branche testing :
* 1933587 - (HEAD -> master, testing) 2018-06-22 | Add file02-t.txt (HEAD -> master, testing) [darwinos] * d9b745d - 2018-06-22 | Add file01-t.txt [darwinos] * b215e88 - 2018-06-22 | Add file02.txt [darwinos] * 6ea1a95 - 2018-06-22 | Add file01.txt [darwinos] * cfa3f0e - (origin/master) 2018-06-22 | Initial commit (origin/master) [darwinos]
Les deux branches sont au même niveau.
Scénario 12-C
On crée 2 commits sur la branche testing puis 2 commits sur la branche master :
* b215e88 - (HEAD -> master) 2018-06-22 | Add file02.txt (HEAD -> master) [darwinos] * 6ea1a95 - 2018-06-22 | Add file01.txt [darwinos] | * a79ce47 - (testing) 2018-06-22 | Add file02-t.txt (testing) [darwinos] | * 83a2616 - 2018-06-22 | Add file01-t.txt [darwinos] |/ * cfa3f0e - (origin/master) 2018-06-22 | Initial commit (origin/master) [darwinos]
On rebase la branche master sur la branche testing :
$ git checkout master Déjà sur 'master' $ git rebase testing Application de Add file01.txt Application de Add file02.txt
Aucun commit n’a été créé, les commits de la branche master ont été réécrits et basés sur la branche testing :
* 85e8528 - (HEAD -> master) 2018-06-22 | Add file02.txt (HEAD -> master) [darwinos] * 64456de - 2018-06-22 | Add file01.txt [darwinos] * a79ce47 - (testing) 2018-06-22 | Add file02-t.txt (testing) [darwinos] * 83a2616 - 2018-06-22 | Add file01-t.txt [darwinos] * cfa3f0e - (origin/master) 2018-06-22 | Initial commit (origin/master) [darwinos]
Mais la branche testing est en retard sur la branche master :
$ git checkout testing $ git rebase master
ou
$ git checkout testing $ git merge master
Aucun commit n’est créé, la branche testing rattrape la branche master :
* 58ba625 - (HEAD -> testing, master) 2018-06-22 | Add file02.txt (HEAD -> testing, master) [darwinos] * e2977ec - 2018-06-22 | Add file01.txt [darwinos] * a79ce47 - 2018-06-22 | Add file02-t.txt [darwinos] * 83a2616 - 2018-06-22 | Add file01-t.txt [darwinos] * cfa3f0e - (origin/master) 2018-06-22 | Initial commit (origin/master) [darwinos]
Les deux branches sont au même niveau.
Scénario 12-D
On crée deux commits uniquement sur la branche testing :
* a79ce47 - (HEAD -> testing) 2018-06-22 | Add file02-t.txt (HEAD -> testing) [darwinos] * 83a2616 - 2018-06-22 | Add file01-t.txt [darwinos] * cfa3f0e - (master, origin/master) 2018-06-22 | Initial commit (master, origin/master) [darwinos]
On fusionne la branche testing sur la branche master :
$ git checkout master Basculement sur la branche 'master' $ git merge testing Mise à jour cfa3f0e..a79ce47 Fast-forward file01-t.txt | 0 file02-t.txt | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 file01-t.txt create mode 100644 file02-t.txt
ou
$ git checkout master Basculement sur la branche 'master' $ git rebase testing Premièrement, rembobinons head pour rejouer votre travail par-dessus... master mise à jour en avance rapide sur testing.
Aucun commit n’est créé, la branche master rattrape la branche testing grâce à une fusion fast-forward ou un rebasage :
* a79ce47 - (HEAD -> master, testing) 2018-06-22 | Add file02-t.txt (HEAD -> master, testing) [darwinos] * 83a2616 - 2018-06-22 | Add file01-t.txt [darwinos] * cfa3f0e - (origin/master) 2018-06-22 | Initial commit (origin/master) [darwinos]
Les deux branches sont au même niveau.
Les GIFs et les scénarios présents dans cet article ont été générés à partir de l’excellent site de tutoriels relatifs à Git intitulé Learn Git Branching.