Memento GIT

Références

Mémento

Configuration globale

Pour configurer vos noms et mails, une seule fois par "machine" et depuis n'importe quel répertoire :

  • git config --global user.name "Prénom Nom"
  • git config --global user.email "prenom.nom@telecom-paristech.fr"
  • git config --global core.editor "votre éditeur favoris" #(nano, vi, emacs...)

Ces informations seront stockées dans le fichier ~/.gitconfig (que vous pouvez aussi éditer à la main si vous préférez).

Pour éviter d'avoir à taper en permanence votre clef privée : ssh-add

Le fichier .gitignore dans la racine du dépôt permet d'ignorer certains fichiers inutiles (les *.pyc par exemple ou les *.o, *.swp, *~, …). C'est un fichier texte que vous pourrez (devrez) éditer pour le compléter.

Création de dépôt git

  • Créer un dépôt git : git init
  • Cloner un dépôt : git clone adresse_du_dépôt

L'adresse du dépôt à cloner peut être :

  • une adresse distante. Par exemple pour les dépôt d'ELEC223 sur les serveurs de COMELEC c'est elec223@git.comelec.enst.fr:2015/PrenomNom.git
  • un chemin local. Exemple, pour cloner le dépôt local depot1 en un nouveau dépôt local depot2 : git clone depot1 depot2

Voir ce qui s'est passé

  • Voir l'état actuel de l'index et de son répertoire de travail : git status. Git vous indique ce qui est modifié et pas encore dans l'index, ce qui est dans l'index et pas encore committé, ce qui n'est pas tracké. Pour chaque cas, il vous indique la commande à taper pour mettre un fichier dans l'index, l'en sortir, le committer, etc...
  • Voir l'historique de la branche sur laquelle vous êtes : git log
  • Idem avec une belle application graphique : gitk
  • Voir l'historique de la branche origin/master (c'est une branche distante) : git log origin/master

Comparaisons de versions

  • Comparer son répertoire de travail avec le dernier commit : git diff HEAD
  • Comparer son répertoire de travail avec l'index : git diff
  • Comparer l'index avec le dernier commit : git diff --cached
  • Comparer deux commits entre eux : git diff ea678 9deadb (remplacer ea678 et 9deadb par les numéros des commits en question. On peut aussi passer un nom de branche)

Manipuler des fichiers

  • Supprimer un fichier : git rm fichier
  • Supprimer un répertoire : git rm -r repertoire
  • Bouger un fichier ou un répertoire : git mv ancien_chemin nouveau_chemin

Attention : ne pas oublier le git commit après !

Enregistrement de fichiers

  • Prendre une photo de certains fichiers : git add fichiers. Cette commande place la "photo" dans l'index.
  • Enregistrer le contenu de l'index dans un commit : git commit
  • Prendre une photo de tous les fichiers déjà connus de git et créer un nouveau commit : git commit -a
  • Annuller un git add de certains fichiers (remettre l'index à la version du dernier commit) : git reset -- fichiers
  • Annuller des modifications locales sur certains fichiers et revenir à l'état de l'index : git checkout -- fichiers
  • Annuller des modifications locales et de l'index sur certains fichiers et revenir au dernier commit : git checkout HEAD -- fichiers
  • Pareil avec tous les fichiers : git reset --hard ou git checkout -f

 

Le commit est enregistré à la suite de celui où pointe HEAD. Puis HEAD ainsi que l'éventuelle branche vers lequel HEAD pointait sont déplacés vers le nouveau commit.

  • Modifier un commit précédent : git commit --amend. Attention : ne jamais le faire si on a déjà pushé !

 

Travailler avec un serveur distant

  • Récupérer les évolutions des branches depuis un serveur distant : git fetch. Cette commande met à jour la copie locale des branches distante (origin/xxx) mais ne répercute pas ces modifications dans vos branches locales.
  • Appliquer les changements d'une branche distante à la branche courante : git merge origin/xxx
  • Faire ces deux manipulations d'un coup sur la branche actuelle : git pull (= git fetch + git merge)
  • Envoyer les modifications de la branche locale A vers la branche distante B du serveur server : git push server A:B
  • Si A et B portent le même nom, on peut l'abréger en git push server A
  • Si A est la branche courante, on peut omettre son nom : git push server
  • Si server est celui par défaut (origin, ou le seul serveur configuré), on peut omettre son nom : git push . Attention : JAMAIS de git push -f !!!
  • Voir les serveurs distants : git remote -v
  • Ajouter un serveur distant qu'on appelera gh : git remote add gh git@github.com:chemin_vers_depot.git

Naviguer dans l'historique

  • récupérer les fichers d'un certain commit et mettre à jour l'espace de travail ainsi que l'index : git checkout nom_du_commit fichiersnom_du_commit peut être le SHA d'un commit, un nom de tag ou un nom de branche
  • revenir dans l'état un commit particulier en mettant à jour tout le répertoire de travail : git checkout nom_du_commit

Si nom_du_commit est un nom de branche, cela veut dire qu'on a changé de branche. Tout nouveau commit sera ajouté à la nouvelle branche :

Si nom_du_commit est un numéro de commit, on se retrouve en mode "detached HEAD" : sur une branche qui n'a pas de nom. Tout nouveau commit sera ajouté à cette branche. Il est fortement conseillé de nommer cette branche pour pouvoir la retrouver plus tard : git branch nom_de_la_nouvelle_branche ou git checkout -b nom_de_la_nouvelle_branche

Notes :

  • HEAD~ ou HEAD^  ou HEAD~1 : commit précédent HEAD (idem avec un nom de branche).
  • HEAD~~ ou HEAD^^ ou HEAD~2 : avant-dernier commit avant HEAD (idem avec un nom de branche).
  • HEAD~~~ ou HEAD^^^ ou HEAD~3 : avant-avant-dernier commit avant HEAD (idem avec un nom de branche).
  • etc.

Attention : ^ et ~ ne veulent pas dire la même chose. Si en remontant il y a eu un merge :

  • ~ remonte la branche du premier parent,
  • ^N représente le Nème parent.

Exemple : si on a un merge, HEAD~2 représente le grand père en suivant le premier parent, alors que HEAD^2 représente le deuxième parent. HEAD~~~ est équivalent à HEAD^^^ et HEAD~3, mais pas à HEAD^3

Les branches

Rappel : dans git, une branche est juste un pointeur vers un commit particulier. Par abus de langage, on appelle parfois "branche" l'ensemble de ce commit et de ses ancètres.

  • Créer une branche à l'endroit actuel (HEAD) : git branch nom_de_la branche
  • Créer une branche sur un commit particulier : git branch nom_de_la branche numero_de_commit
  • Basculer sur une branche en mettant à jour le répertoire de travail et l'index : git checkout nom_de_la branche

Tout nouveau commit est ajouté à la suite de ce vers quoi pointe HEAD, et HEAD ainsi que le nom de la branche actuelle sont déplacés pour pointer sur le nouveau commit.

  • Rapatrier les changements d'une branche vers la branche actuelle : git merge nom_de_la_branche_à_intégrer
    • S'il n'y a pas de conflits, cela crée automatiquement un nouveau commit avec comme message de log par défaut "Merge"
    • S'il a des conflits, ils sont indiqués par git. On doit alors les résoudre manuellement, en recherchant les passages délimités par des chervons et des signes "égal", faire les modifications qui s'imposent, supprimer les marqueurs (chevrons / égal), et committer le résultat.

 

 

 Cette page est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage à l'Identique 3.0 États-Unis. Elle utilise des images issues de http://marklodato.github.io/visual-git-guide/index-fr.html.