Git

De Octet.ca

git diff[modifier]

Pour avoir seulement les noms de fichiers changés:

git diff --name-only


git checkout[modifier]

Pour revenir à la version la plus à jour:

git checkout master

git branch[modifier]

Créer un branche[modifier]

git branch nom_de_la_branche

Liste des branches[modifier]

Shows both remote and local branches:

git branch -a 

Shows remote branches:

git branch -r

Identifier la branche courante[modifier]

git rev-parse --abbrev-ref HEAD

Basculer sur une branche[modifier]

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

Créer et basculer sur une branche[modifier]

git checkout -b nom_de_la_branche

Effacer une branche[modifier]

git branch -d nom_de_la_branche

Écraser master par une branche[modifier]

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

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

git remote prune origin

git push[modifier]

Pousser une branche[modifier]

git push -u origin nom_de_la_branche

Effacer les derniers commits[modifier]

Ç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.

Retirer la protection[modifier]

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 -> Repository -> 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

git tag[modifier]

Liste des tags[modifier]

git tag

Ajout d'un tag[modifier]

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.

Pousser les tags sur le repo distant[modifier]

Pousse les commits ET les tags:

git push --follow-tags

ou:

git push --tags

Effacer un tag[modifier]

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

git log[modifier]

Pour voir un historique des commits:

git log

Pour voir quelque chose de cours:

git log --oneline


Synchroniser le code local avec la serveur distant[modifier]

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

git commit[modifier]

Effacer les derniers commits[modifier]

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

Fusionner deux commits[modifier]

 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.

Changer les commentaires des commits[modifier]

Pour le dernier commit[modifier]

git commit --amend

Pour des vieux commits[modifier]

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

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

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

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

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

Questions à résoudre[modifier]

  • 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?

Liens[modifier]