La situation:
Tel que:
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
Ensuite, j'ai commencé à travailler sur quickfix2, mais par accident, j'ai pris quickfix1 comme branche source à copier, pas le maître. Maintenant, quickfix2 est à X + 2 commits + 2 commits pertinents.
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
\
q2a--q2b (quickfix2 HEAD)
Maintenant, je veux avoir une branche avec quickfix2, mais sans les 2 commits qui appartiennent à quickfix1.
q2a'--q2b' (quickfix2 HEAD)
/
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
J'ai essayé de créer un correctif à partir d'une certaine révision dans quickfix2, mais le correctif ne préserve pas l'historique de validation. Y at-il un moyen de sauvegarder mon historique de commit, mais avoir une branche sans modifications dans quickfix1?
C'est un cas classique de rebase --onto
:
_ # let's go to current master (X, where quickfix2 should begin)
git checkout master
# replay every commit *after* quickfix1 up to quickfix2 HEAD.
git rebase --onto master quickfix1 quickfix2
_
Donc, vous devriez partir de
_o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
\
q2a--q2b (quickfix2 HEAD)
_
à:
_ q2a'--q2b' (new quickfix2 HEAD)
/
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
_
Ceci est mieux fait sur un arbre de travail propre.
Voir _git config --global rebase.autostash true
_ , en particulier après Git 2.1 .
Vous pouvez utiliser git cherry-pick
pour simplement choisir le commit que vous voulez copier.
Le meilleur moyen est probablement de créer la branche hors du maître, puis dans cette branche-là, utilisez git cherry-pick
sur les 2 commits de quickfix2 souhaités.
La chose la plus simple que vous puissiez faire est de choisir une gamme. Il fait la même chose que le rebase --onto
mais est plus facile pour les yeux :)
git cherry-pick quickfix1..quickfix2
Je crois que c'est:
git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2