217 votes

Comment modifier les anciennes Git commit?

J'ai fait 3 git s'engage, mais n'ont pas été poussé. Comment puis-je modifier la plus ancienne (ddc6859af44) et (47175e84c) qui n'est pas la plus récente?

$git log
commit f4074f289b8a49250b15a4f25ca4b46017454781
Date:   Tue Jan 10 10:57:27 2012 -0800

commit ddc6859af448b8fd2e86dd0437c47b6014380a7f
Date:   Mon Jan 9 16:29:30 2012 -0800

commit 47175e84c2cb7e47520f7dde824718eae3624550
Date:   Mon Jan 9 13:13:22 2012 -0800

266voto

Adam Dymitruk Points 34999
git rebase -i HEAD^^^

Maintenant marquer ceux que vous souhaitez modifier à l' edit (remplacer les ramasser). Maintenant, enregistrer et quitter.

Maintenant, apportez vos modifications, puis

git add -A
git commit -C HEAD # reuse the existing commit's message. Omit this option if you want to change that too
git rebase --continue

167voto

akostadinov Points 3272

J'ai préparé mon commit que je voulais modifier avec une version plus ancienne et a été surpris de voir que rebase -i plaint de ce que j'ai modifications non validées. Mais je ne voulais pas faire mes changements de nouveau en spécifiant l'option d'édition de l'ancienne commettre. Donc la solution était assez simple et directe:

  1. préparez votre mise à jour pour les plus âgés s'engager, l'ajouter et de s'engager
  2. git rebase -i <commit you want to amend>^ - avis de l' ^ donc vous voyez que le dit s'engager dans l'éditeur de texte
  3. vous obtiendrez sometihng comme ceci:

    pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync
    pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies
    pick e23d23a fix indentation of jgroups.xml
    
  4. maintenant pour combiner e23d23a avec 8c83e24 vous pouvez changer de ligne de commande et l'utilisation de squash comme ceci:

    pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync    
    squash e23d23a fix indentation of jgroups.xml
    pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies
    
  5. écrire et fermez le fichier, vous serez présent avec un éditeur de fusionner les messages de validation. Faire et enregistrer/quitter le document texte

  6. Vous avez terminé, vos commits sont modifiés

le crédit va à: http://git-scm.com/book/en/Git-Tools-Rewriting-History Il y a aussi d'autres utiles démontré git de la magie.

17voto

Melebius Points 529

J'ai utilisé un autre moyen pour quelques temps. En fait, il s'agit d'un manuel git rebase -i et il est utile lorsque vous souhaitez réorganiser plusieurs s'engage notamment à l'écraser ou le fractionnement de certains d'entre eux. Le principal avantage est que vous n'avez pas à décider sur chaque livraison est destin au même moment. Vous aurez aussi tous Git fonctions disponibles pendant le processus, à la différence lors d'un rebase. Par exemple, vous pouvez afficher le journal de à la fois originale et réécrit l'histoire à tout moment.

Je vais consulter les commits de la manière suivante, de sorte qu'il est lisible facilement:

C # good commit after a bad one
B # bad commit
A # good commit before a bad one

Votre histoire dans le début ressemble à ceci:

x - A - B - C
|           |
|           master
|
origin/master

Nous allons recréer de cette façon:

x - A - B*- C'
|           |
|           master
|
origin/master

C'est la procédure:

git checkout B       # get working-tree to the state of commit B
git reset --soft A   # tell git that we are working before commit B
git branch rewrite-history        # create a branch for our alternative history
git checkout rewrite-history      # continue on our new branch

Maintenant améliorer votre ancien valider à l'aide de git add (git add -i, git stash etc.) maintenant. Vous pouvez même diviser votre ancien commit en deux ou plus.

git commit           # recreate commit B (result = B*)
git cherry-pick C    # copy C to our new branch (result = C')

Résultat intermédiaire:

x - A - B - C 
|    \      |
|     \     master
|      \
|       B*- C'
|           |
|           rewrite-history
|
origin/master

Finissons-en:

git checkout master
git reset --hard rewrite-history  # make this branch master

Ça y est, vous avez peut - push vos progrès maintenant.

16voto

Benjamin Bannier Points 11953

Vous pourriez peut utiliser git rebase de réécrire la validation de l'histoire. Cela peut être potentiellement destructrice pour vos changements, donc à utiliser avec précaution.

D'abord de valider votre "modifier" changement comme un fait normal de s'engager. Ensuite faire un rebase interactif de départ sur le parent de votre ancien commit

git rebase -i 47175e84c2cb7e47520f7dde824718eae3624550^

Cela va ouvrir votre éditeur de texte avec tous les commits. Les réorganiser afin que votre "modifier" s'engager vient en dessous de celle que vous voulez modifier. Puis remplacer le premier mot de la ligne avec le "modifier" s'engager avec s qui se combiner (s annuler) avec la validation avant. Enregistrez et quittez votre éditeur de texte et suivez les instructions.

11voto

Avi Points 14468

Vous pouvez utiliser git rebase --interactive, à l'aide de l' edit commande sur le commit que vous voulez modifier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X