439 Stimmen

Wie verschiebt man bestimmte Commits auf einen anderen Branch in Git?

Die Situation:

  • Master ist bei X
  • quickfix1 ist bei X + 2 Übertragungen

Genau das:

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

Dann begann ich mit der Arbeit an quickfix2, nahm aber versehentlich quickfix1 als Quellzweig zum Kopieren, 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 behält die Commit-Historie nicht bei. Gibt es eine Möglichkeit, meinen Commit-Verlauf zu speichern, aber einen Zweig ohne Änderungen in quickfix1 zu haben?

413voto

VonC Punkte 1117238

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 

Sie sollten also von

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 an einem sauberen Arbeitsbaum.
Voir git config --global rebase.autostash true insbesondere nach Git 2.10 .

178voto

DJ. Punkte 6396

Sie können verwenden git cherry-pick können Sie einfach die Übergabe auswählen, die Sie kopieren möchten.

Wahrscheinlich ist es am besten, den Zweig aus dem Master zu erstellen und dann in diesem Zweig die git cherry-pick für die 2 gewünschten Übertragungen von quickfix2.

169voto

Christoph Punkte 23599

Das Einfachste, was Sie tun können, ist, eine Auswahl zu treffen. Sie tut dasselbe wie die rebase --onto sondern ist einfacher für die Augen :)

git cherry-pick quickfix1..quickfix2

35voto

Matthew Flaschen Punkte 266507

Ich glaube, das ist es:

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

-2voto

Gopher Punkte 1
// on your branch that holds the commit you want to pass
$ git log
// copy the commit hash found
$ git checkout [branch that will copy the commit]
$ git reset --hard [hash of the commit you want to copy from the other branch]
// remove the [brackets]

Weitere nützliche Befehle hier mit Erklärung: Git-Anleitung

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X