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?

320
demandé sur Steve Eynon 2010-03-03 10:27:22

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 .

309
répondu VonC 2018-01-11 16:44:03

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.

127
répondu DJ. 2010-03-03 07:37:34

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
110
répondu Christoph 2012-08-15 06:38:44

je crois que c'est:

git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2
22
répondu Matthew Flaschen 2012-08-15 05:14:13

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...

-3
répondu Ziv Barber 2017-07-31 13:18:13