Git Commits mit rebase zusammenführen

Aus Thomas-Krenn-Wiki
Wechseln zu: Navigation, Suche

Der Befehl "git rebase" bietet nützliche Funktionen für die Zusammenführung von mehreren Commits.[1] Dadurch kann z.B. die Arbeit an einem entwickelten Feature, dass in mehreren Commits resultierte, zusammengefasst werden.

Im folgenden Beispiel werden die letzten 3 Commits zu einem großen mittels rebase zusammengeführt. Zuerst eine Ausgabe des aktuellen Logs:

:~/repos/dev-1$ git log
commit cd490b9cda416a4b93b4a6bf4ac2c0ddb6740cc5
Author: Test User <tktest@example.com>
Date:   Tue Feb 7 07:15:19 2012 +0100

    version 1.2

commit c55afd6e9a779e505efd33f112d5206afc94474a
Author: Test User <tktest@example.com>
Date:   Mon Feb 6 16:14:45 2012 +0100

    version 1.1 in function

commit 55e54e40bf441252c11377f1901ac0e3856b22ba
Author: Test User <tktest@example.com>
Date:   Wed Jan 25 11:15:30 2012 +0100

    mod func 1

Diese 3 Commits werden nun in einen einzigen abgeändert. Achtung: Aktionen dieser Art dürfen nur für lokale Commits durchgeführt werden, die noch nicht in ein Repo gepusht wurden, mit dem auch andere arbeiten. Ansonsten werden unter Umständen Commits verworfen, die als Basis für die Arbeit anderer dienen. Es werden nun die letzten 3 Commits, ausgehen von HEAD, mit rebase bearbeitet:

:~/repos/dev-1$ git rebase -i HEAD~3
pick 55e54e4 mod func 1
pick c55afd6 version 1.1 in function
pick cd490b9 version 1.2

# Rebase 511cbea..cd490b9 onto 511cbea
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.

Wie die obigen Kommentare zeigen, bestehen mehrere Möglichkeiten für die Bearbeitung. In diesem Beispiel wird die Option "squash" verwendet, um Commits mit dem vorhergehenden zusammenzuführen:[2]

pick 55e54e4 mod func 1
squash c55afd6 version 1.1 in function
squash cd490b9 version 1.2

Diese Datei wird nun gespeichert und der Editor schließt sich. Anschließend werden die Commit-Messages bearbeitet:

# This is a combination of 3 commits.
# The first commit's message is:
mod func 1

# This is the 2nd commit message:

version 1.1 in function

# This is the 3rd commit message:

version 1.2

Eine neue Commit-Message wird vergeben:

# This is a combination of 3 commits.
# The first commit's message is:
Added version 1.2 feature

Wird nun "git log" aufgerufen taucht der soeben erstellte Commit auf, die vorherigen wurden in diesem zusammengetragen:

:~/repos/dev-1$ git log
commit 7f2581e3df0e9c57e21f77cdc756a904810983f6
Author: Test User <tktest@test.com>
Date:   Wed Jan 25 11:15:30 2012 +0100

    Added version 1.2 feature

commit 511cbeabd165a747dd1b018c854557218463c04e
Author: dev-1 <dev-1@exmaple.com>
Date:   Mon Jan 23 14:56:47 2012 +0100

    calling function2

Einzelnachweise

  1. Squashing commits with rebase (de.gitready.com)
  2. Git rebase man page (linux.die.net)

Das könnte Sie auch interessieren

Git Grundbefehle
Git Server-Konfiguration
Git-annex