relecture

This commit is contained in:
gcolpart 2016-12-20 23:35:24 +01:00
parent c922750e77
commit d6bf4fe5dc

View file

@ -12,14 +12,14 @@ title: Howto Git
## Installation
~~~
# apt install git
# apt install git gitg
~~~
Configuration minimum via `~/.gitconfig` :
Configuration minimale via `~/.gitconfig` :
~~~
[user]
name = Prenom Nom
name = John Doe
email = jdoe+git@example.com
[pull]
rebase = true
@ -31,12 +31,10 @@ Configuration minimum via `~/.gitconfig` :
## Commandes de base
### Documentation
### Utilisation et pages de manuel
Git vient avec un ensemble de *man pages* pour les différentes
commandes. Pour y accéder il suffit de remplacer l'espace dans la
commande par un tiret. Par exemple, pour la *man page* de `git add` il
suffit de faire `man git-add`.
Les commandes Git s'utilisent sous la forme `git <commande> [options]`
Pour chaque commande, une page de manuel *git-<commande>* est disponible. Par exemple pour `git add` faire `man git-add`.
### Créer un dépôt
@ -48,7 +46,7 @@ $ git init
### Cloner un dépôt
Plusieurs méthodes d'accès pour récupérer un dépôt : SSH, HTTP(S), Git, file.
Plusieurs méthodes d'accès pour récupérer un dépôt : ssh://, http(s)://, git://, file:// etc.
~~~{.bash}
$ git clone ssh://git.example.com/path/projet.git
@ -75,16 +73,14 @@ $ git add main.c
$ git commit -v
~~~
*Note* : si l'on souhaite faire un commit de l'ensemble des fichiers
modifiés (et suivis) par git, on peut utiliser la commande `git
commit -a` sans avoir à utiliser `git add`. Néanmoins c'est une
mauvaise habitude et il vaut mieux l'utiliser que pour des
modifications simples.
*Note* : si l'on souhaite faire un commit de l'ensemble des fichiers modifiés (et suivis) par git, on peut utiliser la commande `git
commit -a` sans avoir à utiliser `git add`. Néanmoins c'est une habitude à éviter car on risque d'inclure dans le commit des modifications non souhaitées.
Voir l'état du dépôt local (fichiers non commités, etc.) :
~~~{.bash}
$ git status
$ git status -s -b
~~~
Voir les derniers commits du dépôt local :
@ -93,7 +89,7 @@ Voir les derniers commits du dépôt local :
$ git log
~~~
### pull/pusher avec un dépôt distant
### pull/push avec un dépôt distant
Si l'on a cloné un dépôt existant, un lien est automatiquement créé entre le dépôt local créé et le dépôt distant (référencé comme *origin*).
@ -123,21 +119,21 @@ Lister les branches existantes et connaître sa branche courante :
$ git branch -a
~~~
Créer une branche *myfeature* à partir de la branche *master* :
~~~{.bash}
$ git branch myfeature master
~~~
Pour passer d'une branche à une autre dans son dépôt local :
Passer d'une branche à une autre dans son dépôt local :
~~~{.bash}
$ git checkout myfeature
$ git checkout master
~~~
Travailler sur la branche *myfeature* puis merger son travail dans
*master* (pour plus de détails, voir la section sur [git merge](#git-merge) :
Créer une branche *myfeature* à partir de la branche *master* :
~~~{.bash}
$ git checkout master
$ git branch myfeature master
~~~
Travailler sur la branche *myfeature* puis [merger](#git-merge) son travail dans la branche *master* :
~~~{.bash}
$ git checkout master
@ -157,7 +153,6 @@ $ git branch -d myfeature
$ git push origin :myfeature
~~~
## Commandes avancées
### Afficher l'historique
@ -180,6 +175,7 @@ On peut notamment combiner toutes ces options dans un alias à mettre dans `.git
[alias]
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'
~~~
On peut aussi utiliser *whatchanged* qui va lister tout ce qui a changé :
~~~{.bash}
@ -187,13 +183,13 @@ $ git whatchanged
$ git whatchanged -p
~~~
Pour voir un commit (par exemple l'avant-dernier) :
Voir l'avant-dernier commit :
~~~{.bash}
$ git show HEAD~1
~~~
Pour voir le fichier *foo/bar* tel qu'il était dans un commit (par exemple l'avant-dernier) :
Voir le fichier *foo/bar* tel qu'il était dans l'avant-dernier commit :
~~~{.bash}
$ git show HEAD~1:foo/bar
@ -206,16 +202,17 @@ $ git show HEAD~8..HEAD
$ git show -p HEAD~8..HEAD
~~~
On peut voir graphiquement l'historique avec différents outils :
On peut voir graphiquement l'historique avec différents outils, par exemple *gitg* ou *gitk* :
~~~
# apt install gitk gitg
$ gitg
$ gitk --all
~~~
### Modifier l'historique
/!\\ Les modifications de l'historique ne doivent avoir lieu que si il n'a pas déjà été pushé vers un dépôt partagé !
/!\\ Les modifications de l'historique ne doivent avoir lieu que si cela n'a pas été pushé vers un dépôt partagé !
Modifier son dernier message de commit :
@ -246,12 +243,19 @@ $ git rebase --continue
### Picorer un commit d'une autre branche (cherry-pick)
<https://git-scm.com/docs/git-cherry-pick>
Récupérer un commit d'une autre branche dans master :
~~~{.bash}
$ git checkout master
$ git cherry-pick <SHA1 du commit>
~~~
### gitignore
<https://git-scm.com/docs/gitignore>
Créer un fichier `.gitignore` à la racine pour ignorer certains fichiers/chemins :
~~~
@ -259,13 +263,15 @@ $ cat .gitignore
test.php
htdocs/foo/bar
toto/titi*
foo/bar*
~~~
*Note* : le fichier .gitignore se commit dans le dépôt
### Ranger temporairement son travail (git stash)
<https://git-scm.com/docs/git-stash>
Cela permet d'avoir un buffer pour mettre "en pause" des modifications non commitées :
~~~{.bash}
@ -295,13 +301,15 @@ $ git stash clear
### git diff
<https://git-scm.com/docs/git-diff>
Voir les modifications locales non commitées et non stagées :
~~~{.bash}
$ git diff
~~~
Voir les modifications locales *stagées* (avec *git add*) :
Voir les modifications locales *suivies* (ajoutées avec *git add*) :
~~~{.bash}
$ git diff --staged
@ -314,27 +322,33 @@ $ git diff HEAD~8..HEAD^^
$ git diff myfeature..master
~~~
On peut restreindre les modifications à un fichier :
Voir les modifications entre deux commits, mais uniquement pour un fichier *foo* :
~~~{.bash}
$ git diff HEAD~8..HEAD^^ -- foo
~~~
### git fetch/pull
### git pull/fetch
<https://git-scm.com/docs/git-pull>
`git pull` est une commande qui effectue un rappatriement des données (`git fetch`) puis l'intégration de ces données via `git rebase` (par défaut) ou `git merge`.
<https://git-scm.com/docs/git-fetch>
Dans certains cas il est pratique de faire un simple `git fetch`, notamment si l'on veut faire des manipulations complexes ou si l'on veut avoir toutes les données pour travailler hors ligne sans rien changer à l'état actuel de sa *working copy*.
### git push
Pour pousser toutes ses branches d'un coup (déconseillé) :
<https://git-scm.com/docs/git-push>
Pousser toutes ses branches d'un coup (ce qui est déconseillé en général) :
~~~{.bash}
$ git-push --all origin
~~~
Si l'on a une branche local nommée *foo* et que l'on veut la pousser dans la branche *bar* du dépôt distant :
Si l'on a une branche locale nommée *foo* et que l'on veut la pousser dans la branche nommée *bar* du dépôt distant :
~~~{.bash}
$ git push origin foo:bar
@ -346,7 +360,7 @@ $ git push origin foo:bar
$ git push -f origin
~~~
Il faudra ensuite que chaque utilisateur fasse confiance (ou vérifie les modifications d'historiques) et accepte d'écraser leur dépôt local :
Il faudra ensuite que chaque utilisateur du dépôt soit prévenu et accepte d'écraser leur dépôt local (en faisant ou vérifiant les modifications d'historiques) :
~~~{.bash}
$ git fetch
@ -355,6 +369,8 @@ $ git reset origin
### git checkout
<https://git-scm.com/docs/git-checkout>
Pour avoir le dépôt tel qu'il était à un commit :
~~~{.bash}
@ -375,6 +391,8 @@ $ git checkout -b myfeature
### git branch
<https://git-scm.com/docs/git-branch>
Une branche est en fait la création une déviation, un commit qui a deux *enfants*.
On peut ainsi créer une branche à partir de n'importe quel commit :
@ -394,7 +412,10 @@ Pour récupérer une nouvelle branche depuis le dépôt référencé comme dista
$ git remote update
~~~
### git clean/reset
### git reset/clean
<https://git-scm.com/docs/git-reset>
<https://git-scm.com/docs/git-clean>
/!\\ Certaines commandes peuvent provoquer une perte de données !
@ -405,11 +426,13 @@ $ git reset --hard
$ git clean -f -d
~~~
On peut aussi `git reset` sur des commits précédents (*HEAD^*,*HEAD~N*,*<SHA1>*).
Ou même sur une branche distante comme *origin/master* par exemple (pratique si l'historique de la branche distante a été modifié).
On peut aussi `git reset` sur des commits précédents (*HEAD^*,*HEAD~N*,*<SHA1 du commit>*).
Ou même sur une branche distante comme *origin/master* par exemple (ce qui est pratique si l'historique de la branche distante a été modifié).
### git add
<https://git-scm.com/docs/git-add>
Pour ajouter tout un répertoire et son contenu :
~~~{.bash}
@ -424,6 +447,8 @@ $ git add -p
### git merge
<https://git-scm.com/docs/git-merge>
Un merge consiste à créer un commit qui aura deux parents, et permet ainsi de fusionner deux branches existantes.
Quand un merge est très simple, c'est à dire que cela rajoute simplement des commits sur une branche qui n'a pas bougé entre temps, on n'a même pas besoin de créer un commit pour fusionner, on appelle cela un merge **fast-forward**. Cela se fait automatiquement avec la commande `git merge`. Notons que l'on peut vouloir tout de même avoir un commit pour marquer le coup, et forcer un commit de merge avec l'option `git merge --no-ff`.
@ -433,6 +458,8 @@ Quand un merge n'est pas simple, Git peut adopter plusieurs stratégies (resolve
### git apply
<https://git-scm.com/docs/git-apply>
`git apply` permet d'appliquer un diff.
On peut utiliser une option pour exclure l'application de certain fichier du diff :
@ -443,6 +470,8 @@ $ git apply --exclude=debian/changelog /tmp/foo.diff
### git blame
<https://git-scm.com/docs/git-blame>
Pour voir qui a modifié les lignes d'un fichier *foo/bar* :
~~~{.bash}
@ -451,6 +480,8 @@ $ git blame foo/bar
### .git/config
<https://git-scm.com/docs/git-config>
La configuration d'un dépôt se trouve dans le fichier `.git/config`
On peut éditer ce fichier ou utiliser des commandes pour le faire.
@ -507,8 +538,7 @@ Il existe plusieurs workflows possibles en travaillant avec Git.
Voir <http://nvie.com/posts/a-successful-git-branching-model/>
L'idée est de ne jamais toucher à *master*, sauf hotfixes.
Pour le reste on le fait dans *dev*.
L'idée est de ne jamais toucher à *master*, sauf hotfixes. Pour le reste on le fait dans *dev*.
Et pour les grosses features on le fait dans une branche, nommée avec le nom de la feature.
## Plomberie
@ -536,7 +566,6 @@ Si l'on veut mettre à jour ces pseudo-pointeurs, il faut utiliser `git update-r
Observons `.git/logs/` qui contient l'historique de ce qui a été fait dans le dépôt.
Cet historique est notamment accessible avec la commande `git reflog`.
## Astuces diverses
### Partager un dépôt avec plusieurs utilisateurs
@ -681,9 +710,9 @@ $ git config hooks.showrev "git show -C %s; echo
### Ignorer les vérifications SSL
À éviter au maximum bien sûr.
(à éviter autant que possible bien sûr)
~~~{.basb}
~~~{.bash}
$ git config --global http.sslverify "false"
~~~