Git – Mini-tutos

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.