Lors du codage, j'ai ajouté des instructions d'impression dans certains fichiers pour garder une trace de ce qui se passait.
Lorsque j'ai terminé, est-il possible d'annuler les modifications apportées à certains fichiers, mais de valider le fichier sur lequel j'ai réellement travaillé?
Supposons que j'ai ajouté print dans le fichier A
, mais que j'ai modifié le fichier B
. B
est ce que je veux valider et A
, je veux revenir à son ancien état.
Il existe trois méthodes de base pour ce faire, en fonction de ce que vous avez fait avec les modifications apportées au fichier A. Si vous n'avez pas encore ajouté les modifications à l'index ou ne les avez pas validées, vous souhaitez simplement utiliser la commande de contrôle - cela modifiera l'état de la copie de travail correspondant au référentiel:
git checkout A
Si vous l'avez déjà ajouté à l'index, utilisez reset:
git reset A
Si vous l'avez commis, vous utilisez la commande revert:
# the -n means, do not commit the revert yet
git revert -n <sha1>
# now make sure we are just going to commit the revert to A
git reset B
git commit
Si, par contre, vous l'avez commis, mais que le commit a impliqué un grand nombre de fichiers que vous ne souhaitez pas également restaurer, la méthode ci-dessus peut impliquer beaucoup de commandes "reset B". Dans ce cas, vous voudrez peut-être utiliser cette méthode:
# revert, but do not commit yet
git revert -n <sha1>
# clean all the changes from the index
git reset
# now just add A
git add A
git commit
Une autre méthode nécessite à nouveau l’utilisation de la commande rebase -i. Celui-ci peut être utile si vous avez plus d'un commit à éditer:
# use rebase -i to cherry pick the commit you want to edit
# specify the sha1 of the commit before the one you want to edit
# you get an editor with a file and a bunch of lines starting with "pick"
# change the one(s) you want to edit to "edit" and then save the file
git rebase -i <sha1>
# now you enter a loop, for each commit you set as "edit", you get to basically redo that commit from scratch
# assume we just picked the one commit with the erroneous A commit
git reset A
git commit --amend
# go back to the start of the loop
git rebase --continue
Source: http://git-scm.com/book/en/Git-Basics-Undoing-Things
git checkout - modifiedfile.Java
1) statut de $ git
vous verrez le fichier modifié
2) $ git checkout - modifiedfile.Java
3) statut de $ git
git add B # Add it to the index
git reset A # Remove it from the index
git commit # Commit the index
man git-checkout : git checkout A
Oui;
git commit FILE
va commettre juste FILE. Ensuite, vous pouvez utiliser
git reset --hard
pour annuler les modifications locales dans d’autres fichiers.
Il y a peut-être d'autres moyens que je ne connais pas….
edit: ou, comme NicDumZ l'a dit, git-checkout ne contient que les fichiers sur lesquels vous souhaitez annuler les modifications (la meilleure solution dépend du nombre de fichiers à valider ou du nombre de fichiers à annuler :-)
Pourquoi ne pouvez-vous pas simplement marquer les modifications que vous souhaitez apporter à une validation en utilisant " git add <fichier> " ( ou même "git add --interactive", ou "git gui" qui a l'option de la validation interactive), puis utiliser "git commit" au lieu de "git commit -a"?
Dans votre situation (pour votre exemple), ce serait:
Prompt> git add B
Prompt> git commit
Seules les modifications apportées au fichier B seraient validées et le fichier A resterait "sale", c'est-à-dire avec ces instructions d'impression dans la version de la zone de travail. Lorsque vous souhaitez supprimer ces instructions d'impression, il serait suffisant d'utiliser
Prompt> git reset A
ou
Prompt> git checkout HEAD -- A
pour revenir à la version validée (version de HEAD, c.-à-d. version "git show HEAD: A").