# git

### Créer un repo git

Sur le serveur (DS916), aller dans le dossier Repo:

```bash
dsm916> cd /volume1/Repositories/

dsm916> git init –-bare wp2012.git
```



Sur le client (Mac), se mettre dans le dossier source:

```bash
bruno@macbook-pro:~/ git init

bruno@macbook-pro:~/ git remote -v

#bruno@macbook-pro:~/ git remote add origin ssh:dsm916e/volume1/Repositories/wp2012.git
bruno@macbook-pro:~/ git remote add origin bruno@dsm916e:/volume1/Repositories/wp2012.git

bruno@macbook-pro:~/ git add *

bruno@macbook-pro:~/ git commit -m "Created my repo"

bruno@macbook-pro:~/ git push –-all origin
```



ssh:dsm916/volume1/Repositories/shell_scripts.git



### Démarrage:

Les fichiers peuvent avoir 3 états:

1. <u>Validé</u> signifie que les données sont stockées en sécurité dans votre base de données locale. 
2. <u>Modifié</u> signifie que vous avez modifié le fichier mais qu'il n'a pas encore été validé en base. 
3. <u>Indexé</u> signifie que vous avez marqué un fichier modifié dans sa version actuelle pour qu'il fasse partie du prochain instantané du projet.

Ce qui induit les 3 sections d'un projey git:

1. Le <u>répertoire Git</u> est l'endroit où Git stocke les méta-données et la base de données des objets de votre projet. C'est la partie la plus importante de Git, et c'est ce qui est copié lorsque vous clonez un dépôt depuis un autre ordinateur.
2. Le <u>répertoire de travail</u> (working copy) est une extraction unique d'une version du projet. Ces fichiers sont extraits depuis la base de données compressée dans le répertoire Git et placés sur le disque pour pouvoir être utilisés ou modifiés.
3. La <u>zone d'index</u> est un simple fichier, généralement situé dans le répertoire Git, qui stocke les informations concernant ce qui fera partie du prochain instantané.



#### Fichier de config:

Pour l'utilisateur: `~/.gitconfig`

#### Configurer git:

```bash
$ git config --global user.name "Bruno 21"

# --global		Pour l'utilisateur (~/.gitconfig)
# paramètres: user.email, core.editor, merge.tool

$ git config --list
credential.helper=osxkeychain
user.name=Bruno 21
user.email=bruno@clicclac.info
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
```

#### Aide git:

```bash
$ git help <verbe>
$ git <verbe> --help
$ man git-<verbe>

$ git help config
```



### Démarrer un dépôt Git:

#### [Initialisation d'un dépôt Git dans un répertoire existant](https://git-scm.com/book/fr/v1/Les-bases-de-Git-D%C3%A9marrer-un-d%C3%A9p%C3%B4t-Git#Initialisation-d'un-d%C3%A9p%C3%B4t-Git-dans-un-r%C3%A9pertoire-existant)

Se placer dans le répertoire:

```bash
$ git init
```

Ajouter les fichiers à suivre:

```bash
$ git add *.php
```

Valider:

```bash
$ git commit –m 'version initiale du projet'
```



#### [Cloner un dépôt existant:](https://git-scm.com/book/fr/v1/Les-bases-de-Git-D%C3%A9marrer-un-d%C3%A9p%C3%B4t-Git#Cloner-un-d%C3%A9p%C3%B4t-existant)

```bash
$ git clone git://github.com/depot/projet.git
```

Crée un répertoire <u>grit</u> contenant les données du dépôt ainsi qu'un répertoire .git

```bash
$ git clone git://github.com/depot/projet.git mondossier
```

Crée un clone du depot dans le dossier mondossier



Cloner un repo dans SmartGit / GitKraken:

```bash
$ ssh://bruno@clicclac.synology.me:42666/volume1/Repositories/shell_scripts.git
```

Pas de bruno@dsm916e/



#### Tirer un seul fichier d'un repo git:

