Question Comment modifier le dernier commit pour dés-ajouter un fichier?


J'ai modifié deux fichiers a, b dans le dernier commettre. Mais file b ne devrait pas être engagé, quel est le flux de travail pour modifier cela?


86
2018-01-05 06:43


origine




Réponses:


Mise à jour (quelques années plus tard)

Jan Hudec 

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

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

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

HEAD^ permet au fichier d'accéder à son contenu lors du commit précédent avant le dernier.

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


Réponse originale (janvier 2011)

Si c'est votre dernier commit (et que vous ne l'avez pas poussé nulle part), vous pouvez modifier il:
(première réserve ou épargne b)

 git commit --amend

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

--amend

Utilisé pour modifier la pointe de la branche actuelle.
  Préparez l'objet de l'arborescence que vous souhaitez remplacer comme d'habitude par la dernière validation (cela inclut les chemins habituels -i / -o et explicites), et l'éditeur de journal de validation est généré avec le message de validation de l'extrémité de la branche en cours.
  Le commit que vous créez remplace le conseil actuel - s'il s'agissait d'une fusion, les parents du conseil actuel seront les parents - de sorte que la validation top actuelle soit supprimée.


88
2018-01-05 07:08



... Then stash/delete b, re-commit.., ici ne devrait pas le mot Then être after? - --amend après stach / delete b, ... - Xiè Jìléi
@ 谢 继 雷: en d'autres termes, sauvegardez d'abord b, puis validez --amend, puis restaurez? Vrai. J'ai mis à jour la réponse. - VonC
Avec la puissance de git index, dire à n'importe qui de cacher / sauvegarder le fichier est tout simplement idiot (-1). Il est trivial de le supprimer de l'index uniquement. - Jan Hudec
@JanHudec C'est vrai, j'ai édité la réponse en conséquence. Je n'ai pas suivi cette vieille réponse aussi étroitement que je le fais sur Stack Overflow. 99% des questions git sur SU devraient être migrées sur SO de toute façon. - VonC


  1. git diff --name-only HEAD^ - (facultatif) utiliser pour lister les fichiers qui ont changé dans le dernier commit.
  2. git reset HEAD^ path/to/file/to/revert - à réinitialiser le indice à cette dernière version, en laissant la copie de travail intact.
  3. git commit --amend - modifier ce dernier engagement à inclure le indice changements

53
2018-03-18 04:21



Imho c'est une bien meilleure réponse que celle acceptée. - mik01aj
Notez que vous ne devez pas utiliser git commit -a --amend (c’est-à-dire n’ajoutez pas de fichiers) pour l’étape 3, ou vous allez commettre vos modifications de la copie de travail qui sont les modifications que vous essayez de supprimer. Une étape facultative 2.5 pourrait être git checkout path/to/file/to/revertpour nettoyer votre copie de travail aussi. - dmnd
Alternativement git rm --cached path/to/file/to/revert pour supprimer un fichier sans le supprimer de l'arborescence. - Jan Hudec


Sinon, 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 vers la liste "Unstaged" et valider.


13
2018-05-06 07:47



@VonC: L'édition et la division de patchs est une opération assez courante pour les utilisateurs lourds, de sorte que l'interface graphique a été conçue pour le rendre facile et constitue le meilleur outil de l'OMI. - Jan Hudec
Ça marche! Je n'ai pas réussi avec d'autres options pour cette tâche particulière. Merci pour le conseil! - Serguzest


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 voulez supprimer toutes les modifications de b dans votre dernier commit

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

8
2018-05-06 07:34



git rm --cached et supprimer la danse de sauvegarde / restauration (-1). - Jan Hudec
Merci d'avoir fait remarquer cela. Je voulais partager comment je l'ai fait parce que c'était l'approche avec laquelle je me sentais le plus à l'aise même après avoir lu le fil entier. - pingo


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

$ 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 le faire git add -p pour savoir exactement ce que je veux commettre.


3
2017-10-27 22:45