web-dev-qa-db-fra.com

Comment modifier le dernier commit pour annuler l'ajout d'un fichier?

J'ai modifié deux fichiers a, b dans le dernier commit. Mais le fichier b ne doit pas être validé, quel est le workflow pour modifier cela?

101
Xiè Jìléi

Mise à jour (quelques années plus tard)

Jan Hudec

Il est trivial de le supprimer de l'index uniquement.

Vrai: vous pouvez facilement réinitialiser un fichier au contenu de son index, comme le suggère réponse plus récente (écrit par Matt Connolly ):

git reset HEAD^ path/to/file/to/revert

HEAD^ permet au fichier d'accéder à son contenu dans la précédente validation before the last.

Ensuite, vous pouvez git commit --amend , comme je l'ai écrit à l'origine ci-dessous.


Réponse originale (janvier 2011)

S'il s'agit de votre dernier commit (et que vous ne l'avez poussé nulle part), vous pouvez le modifier le:
(premier stash ou save b)

 git commit --amend

Puis supprimez b, re-commettez. Restaurez b et vous avez terminé.

--amend

Utilisé pour modifier la pointe de la branche actuelle.
Préparez l’objet arborescent que vous souhaitez remplacer par la dernière validation, comme d’habitude (cela inclut les chemins habituels -i/-o et explicite), et l’éditeur de journal de validation est semé avec le message de validation de la pointe de la branche actuelle.
Le commit que vous créez remplace le conseil actuel - s'il s'agissait d'une fusion, les parents du conseil actuel seraient les parents - de sorte que le commit le plus récent est ignoré.

100
VonC
  1. git diff --name-only HEAD^ - (facultatif) permet de répertorier les fichiers modifiés lors de la dernière validation.
  2. git reset HEAD^ path/to/file/to/revert - pour réinitialiser index à cette dernière version, en laissant la copie de travail intacte.
  3. git commit --amend - pour modifier ce dernier engagement afin d'inclure le index changes
60
Matt Connolly

Alternativement, si vous utilisez git gui, il vous suffit de sélectionner l'option "Modifier le dernier commit", le fichier ajouté apparaît dans la liste "Staged", cliquez sur son icône pour le déplacer dans la liste "Unstaged" et validez.

13
Jan Hudec

Si vous voulez supprimer b de votre dernier commit

git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend

Si vous souhaitez supprimer toutes les modifications apportées à b dans votre dernier commit

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)
10
pingo

Une alternative qui ne nécessite pas de hackery d'index, mais conserve néanmoins l'ancien message de commit:

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}

J'aime ça parce que (a) il utilise des commandes que j'utilise régulièrement et (b) je peux faire git add -p pour comprendre exactement ce que je veux valider.

3
Justin L.