Supprimer un fichier du dépôt tout garder le fichier

modifier

git rm fichier.txt supprime le fichier du dépôt mais supprime aussi le fichier local.

Pour ne l'enlever que du dépôt, utiliser git rm --cached fichier.txt.

Ajouter "-r" pour les dossiers.

Annuler une soumission

modifier

Quand on ne peut pas réécrire l'historique (par exemple en production) mais qu'il faut annuler un commit, on utilise git revert avec HEAD pour désigner la dernière soumission effectuée :

 $ git revert HEAD
 Finished one revert.
 [master 47e3b6c] Revert "Soumission 2"
  1 files changed, 0 insertions(+), 1 deletions(-)
 $ ls -a
 .  ..  fichier.txt  .git

Pour signifier d'autres soumissions que la dernière :

  • git revert HEAD^ : l'avant dernière.
  • git revert HEAD~5 : la cinquième moins récente.
  • git revert e6337879 : la soumission n°e6337879.

Ensuite, il est recommandé de vérifier que le rollback a bien fonctionné en s'assurant de l'absence de différence entre le code actuel et celui de n-1 (où n est le nombre de commits annulés)[1]

git revert --no-commit HEAD~2..HEAD
git diff HEAD~3 HEAD

Annuler un merge

modifier

On ne peut pas annuler un merge comme un commit, il faut indiquer le nombre reverté (où réverter un seul merge de plusieurs commits reverte tous les commits) :

git revert -m 1

Nettoyer les changements non soumis

modifier
 
Options de git reset dans NetBeans

Pour annuler les modifications de fichiers non soumises (discard) :

git clean -f

Pour annuler les créations de fichiers non soumises :

git stash save -u
git stash drop "stash@{0}"

Annuler les changements soumis

modifier

Par ailleurs, il existe plusieurs niveaux de reset[2] :

  • soft : ne touche pas à l'index ni au répertoire de travail. Les fichiers en reset retournent juste de la liste des commités à celle à commiter.
  • hard : efface l'index et le répertoire de travail. Cette option équivaut à un reset + clean.
  • mixed : celui par défaut, mélange des deux précédents. Il laisse les fichiers du répertoire de travail, mais annule l'index.
  • merge
  • keep

Pour effacer les changements en cours, en rétablissant les états de la dernière soumission :

$ git reset --hard HEAD

ou

$ git reset --hard e6337879

Pour ne toucher qu'un seul fichier :

$ git checkout fichier.txt


  • Pour effacer les deux derniers commits sans toucher aux fichiers : git reset 'HEAD~2'.
  • Pour effacer les deux derniers commits et leurs modifications dans les fichiers : git reset HEAD~2 --hard.
  • Pour revenir deux opérations en arrière sur la branche : git reset HEAD@{2} (utilise la liste des opérations visible dans git reflog). Cela peut donc permettre d'annuler un reset malencontreux.

restore

modifier

git restore revient à la version du fichier spécifié en paramètre[3].

Par exemple, pour restaurer tous les fichiers du dossier courant :

git restore .

Pour annuler des "git add" (donc retirer un fichier de la zone de transit) :

git restore --staged mon_fichier.txt

Récupérer une version de fichier

modifier

Il faut d'abord récupérer l'identifiant de la version avec git log :

 $ git log
 commit 47e3b6cb6427f8ce0818f5d3a4b2e762b72dbd89
 Author: NomUtilisateur <NomEmail@exemple.com>
 Date:   Sat Mar 6 22:24:00 2010 -0400
 
     Revert "Soumission 2"
     
     This reverts commit e6337879cbb42a2ddfc1a1602ee785b4bfbde518.
 
 commit e6337879cbb42a2ddfc1a1602ee785b4bfbde518
 Author: NomUtilisateur <NomEmail@exemple.com>
 Date:   Sat Mar 6 22:17:20 2010 -0400
 
     My second commit
 
 commit be8bf6da4db2ea32c10c74c7d6f366be114d18f0
 Author: NomUtilisateur <NomEmail@exemple.com>
 Date:   Sat Mar 6 22:11:57 2010 -0400
 
     My first commit

Ensuite pour lire la version, utiliser git show :

 $ git show e6337879cbb42a2ddfc1a1602ee785b4bfbde518:fichier.txt
 Test Git Wikilivres.
 test de suppression Git pour Wikilivres

Créer et appliquer un patch

modifier

Créer un patch[4] génère un texte de toute la série des changements entre les branches origines et master.

$ git format-patch origin/master

Pour appliquer un patch :

$ git apply --stat  P1.txt  # affiche les stats des changements
$ git apply --check P1.txt  # vérifie les problèmes
$ git am < P1.txt           # applique le patch dans l'ordre

Le patch est aussi le mode de transfert entre dépôts.

Références

modifier