git: Verlauf umschreiben: Commits neu anordnen und zusammenführen

Lesezeit: 2 Minuten

Benutzer-Avatar
Albert

Momentane Situation:

origin/mybranch --- A1 --- B1 --- A2 --- B2 --- A3 --- B3   mybranch

Ich möchte diesen Verlauf bereinigen (A1 bis B3), insb. da ich es noch nirgendwo gepusht habe und weil ich einen Patch vorbereiten möchte der genau diese B*.

Was ich will ist:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3   mybranch

Ich werde das wahrscheinlich überhaupt nicht pushen (oder wenn ich will, nur das summierte B*, ich muss die A*-Commits überhaupt entfernen) und während ich weiter daran arbeite, bekomme ich möglicherweise zusätzliche solche Commits, z. B. so:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3 --- A4 --- B4   mybranch

Und das will ich dann nochmal so umschreiben wie oben.

Ich möchte nicht nur irgendeine Methode kennen, um dies zu tun (weil ich in der Lage wäre, etw auf etwas hackige Weise zu bekommen), ich bin esp. frage hier nach dem richtigen/besten/saubersten/einfachsten Weg, dies zu tun.


Was ich tue, insb. ist: Ich arbeite am offiziellen Zweig xorg-xserver-1.7 und möchte einen Patch (B*) vorbereiten. Da ich in der Lage sein möchte, meinen selbst kompilierten Xserver zu einfachen Testzwecken durch den Systemserver zu ersetzen, habe ich eine Reihe von Debian/Ubuntu-Patches (A*) angewendet. Wenn ich diesen Patch jedoch irgendwo poste, möchte ich diese ausschließen.

  • Diese Referenz aus dem Git-Pro-Buch ist hilfreich (Umschreiben der Git-Historie). git-scm.com/book/ch6-4.html

    – Rimian

    31. Oktober 2012 um 2:48 Uhr


Benutzer-Avatar
Nein

Du willst eine machen interaktive Rebase.

Das erste, was ich gerne mache, wenn ich Git-Befehle ausprobiere, ist, eine Sicherungskopie meines Zweigs zu erstellen:

$ git branch my-backup-branch

Nehmen wir an, Ihr A1-Commit hat einen Hash von 152274b. Versuche dies:

$ git rebase -i 152274b^

Dieser Befehl wird Ihren Editor (normalerweise vim) mit etwas wie dem folgenden aufrufen:

pick 152274b A1
pick 14b0838 B1
pick 661b993 A2
pick a6510db B2
pick 557e171 A3
pick 85da0e4 B3

# Rebase 39a47e4..85da0e4 onto 39a47e4
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Von hier aus können Sie die Reihenfolge der Commits ändern, sie vollständig löschen und sogar quetschen. In diesem Beispiel möchten Sie wahrscheinlich wie folgt verschieben und squashen:

pick 152274b A1
squash 661b993 A2
squash 557e171 A3
pick 14b0838 B1
squash a6510db B2
squash 85da0e4 B3

Versuche es. Wenn Sie in einem Zustand landen, den Sie nicht wollten, können Sie jederzeit zu dem Zustand zurückkehren, den Sie in Ihrem Sicherungszweig gespeichert haben:

$ git reset --hard my-backup-branch

  • Wow, das war einfach! 🙂 So natürlich, elegant und perfekt.

    – Albert

    2. September 2010 um 12:17 Uhr

1187230cookie-checkgit: Verlauf umschreiben: Commits neu anordnen und zusammenführen

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

Privacy policy