2009-05-23 6 views
59

J'ai récemment validé un fichier dans le HEAD de ma branche qui contient des erreurs. Je dois faire les choses suivantes:Git: extraire un fichier d'un commit précédent et le modifier en HEAD

  • obtenir ce fichier d'un commit précédent à la tête

  • Commit que fichier dans HEAD

Quelle est la meilleure façon d'aller à ce sujet?

+1

Le plus simple serait de copier le déposer le contenu de ce commit particulier en utilisant un client ui (ou de github bitbucket etc) et collez-le dans votre fichier actuel et validez :) Plus facile que d'écrire le hash et le chemin – nawfal

Répondre

91

Vous ai pratiquement dit vous-même:

d'abord récupérer le fichier d'un avant commettras:

$> git checkout HEAD~1 path/to/file.ext 

commettras Ensuite, il:

$> git commit -a -m 'Retrieved file from older revision' 

Si seulement les modifications apportées à ce fichier où présent dans le dernier commit, vous pouvez même utiliser git-revert:

$> git revert HEAD 

Je pense qu'il serait préférable de faire un commit séparé, car il vous dit exactement ce que vous avez inversé, et pourquoi. Cependant, vous pouvez l'écraser dans le commit précédent en utilisant le --amend pour passer au git-commit.

+0

--amend serait un switch pour git commit, pas git add – bdonlan

+0

Oups, vous avez raison. Fixé. – sykora

+0

git-revert * ferait * un commit séparé (ce n'était pas tout à fait clair d'après votre description). Utiliser "git commit --amend" corrigerait le dernier commit, au lieu de créer un nouveau (mais vous ne pouvez pas le faire si vous avez publié cette partie de l'historique) –

0

Attention, dans ce scénario:

Commit hash - File modified 
aaaaaaa  index.php 
bbbbbbb  test.php 
ccccccc  index.php 

git checkout HEAD ~ 1 (ou HEAD ^) essayer index.php à la caisse le fichier index.php à hachage précédente HEAD (bbbbbbb), mais ce n'est pas le vrai fichier de hachage de commit précédent, est ccccccc. Dans le précédent hachage HEAD, index.php reste toujours inchangé car la dernière modification a été faite dans le hachage ccccccc.

Pour rétablir un certain fichier précédent commettre hachage qui a affecté le fichier, utilisez:

git log -n 2 --pretty=format:%h path/to/file.ext 

Ignorer premier hachage et prendre la deuxième hachage, puis:

git checkout <second_hash> path/to/file.ext 
git commit -m 'Revert this file to real previous commit' 
Questions connexes