it-swarm.com.de

Wie kann man bestimmte Commits so verschieben, dass sie auf einem anderen Zweig in Git basieren?

Die Situation:

  • meister ist bei X
  • quickfix1 ist bei X + 2 Commits

So dass:

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)

Dann habe ich angefangen, an Quickfix2 zu arbeiten, habe aber aus Versehen Quickfix1 als zu kopierenden Quellzweig genommen, nicht den Master. Jetzt ist quickfix2 bei X + 2 Commits + 2 relevanten Commits.

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

Jetzt möchte ich einen Zweig mit quickfix2 haben, aber ohne die 2 Commits, die zu quickfix1 gehören.

      q2a'--q2b' (quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

Ich habe versucht, einen Patch aus einer bestimmten Revision in quickfix2 zu erstellen, aber der Patch speichert den Commit-Verlauf nicht. Gibt es eine Möglichkeit, meinen Festschreibungsverlauf zu speichern, aber einen Zweig ohne Änderungen in quickfix1 zu haben?

351
Alex Yarmula

Dies ist ein klassischer Fall von 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 

Also solltest du gehen

o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

zu:

      q2a'--q2b' (new quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

Dies geschieht am besten auf einem sauberen Arbeitsbaum.
Sehen git config --global rebase.autostash true , insbesondere nach Git 2.1 .

346
VonC

Mit git cherry-pick Können Sie einfach das Commit auswählen, über das Sie kopieren möchten.

Wahrscheinlich ist der beste Weg, den Zweig aus dem Master heraus zu erstellen. Verwenden Sie dann in diesem Zweig git cherry-pick Für die 2 Commits von quickfix2, die Sie möchten.

146
DJ.

Das Einfachste, was Sie tun können, ist, eine Reihe von Kirschen zu pflücken. Es macht das gleiche wie das rebase --onto ist aber leichter für die augen :)

git cherry-pick quickfix1..quickfix2
131
Christoph

Ich glaube es ist:

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