2010-09-02 7 views
25

Situation actuelle:git: réécrire l'histoire: réordonner et fusion engage

origin/mybranch --- A1 --- B1 --- A2 --- B2 --- A3 --- B3 mybranch 

Je veux nettoyer cette histoire jusqu'à (A1 à B3), esp. puisque je ne l'ai pas encore poussé et parce que je veux préparer un patch qui ne fait que B *.

Ce que je veux:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3 mybranch 

Je probablement ne pousserai pas du tout (ou si je vais, seul le résumé B *, je dois retirer le A * engage tout) et alors que je suis travailler plus loin, je pourrais obtenir ces commits complémentaires, à savoir comme ceci:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3 --- A4 --- B4 mybranch 

Et je veux réécrire à nouveau comme cela puis ci-dessus.

Je ne veux pas juste savoir n'importe quelle méthode pour faire ceci (parce que je serais capable d'obtenir sth comme dans une manière quelque peu hacky), je suis esp. demander ici la bonne/meilleure/la plus propre/la façon la plus facile de le faire.


Ce que je fais esp. est: Je travaille sur la branche officielle xorg-xserver-1.7 et je veux préparer un patch (B *). Parce que je veux être capable de remplacer mon serveur x auto-compilé par celui du système à des fins de test simples, j'ai appliqué un tas de correctifs Debian/Ubuntu (A *). Cependant, quand je vais poster ce patch quelque part, je veux exclure ceux-ci.

+1

Cette référence du git livre pro sera utile (réécriture historique git) . http://git-scm.com/book/ch6-4.html – Rimian

Répondre

30

Vous voulez faire un interactive rebase.

La première chose que je veux faire en essayant des commandes git est de faire une copie de sauvegarde de ma branche:

$ git branch my-backup-branch 

Disons que votre A1 a commettre un hachage de 152274b. Essayez ceci:

$ git rebase -i 152274b^ 

Cette commande apportera votre éditeur (généralement vim) avec quelque chose comme ceci:

pick 152274b A1 
pick 14b0838 B1 
pick 661b993 A2 
pick a6510db B2 
pick 557e171 A3 
pick 85da0e4 B3 

# Rebase 39a47e4..85da0e4 onto 39a47e4 
# 
# Commands: 
# p, pick = use commit 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 

De là, vous pouvez modifier l'ordre des commits, les supprimer complètement et même le squash leur. Dans cet exemple, vous voulez probablement déplacer et de squash comme ceci:

pick 152274b A1 
squash 661b993 A2 
squash 557e171 A3 
pick 14b0838 B1 
squash a6510db B2 
squash 85da0e4 B3 

Donnez-lui un essai. Si vous vous retrouvez dans un état que vous ne vouliez pas, vous pouvez toujours revenir à l'état que vous avez enregistré dans votre branche sauvegarde:

$ git reset --hard my-backup-branch 
+2

Wow, c'était facile! :) Si naturel, élégant et parfait. – Albert