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.
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
- Comment se simplifier la vie avec des alias pour Git grâce à l'équipe Synbioz
- Comment bien organiser son Git branching model : c'est le modèle que j'applique à tous mes projets. Jusque là , je n'ai pas trouvé plus efficace pour une équipe de 3 à 20 personnes. Je ferais peut-être un article dessus comme la source est en anglais.
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