Comment déplacer certains commits vers une autre branche de git?
la situation:
- master est à X
- quickfix1 est X + 2 s'engage
tels que:
o-o-X (master HEAD)
q1a--q1b (quickfix1 HEAD)
puis j'ai commencé à travailler sur quickfix2, mais par accident j'ai pris quickfix1 comme branche source pour copier, pas le master. Maintenant quickfix2 est X + 2 commet + 2 pertinents s'engage.
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 propagations qui appartiennent à quickfix1.
q2a'--q2b' (quickfix2 HEAD)
/
o-o-X (master HEAD)
q1a--q1b (quickfix1 HEAD)
j'ai essayé de créer un patch à partir d'une certaine révision dans quickfix2, mais le patch ne préserve pas l'historique de propagation. Y a-t-il un moyen de sauver Mon historique de propagation, mais d'avoir une branche sans modifications dans quickfix1?
5 réponses
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 aller 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)
il est préférable de le faire sur un arbre propre.
voir git config --global rebase.autostash true
, surtout après Git 2.10 .
vous pouvez utiliser git cherry-pick
pour simplement choisir la propagation que vous voulez copier.
probablement la meilleure façon est de créer la branche à partir de master, puis dans cette branche utiliser git cherry-pick
sur les 2 commits de quickfix2 que vous voulez.
la chose la plus simple que vous pouvez 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
la seule façon de travailler que j'ai trouvé:
git show>~/some_file.txt
git checkout master
git checkout -b new_branch
git apply -stat ~/some_file.txt
git apply -check ~/some_file.txt
git apply ~/some_file.txt
ensuite, vous devez recommencer les modifications, mais c'est beaucoup plus facile que de le faire manuellement...