====== Git ======
===== Mise à jour repo depuis un dépôt distant =====
- **Mettre à jour dépôt local depuis dépôt distant :** git fetch --all (ou nom des branches)
- **Mettre à jour workspace depuis dépot local :** git merge all (ou nom des branches)
====Alternatives====
**Mettre à jour workspace directement depuis dépôt distant (méthode brusque) :** git pull
** Méthode douce :**
- git fetch --all
- git rebase origin/(branche sur laquelle on veut se mettre à niveau)
Cumul => gut pull --rebase
**Mettre à jour dépôt local et workspace si d'autres commits on été poussé dans le repo distant et que du travail en workspace n'a pas été indexé**
- git fetch
- git reset HEAD
- git stash
- git pull origin BRANCH
- git stash pop
- Résoudre les éventuels conflits
**Mettre à jour dépôt local et workspace sur une branche de dev alors que d'autres commits ont été poussé sur la branche master depuis sur le repo distant**
- git fetch --all
- git stash
- git rebase origin/master
- git stash pop
** Changer url d'un dépôt distant :**
- cd repertoire/du/workspace
- git remote remove origin
- git remote add origin url/du/depôt/distant
- git fetch --all
===== Dépôt local =====
**Mise à jour dépot local après avoir effecuté modifs dans le workspace : **
git add .
=> indexe toutes les modifs locales dans l'index (modifs de fichier, ajout, déplacement de fichiers, création dossier....)
**Mise à jour workspace en placant HEAD au même niveau qu'un tag :**
git checkout TAG (par ex v3.1.1)
Renommer une branche dans le workspace : git branch -m BRANCH
Supprimer du repo local les branches distantes qui n'existent plus : git remote prune origin
Supprimer une branche dans le workspace : git branch -d BRANCH
**Ajout selectif des modifications**
Faire un ''git add -p'' pour choisir les modification qu'on souhaite ajouter au prochain commit.
Options possibles pour chaque ajout :
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? ?
y - stage this hunk
n - do not stage this hunk
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
Source : https://git-scm.com/book/it/v2/Git-Tools-Interactive-Staging#r_interactive_staging
===== Merge Request =====
=> Possibilité d'effectuer merge en cli avant le push
PRIVILÉGIER de passer par Gitlab.
Aller dans le projet => Merge Request => New Merge request
===== Alias utiles =====
=> Historiques des commits (git lg amélioré)
lg = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)-%an%C(reset)%C(bold yellow)%d%C(reset)' --all
===== Divers =====
* Rejouer un diff à un endroit donné : git cherry-pick ID_COMMIT
* Appliquer un diff dans un autre dépôt
- Créer un patch dans le dépôt source: git diff --fichier_à_modifier > nomdupatch.patch
- Aller dans le dépôt destination
- Appliquer le patch : git apply /chemin/depôt/source/nomdupatch.patch
* Changer le message du dernier commit : git commit --amend
* Ajouter un tag de version : git tag version-tag
* Modifier l'ID du dernier commit sans faire de modif : git commit --amend --no-edit
* Créer un commit vide (pour déclencher une CI par exemple) : git commit --allow-empty -m "Faux commit"
===== Sources =====
https://wiki.evolix.org/HowtoGit