J'utilise Git et j'ai engagé quelques fichiers en utilisant
git commit -a
Plus tard, j'ai découvert qu'un fichier avait été ajouté par erreur à la validation.
Comment supprimer un fichier du dernier commit?
git
git-commit
Fric
la source
la source
git reset filepath
Réponses:
Je pense que d'autres réponses ici sont fausses, car il s'agit de déplacer les fichiers validés par erreur dans la zone de transfert à partir de la validation précédente, sans annuler les modifications qui leur ont été apportées. Cela peut être fait comme l'a suggéré Paritosh Singh:
ou
Réinitialisez ensuite les fichiers indésirables afin de les exclure du commit:
Maintenant, validez à nouveau, vous pouvez même réutiliser le même message de validation:
la source
git push
corriger votre repo, il se plaindraUpdates were rejected because the tip of your current branch is behind its remote counterpart.
. Si vous êtes sûr de vouloir les pousser (par exemple, c'est votre fourche), vous pouvez utiliser l'-f
option pour forcer la poussée, par exemplegit push origin master -f
. (Ne faites pas cela à un dépôt en amont que d'autres recherchent)git reset --soft HEAD^
est mon opération d'annulation la plus courantegit reset
mais je voulais un moyen d'affecter le commit existant "en place". Je viens d'apprendregit commit -C
. Donc, pour moi, ce que je veux, c'est votre recette exacte avec une étape de plus, le "nouveau commit à nouveau" écrit commegit commit -C [hash of original HEAD commit from first step]
.ATTENTION ! Si vous souhaitez uniquement supprimer un fichier de votre commit précédent et le conserver sur le disque , lisez la réponse de juzzlin juste au-dessus.
S'il s'agit de votre dernier commit et que vous souhaitez supprimer complètement le fichier de votre référentiel local et distant , vous pouvez:
git rm <file>
git commit --amend
Le drapeau de modification indique à git de recommencer, mais "fusionner" (pas dans le sens de fusionner deux branches) cette validation avec la dernière validation.
Comme indiqué dans les commentaires, utiliser
git rm
ici, c'est comme utiliser larm
commande elle-même!la source
git rm --cached
pour conserver les fichiers sur le disquerm
dans lagit
commande est en train de faire ce querm
lui - même fait!git commit --amend
est toujours là et peut être trouvé par exemple avecgit reflog
. Ce n'est donc pas aussi mauvais que les autres commentaires le suggèrent.Les réponses existantes parlent toutes de la suppression des fichiers indésirables du dernier commit.
Si vous souhaitez supprimer des fichiers indésirables d'un ancien commit (même poussé) et ne souhaitez pas créer un nouveau commit, ce qui n'est pas nécessaire, en raison de l'action:
1.
Recherchez le commit auquel vous souhaitez que le fichier soit conforme.
vous pouvez le faire plusieurs fois si vous souhaitez supprimer de nombreux fichiers.
2.
3.
Trouvez le commit_id du commit sur lequel les fichiers ont été ajoutés par erreur , disons "35c23c2" ici
Cette commande ouvre l'éditeur en fonction de vos paramètres. La valeur par défaut est vim.
Déplacez le dernier commit, qui devrait être "supprimer les fichiers indésirables", à la ligne suivante du commit incorrect ("35c23c2" dans notre cas), et définissez la commande comme suit
fixup
:Vous devriez être bon après avoir enregistré le fichier.
Pour finir :
Si vous rencontrez malheureusement des conflits, vous devez les résoudre manuellement.
la source
git rm --cached <file(s)>
.--fixup=35c23c2
à lagit commit
commande. Cela configurera le commit automatiquement comme une correction du commit requis et vous n'aurez donc pas besoin de le spécifier dans la rebase. De plus, si vous ajoutez--autosquash
à lagit rebase
commande, git déplacera automatiquement votre commit au bon endroit, donc vous n'avez rien à faire dans la rebase interactive - enregistrez simplement le résultat (ce qui signifie que vous n'avez même pas besoin de-i
marquer, bien que j'aime quand même l'utiliser pour m'assurer que tout ressemble à ce que j'attends).Comme l'indique la réponse acceptée, vous pouvez le faire en réinitialisant l'intégralité du commit. Mais c'est une approche plutôt lourde.
Une façon plus propre de le faire serait de conserver la validation et de simplement en supprimer les fichiers modifiés.
Le
git reset
prendra le fichier tel qu'il était lors de la validation précédente et le mettra en scène dans l'index. Le fichier dans le répertoire de travail est intact.Le
git commit
va ensuite valider et écraser l'index dans le commit actuel.Cela prend essentiellement la version du fichier qui était dans la validation précédente et l'ajoute à la validation actuelle. Cela n'entraîne aucune modification nette et le fichier est donc effectivement supprimé de la validation.
la source
Si vous n'avez pas poussé les modifications sur le serveur, vous pouvez utiliser
Il réinitialisera toutes les modifications et reviendra à un seul commit
Si vous avez poussé vos modifications, suivez les étapes comme indiqué par @CharlesB
la source
La suppression du fichier à l'aide de rm le supprimera!
Vous ajoutez toujours à un commit dans git plutôt que de le supprimer, donc dans ce cas, remettez le fichier dans l'état où il était avant le premier commit (cela peut être une action de suppression de 'rm' si le fichier est nouveau), puis recommencez et le fichier disparaîtra.
Pour ramener le fichier à un état antérieur:
ou pour le remettre à l'état sur la TETE distante:
puis modifiez le commit et vous devriez trouver que le fichier a disparu de la liste (et qu'il n'a pas été supprimé de votre disque!)
la source
la source
Ce qui suit mettra en scène uniquement le fichier que vous vouliez, ce que l'OP a demandé.
Vous verrez quelque chose comme ce qui suit ...
À ce stade, vous pouvez faire tout ce que vous voulez dans le fichier, comme réinitialiser une version différente.
Lorsque vous êtes prêt à vous engager:
ou (si vous avez d'autres changements en cours que vous ne voulez pas encore valider)
la source
Je vais vous expliquer avec exemple.
Soit A, B, C 3 commits successifs. La validation B contient un fichier qui n'aurait pas dû être validé.
la source
noop
enedit [A_commit_ID]
oue [A_commit_ID]
Vous pouvez simplement essayer.
et créez un nouveau commit.
Cependant, il existe un logiciel génial "gitkraken". ce qui facilite le travail avec git.
la source
git commit --amend
avoir la suppression du fichier mise à jour dans votre dernier commit; et après, vous pouvez vérifier qu'il a bien été supprimé avecgit log -1 --stat
vous laissera toujours le fichier local. Si vous ne voulez pas non plus le fichier localement, vous pouvez ignorer l'option --cached.
Si tout le travail est sur votre branche locale, vous devez conserver le fichier dans un commit ultérieur, et comme avoir un historique propre, je pense qu'une façon plus simple de le faire pourrait être:
et vous pouvez ensuite terminer facilement le rebasage sans avoir à vous souvenir de commandes plus complexes ou à valider un message ou à taper autant.
la source
L'utilisation de git GUI peut simplifier la suppression d'un fichier de la validation précédente.
En supposant que ce n'est pas une branche partagée et que cela ne vous dérange pas de réécrire l'historique , exécutez:
Vous pouvez décocher le fichier qui a été validé par erreur, puis cliquer sur "Valider".
Le fichier est supprimé de la validation, mais sera conservé sur le disque . Donc, si vous avez décoché le fichier après l'avoir ajouté par erreur, il s'affichera dans votre liste de fichiers non suivis (et si vous avez décoché le fichier après l'avoir modifié par erreur, il s'affichera dans vos modifications non mises en scène pour la liste de validation).
la source
sudo apt-get install git-gui
git rebase -i HEAD~4
puis exécuté votre commande pour ouvrir l'éditeur. Autre remarque: "Unstaging" se trouve dans le menu "Commit".git reset --soft HEAD^
(en se souvenant de l'argument --soft), suivi degit commit -c ORIG_HEAD
(plutôt que --amend, qui fout tout).Si vous souhaitez conserver votre commit (peut-être avez-vous déjà passé un certain temps à écrire un message de commit détaillé et que vous ne voulez pas le perdre) et que vous souhaitez uniquement supprimer le fichier du commit, mais pas du référentiel:
la source
Effectuez une séquence des commandes suivantes:
la source
Je voulais juste compléter la première réponse car je devais exécuter une commande supplémentaire:
À votre santé!
la source
Quelque chose qui a fonctionné pour moi, mais pense toujours qu'il devrait y avoir une meilleure solution:
Laissez simplement le changement que vous souhaitez supprimer dans l'autre commit, vérifiez les autres
la source
git reset --soft HEAD^
annule votre commit, et lorsque vous tapezgit status
, il vous indique quoi faire:la source
En fait, je pense qu'un moyen plus rapide et plus simple consiste à utiliser le mode interactif git rebase.
(ou dirigez-vous ~ 4, jusqu'où vous voulez aller)
puis, au lieu de «choisir», utilisez «modifier». Je ne savais pas à quel point le «montage» est puissant.
https://www.youtube.com/watch?v=2dQosJaLN18
J'espère que vous le trouverez utile.
la source
Eu le même problème où j'ai des changements dans une branche locale où je voulais revenir à un seul fichier. Ce qui a fonctionné pour moi était -
( feature / target_branch ci-dessous est l'endroit où j'ai toutes mes modifications, y compris celles que je voulais annuler pour un fichier spécifique)
( origin / feature / target_branch est la branche distante où je veux pousser mes modifications)
( fonctionnalité / staging est ma branche de staging temporaire où je vais pousser de toutes mes modifications souhaitées à l'exception de la modification de ce fichier)
Créer une branche locale à partir de mon origine / fonction / branche_branche - appelée fonction / mise en scène
Fusionné ma branche locale travaillant fonction / target_branch à la fonction / mise en scène branche
Extrait de la fonctionnalité / mise en scène puis réinitialisation de git --soft ORIG_HEAD (Maintenant, toutes les modifications de la fonction / mise en scène seront mises en place mais non validées.)
Unstaged le fichier que j'ai précédemment archivé avec des modifications inutiles
Changement de la branche amont pour fonction / mise en scène d' origine / fonction / target_branch
Validé le reste des modifications par étapes et poussé en amont vers mon origine / fonctionnalité / branche_branchée distante
la source
Si vous n'avez plus besoin de ce fichier, vous pouvez le faire
la source
Si vous utilisez GitHub et n'avez pas encore poussé la validation, GitHub Desktop résout facilement ce problème:
la source
Si vous souhaitez supprimer des fichiers des validations précédentes, utilisez des filtres
Si vous voyez cette erreur:
Impossible de créer une nouvelle sauvegarde. Une sauvegarde précédente existe déjà dans refs / original / Force écrasant la sauvegarde avec -f
Supprimez simplement les sauvegardes de références sur votre référentiel local
la source
si vous n'avez pas encore poussé vos modifications vers git
Il réinitialisera toutes les modifications et reviendra à un seul commit
S'il s'agit du dernier commit que vous avez effectué et que vous souhaitez supprimer le fichier du référentiel local et distant, essayez ceci:
ou encore mieux:
réinitialiser d'abord
réinitialiser le fichier indésirable
engager à nouveau
la source
Cela a fonctionné pour moi pour supprimer le fichier du dépôt de bit bit que j'ai poussé le fichier pour créer une branche initialement.
la source
J'ai copié les fichiers actuels dans un dossier différent, puis je me suis débarrassé de toutes les modifications non poussées en:
Recopiez ensuite les choses. Validez, poussez.
la source
Vous pouvez simplement utiliser cette commande:
la source
la source
À l'heure actuelle, aucune des réponses n'est raisonnable. Il semble que la demande soit suffisante pour qu'une véritable solution soit proposée: https://github.com/git/git/blob/master/Documentation/SubmittingPatches
serait bien. J'obtiens que nous ne voulons pas modifier l'historique, mais si je suis local et que j'ai accidentellement ajouté un fichier "hack" local et que je veux le supprimer du commit, ce serait super utile.
la source