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_localeConfigurer 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 pullPuis nous rappatrions les nouveaux commits de master sur notre branche :
En workflow rebase
git checkout branch
git rebase masterEn workflow merge
git checkout branch
git merge masterCopie locale
Pour connaitre les fichiers qui ont été modifiés depuis le dernier commit, utiliser la commande suivante :
git statusPour ajouter un fichier qui n’était pas déjà dans git, il faut l’ajouter explicitement avec la commande :
git add nom_du_fichierOn peut éventuellement ajouter tous les nouveaux fichiers avec la commande :
git add -ASi 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 brancheChangement
Pour changer de branche :
git checkout brancheLister les branches locales
git branchLister les branches distantes
git branch -rSupprimer une branche mergée
git branch -d brancheSupprimer une branche non mergée
git branch -D brancheSupprimer une branche distante
git push origin :brancheEffacer les références locales des branches distantes
git remote prune --dry-run originVoir le log d'une branche distante
git log origin/ID_branch_labelCré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_labelRemise à zéro d'une branche
git reset --hard origin/ID_branch_labelSous Modules
Ajouter un sous module
git submodule add git://github.com/author/module.git moduleRetirer un sous module
git submodule deinit module
git rm moduleDéplacer un sous module
Modifier son nom dans .gitmodules
mv oldpath newpath
git rm oldpath
git add newpath
git submodule syncInitialiser les sous modules
git submodule initMettre à jour les sous modules
git submodule updateVoir les versions des sous modules utilisés
git submodulePousser 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