RSS link icon

Git Notes

Publication : le 11 août 2016 - Dernière modification : le 16 févr. 2018

Que le premier qui n'a jamais oublié une commande Git fasse le premier commit.

Pic: Git branch diagram

Git est un formidable outil quand on aime sa logique. Voici donc la liste des commandes que j'utilise le plus. Vous êtes les bienvenues pour en partager d'autres en me les proposant via MP.

Liste des commandes

Pour connaitre toutes les commandes possibles : https://git-scm.com/docs/

Afficher les changements, ajouts courant:

$ git status 

Ajouter un fichier ou plusieurs:

# to add a file
$ git add [path/of/the/file]
# to add an entire folder
$ git add [path/of/the/folder]/*

Plus d'informations sur la commande add : https://git-scm.com/docs/git-add

Ajouter qu'une partie d'un fichier:

Soit un fichier nommé "Test.txt" contenant:

This is the first line
This is the second line
This is the third line

Pour plusieurs raisons, nous avons fait plusieurs modifications, telles que:

This is the first line
Line between the 1st and 2nd lines
This is the second line
Line between the 2nd and the 3rd lines
This is the third line

Or nous ne souhaitons commiter que le premier changement: "Line between the 1st and 2nd lines". Il suffit d’ajouter la commande -p à la commande git add, telle que :

$ git add -p Test.txt 

Comme le fichier est petit et ses changements également, Git considère que les deux changements n'en sont qu'un:

diff --git a/Test.txt b/Test.txt
index 524bd4a..6d97b7f 100644
--- a/Test.txt
+++ b/Test.txt
@@ -1,3 +1,5 @@
 This is the first line
+Line between the 1st and 2nd lines
 This is the second line
+Line between the 2nd and the 3rd lines
 This is the third line
 No newline at end of file
Stage this hunk [y,n,q,a,d,/,s,e,?]? 

Nous lui demandons alors de séparer ce changement en de plus petits changements en saisissant "s". Il nous propose alors le premier changement :

Split into 3 hunks.
@@ -1,2 +1,3 @@
 This is the first line
+Line between the 1st and 2nd lines
 This is the second line
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]?

Nous lui disons que nous souhaitons ajouter ce changement dans le prochain commit avec saisissant "y". Puis Git nous propose le second changement:

@@ -2,2 +3,3 @@
 This is the second line
+Line between the 2nd and the 3rd lines
 This is the third line
Stage this hunk [y,n,q,a,d,/,K,j,J,g,e,?]?

Ici, nous souhaitons ignorer ce changement en saisissant "n". Si Git nous propose d'autres changements, ignorons-les de la même manière.

Avec un "git status", on remarquera que le fichier est ajouté et à la fois qu'il contient des changements.

Déajouter un fichier:

$ git reset HEAD [path/of/the/file] 

Beaucoup de personnes trouvent que cette commande est tout sauf intuitive. Elles se demandent pourquoi Git n'a pas créé une commande "unadd". En attendant une réponse, il existe une astuce pour utiliser "unadd" à la place de "reset HEAD". Lancer la commande:

$ git config --global alias.unadd "reset HEAD" 

Maintenant, vous pouvez faire:

$ git unadd [path/of/the/file] 

Commit:

$ git commit
# with directly the comment
$ git commit -m "the label"
# with a mutli-line comment 
$ git commit -m "first line" -m "second line"

Branching

Changer de branche:

$ git checkout [branch_name] 

Créer une nouvelle branch:

$ git checkout -b [branch_name] 

Supprimer une branche en local:

$ git branch -b [branch_name] 

Tagging

Git peut "tagger" des commits dans l'historique comme étant importants. Les tags sont généralement utilisés pour marquer des releases(v1.0-rc0, v1.0, v1.1, etc).

Lister les tags:

$ git tag
v1.0-rc0
v1.0
v1.0.1
v1.0.2
v1.1
v1.2

Lister les tags relatif à une version:

$ git tag -l "v1.0*"
v1.0-rc0
v1.0
v1.0.1
v1.0.2

Il existe deux types de tag:

  • les tags "légers" (lightweight) qui sont juste des pointeurs à commits spécifiques.
  • les tags annotés qui contiennent un nom, un email et une date.

Les premiers sont généralement utilisés comme étant des tags temporaires. Les seconds sont utilisés pour des tags importants (ex: nouvelle version).

Créer un tag léger:

$ git tag mynewtag 
$ git tag
v1.0-rc0
v1.0
v1.0.1
v1.0.2
v1.1
v1.2
mynewtag

Créer un tag annoté:

$ git tag -a v1.3 -m "My version 1.3"
$ git tag
v1.0-rc0
v1.0
v1.0.1
v1.0.2
v1.1
v1.2
v1.3

Afficher le contenu d'un tag annoté:

$ git show v1.3

Différence

$ git diff

Cette commande permet de faire la différence entre la version modifiée courante avec le dernier commit enregistré (entendre la dernière version enregistrée)

Il est possible d'utiliser cette fonction pour des usages plus précis:

Différence sur un fichier

Pour cela, il suffit d'ajouter le fichier concerné à la suite de la commander précédente.

$ git diff my/file/name.cpp

Différence entre deux commits

Il faut spécifier les deux commits à la suite de la commande.

$ git diff 044de40 c489a5

Il est possible d'utiliser cette commande pour faire la différence entre deux branches, deux tags, une branche et un tag (sachant qu'un tag peut être vu comme une branche), un commit et une branche ou encore un commit et une branche ; toutes les combinaisons sont possibles.

# diff between 1 commit and 1 branch
$ git diff 044de40 develop
# diff between 2 branches
$ git diff master develop 
# diff between 2 tags
$ git diff tag_v1.0b tag_v1.0
# diff between the current commit and another commit
$ git diff HEAD 044de40
# diff between now and two commits back
$ git diff HEAD HEAD~2

Différence d'un fichier entre deux commits

C'est le même principe que la différence entre deux commits mais en rajoutant deux arguments à la fin de la commande : 2 tirets "--" et le fichier à comparer.

$ git diff HEAD c489a5 -- my/file/name.cpp

Interactions avec le serveur

Supprimer une branche sur le serveur:

$ git push origin :[branch_name] 

Récupérer du serveur Git:

$ git pull 

Envoyer sur le serveur Git:

$ git push 

Pusher des tags

Les tags ne sont pas pushés automatiquement. Il faut donc les pusher manuellement:

$ git push origin myTagName 

Pour pusher tous les tags d'un coup:

$ git push origin --tags 

La suite prochainement...

Quelques sources externes

Article Release notes

12.03.17

  • Ajout des commandes git diff

05.10.16

  • Ajout de la commande add -p
  • Les commandes sont dans leurs propres sous-sections.
  • Ajout du lien vers la documentation officielle

10.09.16

  • Ajout des commandes sur les tags

20.08.16

Première version