J'ai apporté quelques modifications à un fichier qui a été validé plusieurs fois dans le cadre d'un groupe de fichiers, mais je souhaite maintenant réinitialiser / rétablir les modifications qu'il contient dans une version précédente.
J'ai fait un git log
avec un git diff
pour trouver la révision dont j'ai besoin, mais je n'ai aucune idée de comment ramener le fichier à son ancien état dans le passé.
git
version-control
git-checkout
Déteste_
la source
la source
--cached
lors de la vérificationgit diff
. lienRéponses:
En supposant que le hachage du commit que vous voulez est
c5f567
:La page de manuel git checkout donne plus d'informations.
Si vous souhaitez revenir à la validation avant
c5f567
, ajoutez~1
(où 1 est le nombre de validations que vous souhaitez revenir en arrière, cela peut être n'importe quoi):En guise de remarque, j'ai toujours été mal à l'aise avec cette commande car elle est utilisée à la fois pour les choses ordinaires (changement entre les branches) et pour les choses inhabituelles et destructrices (suppression des modifications dans le répertoire de travail).
la source
develop
), vous voudrezgit checkout develop -- file/to/restore
(notez le double tiret)Vous pouvez rapidement consulter les modifications apportées à un fichier à l'aide de la commande diff:
Ensuite, pour rétablir un fichier spécifique à ce commit, utilisez la commande reset:
Vous devrez peut-être utiliser le
--hard
option si vous avez des modifications locales.Un bon flux de travail pour gérer les points de cheminement consiste à utiliser des balises pour marquer proprement les points de votre chronologie. Je ne comprends pas très bien votre dernière phrase, mais ce que vous voudrez peut-être, c'est de diverger d'une branche d'un point dans le temps. Pour ce faire, utilisez la commande de paiement pratique:
Vous pouvez ensuite rebaser cela sur votre ligne principale lorsque vous êtes prêt à fusionner ces modifications:
la source
git checkout <commit hash> <filename>
a mieux fonctionné pour moi quegit reset
git checkout <commit hash> <filename>
travaillé pour moi. Cela ne devrait pas être la réponse acceptée, à mon humble avis.git reset
non.git reset
pour réinitialiser un seul fichier, vous obtiendrez une erreurfatal: Cannot do hard reset with paths
git reset --hard <commit hash> <filename>
. Ce sera une erreur avecfatal: Cannot do hard reset with paths.
ce que Motti Strom a dit: utilisationgit checkout <commit hash> <filename>
Vous pouvez utiliser n'importe quelle référence à un commit git, y compris le SHA-1 si cela vous convient le mieux. Le fait est que la commande ressemble à ceci:
git checkout [commit-ref] -- [filename]
la source
--
, et la réponse acceptée qui ne l'est pas?rm -- -f
(supprimer un fichier nommé-f
) semble être l'exemple canonique. Plus de détails icirm
commande utilise getopt (3) pour analyser ses arguments.getopt
est la commande pour analyser les arguments de commande. gnu.org/software/libc/manual/html_node/Getopt.htmlCela sera réinitialisé
foo
sur HEAD. Vous pouvez également:pour une révision en arrière, etc.
la source
git checkout -- foo
pour éviter toute erreur sifoo
quelque chose de spécial (comme un répertoire ou un fichier appelé-f
). Avec git, si vous n'êtes pas sûr, préfixez toujours tous les fichiers et répertoires avec l'argument spécial--
.--
n'est pas une commande git et n'est pas spéciale à git. C'est un bash intégré pour signifier la fin des options de commande. Vous pouvez également l'utiliser avec de nombreuses autres commandes bash.--
n'est pas un mot spécial intégré dans bash. Mais c'est une convention commune prise en charge par de nombreux analyseurs de ligne de commande et utilisée par de nombreuses CLI, y compris git.Et pour revenir à la dernière version validée, qui est le plus souvent nécessaire, vous pouvez utiliser cette commande plus simple.
la source
J'ai eu le même problème tout à l'heure et j'ai trouvé cette réponse plus facile à comprendre (
commit-ref
est la valeur SHA de la modification dans le journal que vous souhaitez revenir):Cela mettra cette ancienne version dans votre répertoire de travail et à partir de là, vous pouvez la valider si vous le souhaitez.
la source
Si vous savez combien de commits vous devez revenir en arrière, vous pouvez utiliser:
Cela suppose que vous êtes sur la
master
branche, et la version que vous souhaitez est 5 validée.la source
Je pense que je l'ai trouvé .... sur http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html
Parfois, vous voulez simplement revenir en arrière et oublier chaque changement après un certain point, car ils ont tous tort.
Commencer avec:
$ git log
qui affiche une liste des validations récentes et leurs hachages SHA1.
Ensuite, saisissez:
$ git reset --hard SHA1_HASH
pour restaurer l'état d'une validation donnée et effacer définitivement toutes les nouvelles validations de l'enregistrement.
la source
git push --force
Cela a fonctionné pour moi:
Validez ensuite le changement:
la source
Vous devez être prudent lorsque vous dites "rollback". Si vous aviez auparavant une version d'un fichier dans la validation $ A, puis que vous avez ensuite apporté deux modifications dans deux validations distinctes $ B et $ C (vous voyez donc la troisième itération du fichier), et si vous dites " Je veux revenir au premier ", tu le penses vraiment?
Si vous voulez vous débarrasser des changements à la fois la deuxième et la troisième itération, c'est très simple:
puis vous validez le résultat. La commande demande "Je veux extraire le fichier de l'état enregistré par le commit $ A".
D'un autre côté, vous vouliez vous débarrasser du changement apporté par la deuxième itération (c'est-à-dire commit $ B), tout en conservant ce que $ C a fait dans le fichier, vous voudriez revenir sur $ B
Notez que celui qui a créé le commit $ B peut ne pas avoir été très discipliné et avoir commis des modifications totalement indépendantes dans le même commit, et cette annulation peut toucher des fichiers autres que le fichier que vous voyez des changements offensants, vous pouvez donc vouloir vérifier soigneusement le résultat après avoir fait donc.
la source
Curieusement,
git checkout foo
cela ne fonctionnera pas si la copie de travail se trouve dans un répertoire nomméfoo
; Cependant, à la foisgit checkout HEAD foo
etgit checkout ./foo
sera:la source
git checkout -- foo
Voici comment ça
rebase
marche:Supposons que vous ayez
Les deux premières commandes ... commit git checkout git rebase master
... consultez la branche des modifications que vous souhaitez appliquer à la
master
branche. Larebase
commande prend les validations de<my branch>
(qui ne se trouvent pas dansmaster
) et les réapplique au chef demaster
. En d'autres termes, le parent du premier commit dans<my branch>
n'est plus un commit précédent dans l'master
historique, mais le responsable actuel demaster
. Les deux commandes sont les mêmes que:Il pourrait être plus facile de se souvenir de cette commande car les branches "base" et "modify" sont explicites.
. Le résultat final de l'historique est:
Les deux dernières commandes ...
... effectuez une fusion rapide pour appliquer toutes les
<my branch>
modificationsmaster
. Sans cette étape, la validation de rebase n'est pas ajoutée àmaster
. Le résultat final est:master
et les<my branch>
deux référencesB'
. De plus, à partir de ce moment, il est possible de supprimer la<my branch>
référence.la source
Depuis git v2.23.0, il existe une nouvelle méthode de restauration git qui est supposée assumer une partie de ce qui
git checkout
était responsable (même la réponse acceptée mentionne ce quigit checkout
est assez déroutant). Voir les faits saillants des changements sur le blog github .Le comportement par défaut de cette commande est de restaurer l'état d'une arborescence de travail avec le contenu provenant de la
source
paramètre (qui dans votre cas sera un hachage de validation).Donc, selon la réponse de Greg Hewgill (en supposant que le hachage de validation est
c5f567
), la commande ressemblerait à ceci:Ou si vous souhaitez restaurer le contenu d'un commit avant c5f567:
la source
Première réinitialisation de la tête du fichier cible
Deuxième extraction de ce fichier
la source
où
<N>
est le nombre de révisions du fichier à restaurer pour le fichier<filename>
.Par exemple, pour extraire la révision précédente immédiate d'un seul fichier
x/y/z.c
, exécutezComment fonctionne git prevision?
Ajoutez ce qui suit à votre
gitconfig
Essentiellement, tout ce que l'on ferait manuellement dans cette situation,
enveloppé dans un beau et efficace git-alias - git-prevision
la source
Je dois brancher EasyGit ici, qui est un wrapper pour rendre git plus accessible aux novices sans dérouter les utilisateurs chevronnés. L'une des choses qu'il fait est de donner plus de sens à
git revert
. Dans ce cas, vous diriez simplement:eg revert foo/bar foo/baz
la source
eg revert --in REVISON -- FILENAME
. C'est--in
important. Pour les utilisateurs de Windows: Ouvrez git bash. Exécutezecho %PATH
. Le premier chemin doit être dans votre répertoire utilisateur se terminant parbin
. Créez ce chemin. Conserver par exemple là-bas. Nommez-leeg
. Noneg.txt
.Dans le cas où vous souhaitez restaurer un fichier à une validation précédente (et le fichier que vous souhaitez rétablir déjà validé), vous pouvez utiliser
ou
Ensuite, mettez en scène et validez la "nouvelle" version.
Armé de la connaissance qu'un commit peut avoir deux parents dans le cas d'une fusion, vous devez savoir que HEAD ^ 1 est le premier parent et HEAD ~ 1 est le deuxième parent.
L'un ou l'autre fonctionnera s'il n'y a qu'un seul parent dans l'arbre.
la source
De nombreuses suggestions ici, la plupart dans le sens de
git checkout $revision -- $file
. Quelques alternatives obscures:Et aussi, je l'utilise beaucoup juste pour voir temporairement une version particulière:
ou
(OBS:
$file
doit être préfixé./
s'il s'agit d'un chemin relatif pourgit show $revision:$file
travailler)Et le plus étrange encore:
la source
Notez toutefois que
git checkout ./foo
etgit checkout HEAD ./foo
ne sont pas exactement la même chose; cas d'espèce:(La deuxième
add
étape du fichier dans l'index, mais il n'est pas validé.)Git checkout ./foo
signifie revenir au chemin./foo
de l' index ; l'ajoutHEAD
indique à Git de rétablir ce chemin dans l'index à saHEAD
révision avant de le faire.la source
Pour moi, aucune des réponses ne semblait vraiment claire et je voudrais donc ajouter la mienne qui semble super facile.
J'ai un commit
abc1
et après cela j'ai fait plusieurs (ou une modification) dans un fichierfile.txt
.Maintenant, disons que j'ai foiré quelque chose dans le fichier
file.txt
et que je veux revenir à un commit précédentabc1
.1
git checkout file.txt
.: cela supprimera les modifications locales, si vous n'en avez pas besoin2
git checkout abc1 file.txt
.: cela amènera votre fichier à votre recherche version3
git commit -m "Restored file.txt to version abc1"
.: cela entraînera votre réversion.git push
: cela poussera tout sur le référentiel distantEntre les étapes 2 et 3, bien sûr, vous pouvez faire
git status
pour comprendre ce qui se passe. Habituellement, vous devriez voir lefile.txt
déjà ajouté et c'est pourquoi il n'y a pas besoin d'ungit add
.la source
2.Git restaurer le fichier dans une branche spécifique
la source
Pour accéder à une version de validation précédente du fichier, obtenez le numéro de validation, dites eb917a1 puis
Si vous avez juste besoin de revenir à la dernière version validée
Cela vous amènera simplement au dernier état validé du fichier
la source
git checkout ref | commitHash - filePath
par exemple
la source
De nombreuses réponses ici prétendent utiliser
git reset ... <file>
ou,git checkout ... <file>
mais ce faisant, vous perdrez toutes les modifications sur<file>
la validation après la validation que vous souhaitez annuler.Si vous souhaitez annuler les modifications d'un commit sur un seul fichier, comme vous le
git revert
feriez mais pour un seul fichier (ou dire un sous-ensemble des fichiers de commit), je suggère d'utiliser les deuxgit diff
etgit apply
comme ça (avec<sha>
= le hachage du vous vous engagez à revenir):Fondamentalement, il générera d'abord un patch correspondant aux modifications que vous souhaitez annuler, puis appliquera le patch à l'envers pour supprimer ces modifications.
Bien sûr, cela ne fonctionnera pas si les lignes inversées ont été modifiées par un commit entre
<sha1>
etHEAD
(conflit).la source
git show -p <sha> path/to/file.ext|git apply -R
<sha>^!
place de<sha>^ <sha>
Utilisez
git log
pour obtenir la clé de hachage pour une version spécifique, puis utilisezgit checkout <hashkey>
Remarque: N'oubliez pas de taper le hachage avant le dernier. Le dernier hachage indique votre position actuelle (HEAD) et ne change rien.
la source
De toute évidence, quelqu'un doit soit écrire un livre intelligible sur git, soit git doit être mieux expliqué dans la documentation. Face à ce même problème j'ai deviné que
annulerait le dernier commit qui semble le faire.
Ian
la source
Vous pouvez le faire en 4 étapes:
Ce que vous devez saisir dans votre terminal :
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&&git commit -m 'reverting file'
git checkout .
bonne chance
la source
git-revert
ne fonctionne que sur l'ensemble du repo, donc pour compenser, nous devons annuler tout le reste.git revert --no-commit <commit_hash>
2.git reset HEAD
Cela enregistre un commit supplémentaire flottant et n'effectue toutes les modifications que dans votre répertoire de travail.git revert _oldcommit_ --no-commit
git reset -- _unchanged1_ _unchanged2_ ...
git commit -m "branch without changes to specific files"
le nouveau conseil de branche reflétait toutes les modifications, à l'exception des fichiers restaurés.Il s'agit d'une étape très simple. Extraire le fichier de l'ID de validation que nous voulons, ici un ID de validation avant, puis juste git commit modifier et nous avons terminé.
C'est très pratique. Si nous voulons apporter n'importe quel fichier à n'importe quel ID de validation précédent en haut de la validation, nous pouvons facilement le faire.
la source
Annulera un commit donné. Il semble que vous
git revert
n'affectiez que le commit le plus récent.Cela ne résout pas votre problème, si vous souhaitez annuler une modification dans un fichier spécifique et que la validation a changé plus que ce fichier.
la source
si vous validez un mauvais fichier lors de vos dernières validations, suivez les instructions:
la source