web-dev-qa-db-de.com

So verschieben Sie git-Commits vom Master in einen anderen vorhandenen Zweig

Ich habe ein paar Commits in master eingecheckt, die in develop eingecheckt werden sollten. Welche git-Befehle habe ich verwendet, um diese Commits aus dem Master-Zweig zu entfernen und in den Entwicklungszweig aufzunehmen?

22
gitq

Wenn ich mich nicht irre, hatten Sie zwei synchronisierte Zweige, master und dev, und haben einfach vergessen, den Zweig Vor Ihren Commits zu wechseln.

Wenn dies der Fall ist, haben wir:

----------------
git log in dev

xxx
yyy
...
----------------

und:

----------------
git log in master

ccc
bbb
aaa
        <---- here you forgot to switch branch
xxx
yyy
...
----------------

Die Lösung ist:

Stellen Sie zunächst sicher, dass:

git status -s

gibt leere Ergebnisse zurück.

Als nächstes erhalten Sie alle Ihre neuen Commits von master bis dev mit:

git checkout dev
git merge master

Kehre nun zu dir zurück master:

git checkout master

Entfernen Sie unnötige Commits:

git reset --hard HEAD~3

Die Anzahl ~3 ist die Anzahl der Commits, die Sie entfernen möchten.

Denken Sie daran: git status -s muss leere Ergebnisse zurückgeben . Andernfalls kann git reset --hard Datenverlust verursachen.

37

Für das Ablegen in einen anderen Zweig können Sie die Kirschpickerei verwenden

git cherry-pick <commit>

Löschen ist nicht so einfach. Sie können Rebase und Squash verwenden oder den Commit bearbeiten:

git rebase -i <commit>~1

Ich bin mir jedoch nicht sicher, ob Sie während der Neugestaltung die Option "Bearbeiten" wählen, ob Sie die Dateien statt der Commit-Nachricht auch bearbeiten können.

7
Jens Peters

Sie können cherry-pick Ihr Commit für die develop und anschließend interaktiv rebase Ihre master-Verzweigung übernehmen:

  1. git checkout develop
  2. git cherry-pick aabbcc
  3. git cherry-pick ddeeff
  4. ....
  5. git checkout master
  6. git rebase 123456 -i

dabei ist 123456 ein Commit, bevor Sie einen Fehler gemacht haben. Dadurch wird ein Editor geöffnet, in dem jedes Commit angezeigt wird, das von der Rebase betroffen ist. Löschen Sie die Zeilen, die den Commits entsprechen, die Sie verwerfen möchten, und beenden Sie den Editor.

6
Nils Werner

Es gibt in der Regel mehrere Möglichkeiten, dasselbe auf eine mögliche Weise zu tun:

git checkout develop
git cherry-pick XXX // XXX being the sha1 of the commit you want to grab
git checkout master
git rebase --interactive HEAD~IDX // IDX being the position of the last "good" commit compared to HEAD

Der letzte Befehl zeigt alle Überprüfungen von HEAD bis zum letzten guten Commit an. Alles, was Sie tun müssen, ist die Zeile des Commits zu löschen, das in den Zweig verzweigt wird

0
bvidal