git home
GIT
Posted by Jean-Michel Frouin on .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 :
git clone git@serveur_git:projet.git nom_copie_locale
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 :
git checkout master
git fetch
git pull
Puis nous rappatrions les nouveaux commits de master sur notre branche :
En workflow rebase
git checkout branch
git rebase master
En workflow merge
git checkout branch
git merge master
Copie locale
Pour connaitre les fichiers qui ont été modifiés depuis le dernier commit, utiliser la commande suivante :
git status
Pour ajouter un fichier qui n’était pas déjà dans git, il faut l’ajouter explicitement avec la commande :
git add nom_du_fichier
On peut éventuellement ajouter tous les nouveaux fichiers avec la commande :
git add -A
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:
git commit -m "Message explicite"
Les branches
Création
Pour créer une branche :
git branch branche
Changement
Pour changer de branche :
git checkout branche
Lister les branches locales
git branch
Lister les branches distantes
git branch -r
Supprimer une branche mergée
git branch -d branche
Supprimer une branche non mergée
git branch -D branche
Supprimer une branche distante
git push origin :branche
Effacer les références locales des branches distantes
git remote prune --dry-run origin
Voir le log d'une branche distante
git log origin/ID_branch_label
Créer une branche locale ID_branch_label automatiquement depuis la branche distante origin/ID_branch_label (et la tracker)
git co -t origin/ID_branch_label
Remise à zéro d'une branche
git reset --hard origin/ID_branch_label
Sous Modules
Ajouter un sous module
git submodule add git://github.com/author/module.git module
Retirer un sous module
git submodule deinit module
git rm module
Déplacer un sous module
Modifier son nom dans .gitmodules
mv oldpath newpath
git rm oldpath
git add newpath
git submodule sync
Initialiser les sous modules
git submodule init
Mettre à jour les sous modules
git submodule update
Voir les versions des sous modules utilisés
git submodule
Pousser tous les sous modules sur une machine distante
git submodule foreach 'git push --all gitolite@vm.domain.com:`basename $name` || true'
Avancé
Rebase intéractif depuis le dernier push
git rebase -i @{u}
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