GIT
by Jean-Michel Frouin
Introduction
GIT est un gestionnaire de version décentralisé écrit par Linux Torvalds (aussi inventeur du noyau Linux)
Quelles sont les différences entre un VCS (Version Control System) décentralisé (comme GIT) et un centralisé (comme SVN) ?
Dans GIT, les copies de travail (l’endroit où sont stockés le code et ses modiciations) sont locales. Pour partager le code, ou les mettre sur un dépôt central, il faut le faire explicitement. Dans SVN, toutes les informations sont centralisées sur un serveur central, à chaque commit.
De ce fait, l’utilisation des branches devient un part importante du développement, car locales.
Workflow
A définir
Tirer une copie de travail d'un projet
Avant toute chose, il faut une copie de travail du projet sur lequel on va travailler. Pour ce faire on utilise la commande la commande clone de git :
Configurer GIT
Maintenant, qu’une copie de travail est prete, nous allons commençer à travailler dedans. Une bonne chose à faire à ce moment, est de configurer GIT pour mieux l’utiliser.
Mettre à jour
Comme nous sommes plusieurs à travailler, une mise a jour du code, en récupérant les dernières modification apportées à master, régulièrement, est nécessaire.
Pour ce faire, nous mettons à jour master :
Puis nous rappatrions les nouveaux commits de master sur notre branche :
En workflow rebase
En workflow merge
Copie locale
Pour connaitre les fichiers qui ont été modifiés depuis le dernier commit, utiliser la commande suivante :
Pour ajouter un fichier qui n’était pas déjà dans git, il faut l’ajouter explicitement avec la commande :
On peut éventuellement ajouter tous les nouveaux fichiers avec la commande :
Si il est nécessaire d’ignorer certains fichiers, il faut éditer le fichier .gitignore qui se trouve à la racine du site. Attention cela ne marche que avec les fichiers qui ne sont pas déjà ajouté à la gestion de version.
Enfin pour sauvegarder un changement localement on commit:
Les branches
Création
Pour créer une branche :
Changement
Pour changer de branche :
Lister les branches locales
Lister les branches distantes
Supprimer une branche mergée
Supprimer une branche non mergée
Supprimer une branche distante
Effacer les références locales des branches distantes
Voir le log d'une branche distante
Créer une branche locale ID_branch_label automatiquement depuis la branche distante origin/ID_branch_label (et la tracker)
Remise à zéro d'une branche
Sous Modules
Ajouter un sous module
Retirer un sous module
Déplacer un sous module
Modifier son nom dans .gitmodules
Initialiser les sous modules
Mettre à jour les sous modules
Voir les versions des sous modules utilisés
Pousser tous les sous modules sur une machine distante
Avancé
Rebase intéractif depuis le dernier push
Recherche d'un pattern
git grep isCiblexInterrupted
Affichage des logs
git log -p
Réécrire Nom et Email des anciens commits
git filter-branch –env-filter “export GIT_AUTHOR_NAME=’New name’; export GIT_AUTHOR_EMAIL=’New email’” HEAD
Afficher les statistiques pré-commit
git diff –stat git diff –stat –cached
Trouver un commit
git log -1 :”nom du texte”
Trouve les commits qui sont sur master et qui ne sont pas sur la branche dev
git log –graph origin/dev..origin/master –decorate
Rebase onto
git rebase –onto master 1bcdbef ID_Description
Rebase intéractif
git rebase -i commit_ID git reset –soft HEAD^ git reset fichier_a_editer
Différence entre deux branches (sortir les commit de diff)
git log master..6410 git help rev-parsel
Modifier l'auteur d'un commit git, soit au moment du commit
git commit –author “Jean-Michel Frouin jm@frouin.me”
Soit en amendant le commit d'avant
git commit –amend –author “Jean-Michel Frouin jm@frouin.me”
Voir une remote
git remote show remote_name
Supprimer une branche distante
git push remote :branch
Tracker une branche distante
git branch –set-upstream foo upstream/foo git config push.default tracking
Faire un cherry-pick
git cherry-pick e00a5154e559b50133fa4012de62f995b1b19df9
Afficher les 3 derniers commits
git log –pretty=oneline –abbrev-commit HEAD~3..HEAD
Tirer une branche distante en local
git co -b local_name origin/distant_name git fetch origin remote_branche_name:local_branch_name
Sortir un commit en patch puis l'appliquer
git format-patch -1 9da5d8eb0a527ce11aa86dbcee6cd7a6bdd4707d git am 0001-ajustement-logs.patch git log –pretty=oneline –abbrev-commit HEAD~3..HEAD
Voir les branches qui ne sont pas mergées
git branch –no-merged
Repositionner un tag
git tag -f tag_name
Obtenir de l'aide sur les révisions
git help revisions
Supprimer les branches qui ont été mergées
git branch -r –merged git branch
Reprendre un commit
git –amend
Corriger un commit
git co master git rebase -i ID_COMMIT~1
Ajouter un fichier en mode interactif (notamment en rebase interactif)
git add -i nom_fu_fichier git diff –cached git rebase –continue
Effacer une branche en en poussant une autre
git push -f origin master :branche_to_del
git stash
git stash save git stash list git stash apply stash@{0} git stash drop stash@{0}
git stash push git stash pop
git stash clear
Exporter une copie
git archive –format=zip –prefix=name HEAD > name.zip
Modifier la HEAD d'une remote
Coté copie de travail : git remote set-head origin dev
Coté serveur : git symbolic-ref HEAD refs/heads/dev
tags: