2008-11-02 6 views
3

La raison pour laquelle je pose cette question est que j'avais accidentellement fait un git commit -a qui comprenait un fichier que je ne voulais pas encore valider. Ma solution était de faire ce qui suit:Existe-t-il un moyen d'ajouter une version spécifique d'un fichier à l'index git?

git reset --soft HEAD^ 
git reset -- file/with/changes_not_to_committed 
git commit -C [email protected]{1} 

Ici, j'ai rembobiné la branche par un commit tout en gardant l'index et l'arbre de travail, puis tiré file/with/changes_not_to_committed d'une révision encore plus dans l'index, puis je me suis engagé l'index utilisant le message de validation de la validation de la branche précédente. Aucune invocation git-reset ne touche la copie de travail, donc mes modifications à file/with/changes_not_to_committed persistent, mais ne sont plus enregistrées dans la révision HEAD.

Cependant, il aurait été plus facile si je pouvais tirer file/with/changes_not_to_committed de la révision HEAD^ droite dans l'index sans toucher la copie de travail. Étant donné que l'indice correspond par ailleurs déjà l'état où je veux, je pourrais alors modifier juste le HEAD commettras, produisant une séquence comme ceci:

git magic-pony HEAD^ file/with/changes_not_to_committed 
git commit --amend -C HEAD 

C'est presque ce que je recevrais en remplaçant git-magic-pony avec git-checkout, sauf l'exigence que la copie de travail soit laissée intacte et que seul l'index soit mis à jour. Il semble qu'il n'y a aucun moyen de faire git-checkout ne pas toucher les deux.

Ma question est: existe-t-il git-magic-pony, et si oui, sous quel nom?

Répondre

4

droit. Lorsque vous voulez déplacer des révisions de HEAD ou une autre révision de l'index, vous utilisez 'git reset REVISION - fichier' - alors, vous utiliseriez 'git commit --amend' pour réviser le commit. En ce moment, je travaille actuellement sur une révision visant à rendre plus évident le fait que les fichiers peuvent être déplacés de A à B comme ça.

Bien sûr, un moyen beaucoup plus simple est d'augmenter 'git-gui', cliquez sur le bouton 'modifier la dernière validation', puis cliquez sur l'icône par le fichier dans la section commit inventory du gui, puis 'commit '.

+0

Merci! C'est exactement ce que je cherchais. Je suis en désaccord sur l'interface graphique étant plus facile, cependant. :-) Plus découvrable, peut-être. –

2

Il semble que vous pouvez faire quelque chose comme ceci en utilisant git update-index:

git update-index --cacheinfo 100644 5be7e154c284fb8de8ddca0bb18b72a73089df9b filename 

Vous aurez besoin d'obtenir le mode (100644 ci-dessus) et SHA1 du fichier que vous voulez revenir (vous pouvez obtenir ce info tous de git ls-tree). Ensuite, vous pouvez git commit --amend et votre copie de travail ne sera pas affectée.

2

donc basée sur la réponse de Greg Hewgill, git-magic-pony est un script shell j'écrirais qui ressemble à ceci:

#!/bin/sh git ls-tree "[email protected]" | while read mode type hash path ; do git update-index --cacheinfo $mode $hash "$path" done
Questions connexes