J'ai actuellement trois fichiers modifiés dans mon répertoire de travail. Cependant, je veux que l'un d'eux soit réinitialisé à l'état HEAD.
Dans SVN, j'utiliserais svn revert <filename>
(suivi svn update <filename>
si nécessaire) mais dans Git je devrais utiliser git reset --hard
. Cependant, cette commande ne peut pas fonctionner sur un seul fichier.
Existe-t-il un moyen dans Git d'annuler les modifications apportées à un seul fichier et de l'écraser avec une nouvelle copie HEAD?
git checkout
ci-dessous est la réponse. Dans git, "revert" est quelque chose que vous faites pour un commit. "Revert" rejoue l'inverse d'un commit historique dans votre répertoire de travail, vous pouvez donc faire un nouveau commit qui "annule" le commit annulé. Je trouve que c'est un point de confusion fréquent pour les gens venant de git depuis svn.Réponses:
Vous pouvez utiliser la commande suivante:
... qui mettra à jour la copie de travail
my-file.txt
et son état dans l'index avec celui de HEAD.--
signifie essentiellement: traiter chaque argument après ce point comme un nom de fichier . Plus de détails dans cette réponse . Merci à VonC de l' avoir signalé.la source
HEAD~1
pour indiquer l'avant-dernier commit.HEAD
si vous êtes à la tête de la branche actuelle - voir norbauer.com/rails-consulting/notes/…reset
commande (comme il est dit) "ne peut pas effectuer de réinitialisation matérielle avec les chemins d'accès", puis pourquoi lacheckout
commande n'est pas (ne peut pas être?) Utilisée pour réinitialiser en dur l'ensemble complet? (Je veux dire pourquoi il a été conçu ainsi.)git checkout
: "Écraser les chemins dans l'arborescence de travail en les remplaçant par le contenu de l'index ou de <tree-ish>". C'est-à-dire si<tree-ish>
est omis, quel que soit le contenu de l'index sera utilisé pour mettre à jour l'arborescence de travail. Cela peut ou non différer de HEAD.Réinitialiser à la tête:
Pour réinitialiser en dur un seul fichier sur HEAD:
Notez que
@
c'est l'abréviation deHEAD
. Une ancienne version de git peut ne pas prendre en charge la forme courte.Réinitialiser l'index:
Pour réinitialiser en dur un fichier unique à l' index , en supposant que l'index n'est pas vide, sinon à HEAD:
Le fait est que pour être sûr, vous ne voulez pas laisser de côté
@
ou àHEAD
partir de la commande, sauf si vous voulez spécifiquement réinitialiser l'index uniquement.la source
man bash
page. Également mentionné dans cette réponse: unix.stackexchange.com/a/187548/142855--
est utilisé pour indiquer le programmeI've finished specifying "options", and from here on, everything will be a positional argument.
. Classiquement, les "options" sont les jetons comme--recursive
qui peuvent apparaître dans n'importe quel ordre, ou même être combinés ensemble sous leur forme courte, comme avecrm -rf
. Au contraire, les "arguments positionnels" sont beaucoup plus comme des arguments passés à une fonction dans un langage de programmation: leur position dans la liste des jetons définit exactement ce que le programme va en faire (ce sont souvent des noms de fichiers).--
supprime l'ambiguïté quant à ce qui est lequel.Pour revenir en amont / maître, procédez comme suit:
la source
Depuis Git 2.23 (août 2019), vous pouvez utiliser
restore
( plus d'informations ):Ce qui précède sera restauré
MyFile
leHEAD
(le dernier commit) sur la branche actuelle.Si vous souhaitez obtenir les modifications d'autres validations, vous pouvez revenir en arrière dans l'historique des validations. La commande ci-dessous obtiendra
MyFile
deux validations avant la dernière. Vous avez maintenant besoin de l' option-s
(--source
) puisque vous utilisez maintenantmaster~2
et nonmaster
(par défaut) lorsque vous restaurez la source:Vous pouvez également obtenir le fichier d'une autre branche!
la source
La référence à HEAD n'est pas nécessaire.
git checkout -- file.js
est suffisantla source
vous pouvez utiliser la commande ci-dessous pour réinitialiser un seul fichier
Liste tous les fichiers modifiés à obtenir
path_to_file/filename
avec la commande ci-dessousla source
Vous pouvez utiliser la commande suivante:
git reset -- my-file.txt
qui mettra à jour à la fois la copie de travail de l'
my-file.txt
ajout.la source
Vous pouvez utiliser la commande suivante:
Si vous avez une branche avec le même nom de fichier, vous devez utiliser cette commande:
la source
Un moyen simple, facile et pratique de vous sortir de l'eau chaude, surtout si vous n'êtes pas si à l'aise avec git:
Afficher le journal de votre fichier
git log myFile.js
commit 1023057173029091u23f01w276931f7f42595f84f Auteur: kmiklas Date: mar 7 août 09:29:34 2018 -0400
JIRA-12345 - Refactor avec une nouvelle architecture.
Notez le hachage du fichier:
1023057173029091u23f01w276931f7f42595f84f
Affichez le fichier à l'aide du hachage. Assurez-vous que c'est ce que vous voulez:
git show 1023057173029091u23f01w276931f7f42595f84f: ./ myFile.js
Rediriger le fichier vers une copie locale
git show 1023057173029091u23f01w276931f7f42595f84f: ./ monFichier.js> monFichier.07aug2018.js
Sauvegardez votre fichier actuel.
cp myFile.js myFile.bak.js
Ouvrez les deux fichiers dans votre éditeur de texte préféré.
vim myFile.js
vim myFile.07aug2018.js
Copiez le code n 'paste de myFile.07aug2018.js vers myFile.js et enregistrez.
Validez et envoyez myFile.js
Consultez à nouveau le journal et confirmez que votre fichier est correctement en place.
Dites à vos clients de tirer la dernière version, regardez-la avec plaisir avec l'ancienne version en place.
Pas la solution la plus sexy ou la plus git-centrique, et certainement une réinitialisation / réversion "manuelle", mais cela fonctionne. Il nécessite une connaissance minimale de git et ne perturbe pas l'historique des validations.
la source