git ready

Lerne Git Commit für Commit
von Nick Quaranto, Übersetzung von Nico Gulden

Unmerged Commits finden

eingetragen am 16 Apr 2009

Du hast dich in einem thematischen Branch (Zweig) bei der Entwicklung deiner Software voran gearbeitet und es ist an der Zeit, deine Arbeit in die Hauptentwicklungslinie zu mergen. Mit grafischen Ansichten wie gitk oder GitX ist es recht einfach heraus zu finden, welche Changesets noch zu mergen sind. Stellen wir uns folgendes Szenario vor:

Auf der Kommandozeile hast du ein paar Optionen. Eine anständige Art der Visualisierung eröffnet sich bei der Verwendung von git log, dass neben der folgenden eine Menge Optionen anbietet:

git log --pretty=oneline --graph --all

Du kannst auch die Bereichssyntax in git log verwenden, um jene Commits zu bekommen, die noch nicht zusammengeführt sind.

$ git checkout master
$ git log ..42-adding-replies

git log master..42-adding-replies

Es gibt noch eine weitere Möglichkeit: git cherry. Sie macht genau, was wir wollen und sagt uns, welche Commits noch nicht im genannten Branch sind. Im Master-Branch führe ich folgenden Befehl aus:

$ git cherry -v master 42-adding-replies
+ a4d0f79fccbbc12a53e8f0e5c2a4ef960ad69ba2 Adding posts in
+ 7e71afd1faf36f17a0ff506e63cd2ca51496dad3 Revert "Adding posts in"
+ 5e815ece05d8813354e60ca1affb8cdb8c5d78fc Adding the right model
+ 956f4cec5684544066a0d261ff8ac80aff7a57ea Cleaning up model
+ 6c6cdb4342ed935f8fbd38f48f51dec469dd1823 Who needs tests?
+ c3481fd0d6279f5bd45c455b915e0b4b1c0d8909 Wrapping this up. Ship it.

Wir haben soeben Git gefragt, was nicht im master, aber im 42-adding-replies-Branch ist. Wie in den Abbildungen oben sehen wir, was noch zu mergen ist. Die -v Option gibt die Commit Nachricht zusammen mit dem SHA Hash aus. Der Befehl nimmt auch ein drittes, optionales Argument für einen Startpunkt oder eine Grenze auf. Wenn wir alles nach dem Commit 7e71af überprüfen wollen, nehmen wir:

$ git cherry -v master 42-adding-replies 7e71af
+ 5e815ece05d8813354e60ca1affb8cdb8c5d78fc Adding the right model
+ 956f4cec5684544066a0d261ff8ac80aff7a57ea Cleaning up model
+ 6c6cdb4342ed935f8fbd38f48f51dec469dd1823 Who needs tests?
+ c3481fd0d6279f5bd45c455b915e0b4b1c0d8909 Wrapping this up. Ship it.

Wie du sehen kannst, wurden die ersten beiden Commits in unserem Themenzweig ausgelassen. Wenn du überprüfen möchtest, was nicht im Upstream-Branch ist, wenn du dich nicht im Upstream-Branch befindest, ist es wieder einfacher:

$ git checkout 42-adding-replies
$ git cherry master
+ a4d0f79fccbbc12a53e8f0e5c2a4ef960ad69ba2
+ 7e71afd1faf36f17a0ff506e63cd2ca51496dad3
+ 5e815ece05d8813354e60ca1affb8cdb8c5d78fc
+ 956f4cec5684544066a0d261ff8ac80aff7a57ea
+ 6c6cdb4342ed935f8fbd38f48f51dec469dd1823
+ c3481fd0d6279f5bd45c455b915e0b4b1c0d8909

Ein wirklich nützlicher Aspekt des Befehls besteht darin, dass er wirklich die Changesets anstatt nur die SHAs vergleicht. Der Commit könnte sich durch Hinzufügen einer Signatur oder auch im Elternknoten verändert haben. In jedem Fall kannst du dich auf den Befehl verlassen. Er sagt dir, was noch nicht in den Upstream-Branch überführt wurde. Verwechsle den Befehl nicht mit cherry-pick, der etwas ganz anderes macht.