Wie soll ich Änderungen von einem Commit zu einem anderen verschieben?

Lesezeit: 5 Minuten

Ich habe zwei Commits auf demselben Zweig, einen direkt nach dem anderen. Ich habe Änderungen an Datei A zum ersten Commit hinzugefügt, und dann habe ich einige Änderungen an anderen Dateien vorgenommen und dann einen weiteren Commit durchgeführt. Jetzt möchte ich, dass die Änderungen an Datei A beim zweiten Commit und nicht beim ersten erfolgen. Was ist der eleganteste Weg?

  • Sie können git rebase überprüfen hier

    – rumman0786

    21. April 2017 um 16:15 Uhr


  • Diese Frage ist ein Sonderfall von „Squash my last X Commits together using Git“ stackoverflow.com/questions/5189560/…

    – Andreas Palmer

    24. Mai 2017 um 20:41 Uhr

Ich habe ein Skript geschrieben, um diesen Zweck zu erfüllen. Sie können es auschecken hier.

Mit dem Skript wäre es so einfach wie:

mv-changes HEAD~ HEAD fileA

  • Klappt wunderbar

    – Ishan Srivastava

    11. Juli 2018 um 20:06 Uhr

  • Ausgezeichnet, danke Herr. Ich frage mich, ob so etwas möglich sein könnte git merge --patch Dadurch können Sie Änderungen Stück für Stück auswählen und diese Stücke sogar aufteilen.

    – Myridium

    25. August 2020 um 4:50 Uhr

  • Gute Lösung. Für meinen eigenen Gebrauch habe ich jedoch ersetzt git reset -q ... mit git reset -qp ..., sodass ich Änderungen und nicht nur vollständige Dateien verschieben kann. Danke, @Mikhail Golubtsov.

    – Vedran Šego

    31. August 2021 um 19:31 Uhr

  • Magie! Danke mein Herr!

    – Albeksdurf

    3. Februar um 15:22 Uhr

Ich weiß, dass dies eine alte Frage ist, aber ich hatte genau dieselbe Anfrage und habe gerade herausgefunden, wie dieses Problem am besten gelöst werden kann: Sie müssen eine interaktive Rebase verwenden und „Bearbeiten“ für die beiden Commits wählen, von denen Sie eine Änderung verschieben möchten, und zu.

Angenommen, Sie haben 3 Commits:

$ git log -3 --oneline
97e9d62 Commit C, editing file2.txt
34b066b Commit B, creating file2.txt + editing file1.txt
73ff1bb Commit A, creating file1.txt

Wenn Sie nun möchten, dass Commit B nur die Erstellung von file2.txt enthält, aber nicht die Ausgabe von file1.txt, die in Commit C enthalten sein sollte, git rebase -i wird dies anzeigen:

pick 73ff1bb Commit A, creating file1.txt
pick 34b066b Commit B, creating file2.txt + editing file1.txt
pick 97e9d62 Commit C, editing file2.txt

# ...

Wenn ich „pick“ durch „edit“ oder „e“ für Commit B und Commit C ersetze und meinen Editor schließe, stoppt git beim zweiten Commit und lässt mich meine Änderungen ändern:

pick 73ff1bb Commit A, creating file1.txt
edit 34b066b Commit B, creating file2.txt + editing file1.txt
edit 97e9d62 Commit C, editing file2.txt
Stopped at 34b066b... Commit B, creating file2.txt + editing file1.txt
You can amend the commit now, with

    git commit --amend

Once you are satisfied with your changes, run

    git rebase --continue

$ vi file1.txt    # edit of file1.txt to remove the updated line
$ git commit --amend file1.txt
$ git rebase --continue

# -- git continues rebasing and stops on the Commit C to edit it

$ vi file1.txt   # edit of file1.txt to put the removed line
$ git commit --amend file1.txt
$ git rebase --continue

Und das ist es.

Achten Sie darauf, die Zeile(n), die Sie aus dem ersten Commit entfernen, irgendwo zu speichern, um sie in den zweiten einzufügen. Es kann sich in der Zwischenablage, einer Textdatei usw. befinden. Ich denke, es sollte möglich sein, sich darauf zu verlassen git stash auch, aber wenn es sich um eine einfache Änderung handelt, ist es einfacher, sie in der Zwischenablage zu behalten.

  • Wenn die Änderung größer als nur ein oder zwei Zeilen ist, kann es nützlich sein, (im Bearbeitungsmodus des ersten Commit) git reset HEAD~1 -p um die erforderlichen Änderungen in die Bereitstellung zu verschieben. Dem könnte dann gefolgt werden git commit --amend --no-edit Dies würde die Änderung von Commit B rückgängig machen. Es würde Sie mit nicht bereitgestellten Änderungen zurücklassen, die jetzt gespeichert und angewendet werden können, während Sie Commit C bearbeiten.

    – sloneorzeszki

    1. April 2021 um 7:22 Uhr


  • Ausgezeichnete Antwort! genau das, wonach ich gesucht habe. In den meisten Fällen müssen Sie nicht zu viele Commits rebasen, bevor Sie HEAD verwenden git rebase -i HEAD~n n Dabei handelt es sich um die Anzahl der vorherigen zu übernehmenden Commits

    – Gjaa

    12. Mai um 23:44 Uhr


Wenn es sich um kleine Commits handelt und Commits in Git immer klein sein sollten, ist dies der einfachste Weg git reset HEAD^^ und dann mach sie einfach nochmal. Beachten Sie, dass jede Lösung dafür das Umschreiben des Verlaufs beinhaltet, und wenn Sie diese Commits bereits irgendwohin verschoben haben, sollten Sie dies nicht tun, es sei denn, Sie wissen, was Sie tun.

  • Wenn Sie wissen, was Sie tun, dann drücken Sie Änderungen mit -f Möglichkeit: git push -f origin HEAD

    – cpinamtz

    14. April 2020 um 7:30 Uhr

Eine weitere Lösung für dieses Problem

  • Suchen Sie den Commit direkt vor den beiden Commits (wahrscheinlich ist dies der Master-Branch)
  • Laufen git rebase -i <commit before commits to be reordered> (git rebase -i master in den meisten Fällen)
  • Vertauschen Sie im Texteditor die Reihenfolge der Commits (verwenden Sie für vim die sequence ddp während auf der Linie, die sich nach unten bewegen sollte)
  • Speichern, beenden und git rebase den Rest erledigen lassen

In dem wahrscheinlich unwahrscheinlichen Fall, dass Sie gerade diese Commits erstellt haben, machen Sie den zweiten Commit mit rückgängig git reset HEAD^ und füge die Änderungen dann mit dem ersten Commit hinzu git commit --amend.

In dem wahrscheinlicheren Fall, dass Sie weitergezogen sind und die Commits irgendwann in der Vergangenheit lagen, ist ein Rebasing Ihre beste Option. Ohne Ihre genaue Situation zu kennen, ist es wahrscheinlich am besten, eine Referenz zu zitieren, die sie gut erklärt.

Sowohl beim ersten als auch beim zweiten Ereignis erklärt der Abschnitt des Pro Git-Buchs über das Umschreiben der Historie die Optionen gut – sowohl wann sie verwendet werden sollten als auch wann Vorsicht geboten ist.

6.4 Git-Tools – Historie umschreiben

1245830cookie-checkWie soll ich Änderungen von einem Commit zu einem anderen verschieben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy