Git, aide-mémoire

De La Mouche VII
Révision datée du 2 mai 2018 à 20:50 par Xiloynaha (discussion | contributions) (Page créée avec « Catégorie:Informatique = Ressources = * La documentation officielle : https://git-scm.com/doc * Pages de manuel importantes : * [https://git-scm.com/docs/git git(... »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigationAller à la recherche


Ressources

Création d'un dépôt

À partir de rien :

git init nom_du_dépôt

ou :

mkdir nom_du_dépôt
cd nom_du_dépôt
git init

À partir d'un dépôt existant :

git clone adresse_du_dépôt

Enregistrer des modifications

Ajouter un fichier non versionné, ou marquer pour commit un fichier modifié :

git add fichier

Ajouter tous les fichiers d'un répertoire (suivis et nouveaux) :

git add répertoire

(git add . est souvent utile.)

Ajouter tous les fichiers suivis qui ont été modifiés :

git add -u

On peut également spécifier un répertoire (par exemple git add -u .).

On peut aussi ajouter des fichiers en mode interactif en utilisant l'option -i, y compris ajouter partiellement des modifications sur un fichier (option -p pour le faire directement) :

git add -i

Démarquer un fichier :

git reset fichier

Tout démarquer :

git reset

Supprimer un fichier (utiliser --cached pour ne pas le supprimer de la copie de travail) :

git rm

Commiter les modifications enregistrées :

git commit

Commiter toutes les modifications (enregistrées ou non, mais pas les nouveaux fichiers) :

git commit -a

Annuler les modifications sur le fichier « fichier » :

git checkout fichier

Observer les changements

Quels fichiers ont été modifiés dans la copie de travail ?

git status

Visualiser le diff entre la copie de travail et la branche courante (HEAD) :

git diff

Visualiser la zone de staging (les fichiers ajoutés), c'est-à-dire ce que contiendra le prochain commit (les deux commandes sont équivalentes) :

git diff --cached
git diff --staged

Visualiser le diff entre deux références (SHA-1, branches, etc.) :

git diff ref1 ref2

Visualiser un commit (remplacer ref par un SHA-1 ou autre référence) :

git show ref

On peut passer grosso modo les mêmes options à git show qu'à git log (--stat, -p, etc., voir ci-dessous).

Visualiser le diff complet d'un commit de fusion (merge) :

git show -m ref

Ajouter --stat pour ne voir que la liste des fichiers modifiés par les deux parents.

Voir l'historique de la branche courante :

git log

Voir l'historique de la branche master :

git log master

Voir l'historique de tout le dépôt :

git log --all

Essayez aussi les options suivantes de git log :

  • -p pour visualiser les diffs
  • --stat pour afficher le résumé des fichiers modifiés
  • --decorate pour afficher les références (tags, branches, etc.)
  • --pretty=oneline et --oneline
  • --all --graph

Une bonne combinaison pour observer l'historique général du dépôt :

git log --oneline --graph --all --decorate

Ou mieux, après avoir ajouté l'alias suivant, on pourra taper git glog et avoir en plus la date et le nom de l'auteur de chaque commit :

git config --global alias.glog "log --pretty=format:'%C(auto)%h%d %s %C(auto,green)(%ar) %C(auto,bold blue)<%an>%Creset' --date=relative --graph --all"

Interfaces graphiques

Deux interfaces graphiques intéressantes sont fournies avec Git. Gitk permet de visualiser l'historique des changements sur une branche, ou sur toutes les branches du dépôt avec l'option --all :

gitk --all

Git GUI permet de préparer les commits en mode graphique, en visualisant les changements sur chaque fichier. Il est par exemple plus pratique que git add -p pour marquer partiellement un fichier pour commit.

git gui

Branches

Note : en faisant des expériences sur les branches, n'hésitez pas à observer le dépôt avec gitk --all ou la commande git log donnée ci-dessus.

Voir la liste des branches locales :

git branch

Voir la liste des branches distantes :

git branch -r

Voir la liste de toutes les branches :

git branch -a

Créer une nouvelle branche au même point que la branche courante, mais en restant sur la branche courante :

git branch nom_de_la_branche

Changer de branche (si l'on passe l'identifiant d'un commit, une branche temporaire sera créée) :

git checkout branche_ou_commit

Créer une nouvelle branche (éventuellement à partir d'une autre branche ou d'un commit), et se placer dessus :

git checkout -b nom_de_la_branche [ branche_ou_commit ]

Ajouter les commits de la branche « dev » à la branche « master » de manière à avoir un historique linéaire (git se placera automatiquement sur la branche dev) :

git rebase master dev

Ou si on est déjà sur la branche dev :

git rebase master

Fusionner la branche dev dans la branche master (en créant un commit de merge ayant deux parents si les branches ont divergé) :

git checkout master
git merge dev

Supprimer une branche :

git branch -d nom_de_la_branche

Forcer la suppression d'une branche non fusionnée :

git branch -D nom_de_la_branche

Sauvegarder les changements de manière temporaire (stash)

Pour nettoyer la copie de travail de tout changement (par exemple pour permettre le changement de branche) :

git stash

Les modifications seront sauvegardées dans une sorte de commit temporaire (visible par exemple dans gitk --all).

Il est possible d'appeler git stash plusieurs fois. On peut visualiser la liste des changements sauvegardés :

git stash list

Pour réappliquer la dernière sauvegarde, on utilise git stash apply (ce qui conservera la sauvegarde) ou git stash pop (ce qui la supprimera), éventuellement avec l'option --index pour restaurer l'index (changements marqués pour commit) :

git stash pop
git stash pop --index
git stash apply
git stash apply --index

Pour supprimer la dernière sauvegarde sans l'appliquer :

git stash drop

Pour appliquer ou supprimer non pas le dernier état sauvegardé mais une sauvegarde antérieure, il faut noter son numéro dans git stash list et l'indiquer à la suite de la commande. Par exemple, pour supprimer l'état numéro 1 (le deuxième plus récent donc) :

git stash drop 'stash@{1}'

Modifier l'historique du dépôt

Avertissement : il est déconseillé de modifier un dépôt public (git push -f, voir ci-dessous), à moins d'être sûr que personne ne travaille dessus. Toutes les personnes ayant obtenu une copie du dépôt devront forcer la mise à jour de leurs branches locales.

Il est possible de modifier le dernier commit grâce à l'option --amend de git commit :

git commit --amend

Il faut préalablement avoir apporté et marqué des modifications à la copie de travail (git add, git rm…). Si ce n'est pas le cas, git commit --amend permettra simplement de modifier le message de commit.

Il est également possible de modifier l'ordre des commits, de modifier des commits antérieurs, de fusionner ou diviser des commits, d'en supprimer, etc. La commande maîtresse est alors git rebase avec l'option -i ; il faut indiquer la somme de contrôle SHA-1 du commit parent du premier commit sur lequel on veut travailler.

git rebase -i SHA1

Git nous présentera alors un éditeur de texte, et nous permettra de marquer les modifications que l'on veut effectuer (des indications sont données en commentaire dans ce fichier texte).

Par exemple, pour modifier un commit, il faudra le marquer « edit » (ou simplement « e »), enregistrer le fichier texte et quitter l'éditeur. On utilisera ensuite git commit --amend comme vu précédemment, puis git rebase --continue pour terminer.

Pour supprimer un commit, il suffit de supprimer la ligne correspondante (mais voir git revert ci-dessous, parfois plus approprié).

Travailler avec un dépôt distant

Note : les commandes ne spécifiant pas de branche supposent que les branches locales et distantes sont bien configurées dans .git/config, ce qui est normalement le cas du dépôt origin après un git clone.

Visualiser les dépôts distants (-v donne plus de détails) :

git remote -v

Ajouter un dépôt distant nommé depotdistant ; le format de l'URL est documenté dans la page de manuel git-fetch(1) :

git remote add depotdistant URL

Récupérer les modifications du dépôt distant et les fusionner automatiquement (créera un commit de merge si des commits ont été créés en local) :

git pull

Mettre à jour les branches distantes, sans toucher aux branches locales :

git fetch

On préférera souvent utiliser fetch et rebase, plutôt que pull, afin de conserver un historique linéaire, généralement plus clair :

git fetch
git rebase origin/master master

Publier (pousser) ses modifications automatiquement (selon la configuration de .git/config) :

git push

Pousser la branche master sur le dépôt depotdistant :

git push depotdistant master

Pousser la branche locale toto sur la branche master du dépôt depotdistant :

git push depotdistant toto:master

Par défaut, git push refuse d'écraser une branche distante, il accepte uniquement d'y ajouter des commits (fast-forward). Pour écraser la branche distante (et potentiellement perdre des commits), utiliser l'option -f. À noter que l'utilisation de -f peut être interdite dans la configuration du dépôt distant.

Voir aussi les options suivantes de git push : --all, --mirror, --tags.

Exporter et importer un patch

Créer un patch à partir des modification locales non commitées :

git diff >mon_patch.diff

Créer un patch à partir du dernier commit :

git show >mon_patch.diff

À partir d'un commit donné (pointé par ref) :

git show ref >mon_patch.diff

Appliquer un patch :

git apply mon_patch.diff

À noter que ceci applique les changements localement mais ne crée pas de commit.

Pour exporter un commit, ou une série de commits, que l'on pourra ensuite importer automatiquement (création automatique des commits), on utilisera plutôt git format-patch et git am.

Commandes avancées et astuces

Annuler un commit en créant un commit inverse :

git revert SHA1

Comprimer et optimiser le dépôt (gc = garbage collect) ; ajouter --aggressive pour un traitement optimal mais potentiellement très long :

git gc

Voir le journal des références (utile pour récupérer une référence effacée par erreur) :

git reflog

Voir un fichier tel qu'il était dans un commit donné (remplacer ref par un nom de branche, un SHA, etc.) :

git show ref:chemin/complet/du/fichier

Voir les changements d'un fichier sur deux références données :

git diff ref1:chemin/complet/du/fichier ref2:chemin/complet/du/fichier

Revenir à la version d'un fichier d'un commit donné :

git checkout ref -- fichier

Chercher dans les fichiers suivis par Git (équivalent de grep -r, mais seulement sur les fichiers suivis, ignore automatiquement .git, etc.) :

git grep 'regex'

Accepte les mêmes options que grep (-l, -c, etc.).