```bash
$ mkdir rpi_py
$ git init
Dépôt Git vide initialisé dans /home/pi/git/rpi_py/.git/
$ git remote add origin bruno@dsm916e:/volume1/Repositories/rpi_py.git
$ git fetch
bruno@clicclac.synology.me's password:
remote: Enumerating objects: 38, done.
remote: Counting objects: 100% (38/38), done.
remote: Compressing objects: 100% (38/38), done.
remote: Total 38 (delta 5), reused 0 (delta 0)
Dépaquetage des objets: 100% (38/38), fait.
Depuis dsm916e:/volume1/Repositories/rpi_py
 * [nouvelle branche] master     -> origin/master
$ git checkout origin/master -- Camera/camera_2.py

pi@litePi:~/git/rpi_py $ cd Camera/
total 12
drwxr-xr-x 2 pi pi 4096 févr.  4 16:45 .
drwxr-xr-x 4 pi pi 4096 févr.  4 16:45 ..
-rw-r--r-- 1 pi pi  238 févr.  4 16:45 camera_2.py
```

Autre solution (juste le fichier, pas l'historique):

```bash
$ git archive --format=tar --remote=ssh://bruno@dsm916e/volume1/Repositories/rpi_py.git heads/master -- Camera/camera_2.py | tar xf -

# affiche le fichier sur la sortie stdout (tar -xO)
$ git archive --format=tar --remote=ssh://bruno@dsm916e/volume1/Repositories/rpi_py.git heads/master -- Camera/camera_2.py | tar -xO
bruno@clicclac.synology.me's password:
import time
import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (1024, 768)
    camera.start_preview()
    # Camera warm-up time
    time.sleep(2)
    camera.capture('/home/pi/Desktop/foo.jpg', resize=(320, 240))
```



```bash

# -n		: No checkout of HEAD is performed after the clone is complete.
# --depth 1 : juste la dernière révision
$ git clone -n ssh://bruno@dsm916e/volume1/Repositories/rpi_py.git --depth 1
Clonage dans 'rpi_py'...
...
$ cd rpi_py/
$ git checkout HEAD Camera/camera_2.py
```

Voir aussi https://gist.github.com/ssp/1663093





### Enregistrer des modifications dans le dépôt:

#### [Vérifier l'état des fichiers](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Enregistrer-des-modifications-dans-le-d%C3%A9p%C3%B4t#V%C3%A9rifier-l'%C3%A9tat-des-fichiers)

```bash
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
```

1 commit en attente de push.



#### [Placer de nouveaux fichiers sous suivi de version](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Enregistrer-des-modifications-dans-le-d%C3%A9p%C3%B4t#Placer-de-nouveaux-fichiers-sous-suivi-de-version)

```bash
$ git add LISEZMOI
```



#### [Ignorer des fichiers](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Enregistrer-des-modifications-dans-le-d%C3%A9p%C3%B4t#Ignorer-des-fichiers)

Les fichiers ajoutés à <u>.gitignore</u> ne seront pas sous suivi de version.

```bash
$ cat .gitignore
.DS_STore
```



#### [Inspecter les modifications indexées et non indexées](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Enregistrer-des-modifications-dans-le-d%C3%A9p%C3%B4t#Inspecter-les-modifications-index%C3%A9es-et-non-index%C3%A9es)

Pour visualiser ce qui a été modifié mais pas encore indexé, tapez:

```bash
$ git diff
```



#### [Valider vos modifications](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Enregistrer-des-modifications-dans-le-d%C3%A9p%C3%B4t#Valider-vos-modifications)

```bash
$ git commit
```

Ouvre l'éditeur de texte pour renseigner le message de validation.

```bash
$ git commit -m "Correction d'un bug"
```

Le message est dans la commande.

```bash
$ git commit -a -m  "Correction d'un bug"
```

Ordonne à Git de placer automatiquement tout fichier déjà en suivi de version dans la zone d'index avant de réaliser la validation, évitant ainsi d'avoir à taper les commandes `git add` 



#### [Effacer des fichiers](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Enregistrer-des-modifications-dans-le-d%C3%A9p%C3%B4t#Effacer-des-fichiers)

```bash
$ git rm LISEZMOI
```



#### [Déplacer des fichiers](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Enregistrer-des-modifications-dans-le-d%C3%A9p%C3%B4t#D%C3%A9placer-des-fichiers)

```bash
$ git mv nom_origine nom_cible
```



### Visualiser l'historique des validations:

```bash
$ git log

# -p		montre les différences entre chaque validation
# -2		les deux entrées les plus récentes

$ git log --pretty=format:"%h - %an, %ar : %s"

```



### Annuler des actions:

#### [Modifier le dernier *commit*](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Annuler-des-actions#Modifier-le-dernier-commit)

```bash
$ git commit -m 'validation initiale'
$ git add fichier_oublie
$ git commit --amend
```



#### [Désindexer un fichier déjà indexé](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Annuler-des-actions#D%C3%A9sindexer-un-fichier-d%C3%A9j%C3%A0-index%C3%A9)

```bash
$ git reset HEAD benchmarks.rb
$ git status
```



#### [Réinitialiser un fichier modifié](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Annuler-des-actions#R%C3%A9initialiser-un-fichier-modifi%C3%A9)

Ramener le fichier à son état du dernier instantané (ou lors du clonage, ou dans l'état dans lequel vous l'avez obtenu dans votre copie de travail) 

```bash
$ git checkout -- benchmarks.rb
$ git status
```



### Dépot distants:

#### [Afficher les dépôts distants](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants#Afficher-les-d%C3%A9p%C3%B4ts-distants)

```bash
$ git remote -v
```

#### [Récupérer et tirer depuis des dépôts distants](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants#R%C3%A9cup%C3%A9rer-et-tirer-depuis-des-d%C3%A9p%C3%B4ts-distants)

```bash
$ git fetch [nom-distant]
```

#### [Pousser son travail sur un dépôt distant](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants#Pousser-son-travail-sur-un-d%C3%A9p%C3%B4t-distant)

```bash
$ git push origin master
```

#### [Inspecter un dépôt distant](https://git-scm.com/book/fr/v1/Les-bases-de-Git-Travailler-avec-des-d%C3%A9p%C3%B4ts-distants#Inspecter-un-d%C3%A9p%C3%B4t-distant)

```bash
$ git remote show origin
```



### Etiquettes:

#### Lister les étiquettes

```bash
$ git tag

$ git tag  -l 'v1.4.2.*'
```

#### Créer des étiquettes annotées

```bash
$ git tag -a v1.4 -m 'my version 1.4'

# -a étiquette
# -m message d'étiquetage
```

../..



### Branches:

https://git-scm.com/book/fr/v1/Les-branches-avec-Git-Ce-qu-est-une-branche

#### Gérer les branches

```bash
$ git branch              # Permet de lister les branches
$ git branch -v           # Visualiser les dernières validations sur chaque branche
$ git branch <branche>    # Permet de créer une nouvelle branche <branche>
$ git branch -m <branche> # Renomme la branche courante en <branche>
$ git branch -d <branche> # Permet de supprimer une branche
$ git branch -D <branche> # Supprime la branche même si elle n'a pas été fusionnée
$ git branch --merged     # Quelles branches ont déjà été fusionnées dans votre branche actuelle ?
$ git branch --no-merged  # Branches qui contiennent des travaux qui n'ont pas encore été fusionnés
```

**master** est la branche par défaut.

**HEAD** est un pointeur qui indique la branche courante.

`$ git branch <branche>` crée une nouvelle branche mais ne fait pas basculer la <u>copie de travail</u> vers celle-ci.



#### Passer d'une branche à l'autre

```bash
$ git checkout <branche>
$ git checkout -b <branche> # sauter sur une branche qui n'existe pas en la créant au préalable
```

Le pointeur **HEAD** pointe désormais sur <branche>

La <u>copie de travail</u> a basculée sur la nouvelle branche:

- la nouvelle branche pointera sur les nouveaux commit 
- la branche **master** pointera sur le dernier commit au moment du checkout.



#### Fusionner les branches

Merge permet de ramener une branche sur une autre et ainsi de la fusionner. La fusion de 2 branche se fait toujours à partir de la branche principale.

- La branche "source" sera affectée en récupérant l'historique de la branche ou un commit de fusion
- La branche fusionnée ne sera pas affectée

```bash
$ git merge <branche>
```

https://git-scm.com/book/fr/v1/Les-branches-avec-Git-Brancher-et-fusionner%C2%A0%3A-les-bases



#### Les branches distantes



#### Rebaser



#### => [Session de travail avec git](git-session.md) <=



http://www.ntu.edu.sg/home/ehchua/programming/howto/Git_HowTo.html