2009-08-29 7 views
1

J'ai fait 3 'git commit' mais je n'ai pas fait de 'git push'.comment annuler les modifications d'un fichier dans un commit précédent dans git

1. commit 1 
2. commit 2 
    touches fileA 
    touches fileB 
    touches fileC 
3. commit 3 

Alors, comment puis-je

  1. annuler les modifications que j'ai fait dans le fichier b pour engager 2? (Je ne peux plus faire un 'git checkout - fileB' depuis que j'ai déjà 'git commit', comment puis-je annuler mes changements?
  2. faire des changements dans le fichier C et le faire comme une partie du commit 2? peut aller modifier le fichier maintenant et puis exécutez un git rebase -i HEAD ~ 2 'correct

Répondre

2

Utilisez git rebase -i HEAD~2 et modifier le second commit

5

Cela devrait fonctionner:.

1. git rebase -i HEAD~2 
2. in your editor, select the following: 

edit 9b86592 commit 2 
pick f3907cb commit 3 

3. at this point roll back the changes you made in fileB, for example with 
    `git checkout <version_you_want>` or by manually editing the file 
4. make the changes in fileC you want to be part of commit 2 
5. `git add fileB fileC` 
6. `git commit --amend` 
7. `git rebase --continue` 

Vous devrez peut-être résoudre les problèmes de fusion s'il y a des conflits lorsque git essaie de appliquer la validation 3. Après avoir résolu ceux-ci, exécutez à nouveau git rebase --continue.

0

En supposant que vous êtes sur le maître de branche et un arbre propre:

# checkout incorrect commit 
git checkout <sha1_of_commit2> 

# revert the changes to fileB by checking out the parent version 
git checkout HEAD^ -- fileB 

# make an amended commit 
git commit --amend 

# go back to master 
git checkout master 

# transplant the changes since the bad commit onto the amended commit 
git rebase --onto [email protected]{1} <sha1_of_commit2> 
+0

'rebase -i' est plus facile, IMO. – u0b34a0f6ae

+0

@ kaizer.se: Certaines personnes trouvent ça plus facile, personnellement, je trouve qu'il faut plus de temps pour expliquer comment décrire la commande 'rebase -i' et comment éditer la liste interactive de commit rebase en plus des autres étapes importantes. Décrire comment faire les choses «manuellement» est plus simple. La plupart des réponses suggérant 'rebase -i' ont soit plus d'étapes que ma recette, soit des étapes plus complexes ou des étapes plus implicites qui ne sont pas explicitement décrites. –

0

Voici comment je le ferais.

Commander l'ancienne version de fileB et commettre

git checkout HEAD~3 -- fileB 
git commit -m"fix fileB" fileB 

Maintenant rebasage de squash dans votre solution avec l'ancien engagement

git rebase -i HEAD~3 

maintenant passer votre dernier Commit "fixer fileB" être après commit 2, et changez l'instruction "pick" en "squash", en rejoignant le commit changeant le fichier B avec le commit en le réinitialisant.

Questions connexes