git

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