Git

De Octet.ca

Sommaire

[modifier] git diff

Pour avoir seulement les noms de fichiers changés:

git diff --name-only


[modifier] git checkout

Pour revenir à la version la plus à jour:

git checkout master

[modifier] git branch

[modifier] Créer un branche

git branch nom_de_la_branche

[modifier] Liste des branches

Shows both remote and local branches:

git branch -a 

Shows remote branches:

git branch -r

[modifier] Identifier la branche courante

git rev-parse --abbrev-ref HEAD

[modifier] Basculer sur une branche

Synchroniser les branches avec le serveur remote:

git fetch origin

Bascule sur une branche locale déjà existante:

git checkout nom_de_la_branche

Crée une branche locale, la pointe vers une branche remote, et bascule sur la branche:

git branch nom_de_la_branche_locale origin/nom_de_la_branche_remote
git checkout nom_de_la_branche_locale

ou

git checkout -b nom_de_la_branche_locale origin/nom_de_la_branche_remote

[modifier] Créer et basculer sur une branche

git checkout -b nom_de_la_branche

[modifier] Effacer une branche

git branch -d nom_de_la_branche

[modifier] Écraser master par une branche

Il suffit de renommer master la branche en question

git branch -m master old-master
git branch -m nom_de_la_branche master
git push -f origin master

[modifier] Synchroniser le repot local avec le remote (efface vieille branche)

git remote prune origin

[modifier] git push

[modifier] Pousser une branche

git push -u origin nom_de_la_branche

[modifier] Effacer les derniers commits

Ça va effacer pour vrai, fait que niaisez pas.

git push -f origin last_known_good_commit:branch_name

Exemple:

 git push -f origin 738fdad:master

Le last_known_good_commit peut être obtenu en prenant le HASH obtenu avec git log. Pour la branche master, il faut retirer la protection de la branche pour les développeurs.

[modifier] Retirer la protection

Dans GitLab, un push --force est protégé sur la branche master. Pour retirer temporairement cette protection et mettre en place un nouvel historique, il faut sélectionner dans le projet:

  • projet -> settings -> Protected branches
  • Au bas de la page, sélectionner Developers can push sur la ligne master. Cliquez sur le bouton rouge Unprotect.
  • Faire le git push --force master.
  • Remettre la protection sur la branche master

[modifier] git tag

[modifier] Liste des tags

git tag

[modifier] Ajout d'un tag

Pour mettre un tag à la version courante:

git tag -a 1977-12-22 -m "Version du 1977-12-22"

Pour mettre un tag à une version spécifique:

git tag -a 1977-12-22 f6dfb83d -m "Version du 1977-12-22"

f6dfb83d est le SHA1 du commit en question.

[modifier] Pousser les tags sur le repo distant

Pousse les commits ET les tags:

git push --follow-tags

ou:

git push --tags

[modifier] Effacer un tag

Pour effacer localement le tag:

git tag -d NOM_DU_TAG

Pour l'effacer du depo par la suite:

git push origin :refs/tags/NOM_DU_TAG

[modifier] git log

Pour voir un historique des commits:

git log

Pour voir quelque chose de cours:

git log --oneline


[modifier] Synchroniser le code local avec la serveur distant

Pour récupérer sur le code local les changements fait au serveur distant

git pull

Si vous avez le message Your branch is ahead of 'origin/master' by N commit(s) et que vous désirez revenir synchro avec le serveur distant, faire la commande:

git reset --hard origin/master

[modifier] git commit

[modifier] Effacer les derniers commits

Pour revenir au SHA1:

git reset --hard SHA1

Pour reculer de 4 commits à partir de HEAD:

git reset --hard HEAD~4

Si les commits à effacer étaient déjà poussés, il faut faire par la suite:

git push origin HEAD --force

[modifier] Fusionner deux commits

 git rebase -i ${SHA1}

où ${SHA1} est l’ID du commit précédent celui à fusionner. Pour fusionner des commits, il remplacer le mot pick par squash devant le commit. Celui dans lequel ils sont fusionnés doit conserver le mot pick. Sauvegarder le fichier. Un éditeur s'ouvrira avec les commentaires de tous les commits. Éditer pour garder ce qu'on veut. Sauvegarder.

[modifier] Changer les commentaires des commits

[modifier] Pour le dernier commit

git commit --amend

[modifier] Pour des vieux commits

Créer une nouvelle branche:

git checkout -b nouvel_historique

Faire un git rebase de la branche:

git rebase --interactive ${SHA1}

où ${SHA1} est l’ID du commit précédent celui à modifier. Pour modifier le premier commentaire de tous, qui n'a aucun précédent, il faut utiliser --root au lieu du ${SHA1}. Après cette commande, un éditeur s’ouvrira. Pour modifier le commentaire des commits, il remplacer le mot pick par reword devant le commit (sans changer le message de commit tout de suite).

Par exemple:

pick fc70f72 Commentaire à changer

deviendra:

reword fc70f72 Commentaire à changer

Il faut sauvegarder le fichier et quitter l'éditeur. Un éditeur s'affichera par la suite pour chaque message, qu'il est alors possible de modifier.

Vérifier que la branche master et nouvel_historique sont les mêmes, mis à part les commentaires de l'historique avec la commande:

git diff master nouvel_historique

Il suffit par la suite d'écraser la version master avec la nouvelle. Faire une copie de sauvegarde de master:

git branch -m master master-old_historique

Copier nouvel_historique dans master:

git branch -m nouvel_historique master

Mettre à jour la branche master du dépôt central avec le nouvel historique (il faut déprotéger le push, voir plus bas):

git push --force origin master

[modifier] Remplacer une version d'un fichier par un autre

Il faut utiliser ce script:

#!/bin/bash

ANCIEN_FICHIER=${1}
NOUVEAU_FICHIER=${2}
COMMIT_A_REMPLACER=${3}

git filter-branch --force --tag-name-filter cat --tree-filter "
if [ "\${GIT_COMMIT}" = "${COMMIT_A_REMPLACER}" ]; then
   cp ${NOUVEAU_FICHIER} ${ANCIEN_FICHIER}
else
   cat
fi
" HEAD


Il faut appeler le script pour remplacer le fichier il faut appeler le script de cette manière:

./script /full/path/fichier/a/ecraser /full/path/fichier/nouveau SHA1

où SHA1 est le numéro complet (ex: "76c774b97371fed23234d9db703f8d1f28a90d76" et non "76c774b").

Une fois cela fait, il faut:

  • Refaire les tags pour cette version, s'il y a lieu
  • git push —force origin branche

[modifier] Ne pas utiliser de mot de passe sous ssh

Voir Git push: username, password, how to avoid?

[modifier] Questions à résoudre

  • Comment voir la différence entre le code local, une fois les commits effectués, et celui du repository?
  • Doit-on effacer les branches une fois qu'elles ont été mergées?

[modifier] Liens

Outils personnels