web-dev-qa-db-fra.com

Comment déplacer certains commits pour qu'ils soient basés sur une autre branche de git?

La situation:

  • le maître est à X
  • quickfix1 est à X + 2 commits

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?

351
Alex Yarmula

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 .

346
VonC

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.

146
DJ.

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
131
Christoph

Je crois que c'est:

git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2
25
Matthew Flaschen