Stellen Sie sich folgende Geschichte vor:
c---e---g--- feature
/ \
-a---b---d---f---h--- master
Wie kann ich feststellen, wann Commit "c" mit Master zusammengeführt wurde (dh Merge Commit "h" finden)?
Ihr Beispiel zeigt, dass der Zweig feature
noch verfügbar ist.
In diesem Fall h
ist das letzte Ergebnis von:
git log master ^feature --ancestry-path
Wenn der Zweig feature
nicht mehr verfügbar ist, können Sie die Zusammenführungs-Commits in der Verlaufszeile zwischen c
und anzeigen master
:
git log <SHA-1_for_c>..master --ancestry-path --merges
Dies zeigt jedoch auch alle Zusammenführungen an, die nach h
und zwischen e
und g
an stattgefunden haben feature
.
Vergleichen des Ergebnisses der folgenden Befehle:
git rev-list <SHA-1_for_c>..master --ancestry-path
git rev-list <SHA-1_for_c>..master --first-parent
gibt Ihnen die SHA-1 h
als letzte gemeinsame Zeile.
Wenn Sie es zur Verfügung haben, können Sie es comm -1 -2
für diese Ergebnisse verwenden. Wenn Sie mit msysgit arbeiten, können Sie den folgenden Perl-Code zum Vergleichen verwenden:
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
(Perl-Code von http://www.cyberciti.biz/faq/command-to-display-lines-common-in-files/ , der von "jemandem in der Nachrichtengruppe comp.unix.shell" stammt).
Siehe Prozessersetzung, wenn Sie es zu einem Einzeiler machen möchten.
master
wurde in verschmolzenfeature
, dann sofortfeature
verschmolzen wirdmaster
als Vorspulen (Spitzefeature
ersetztmaster
). Würde dies dazu führen--first-parent
, dass der falsche Elternteil zurückgegeben wird?comm -1 -2
aber es hat nicht funktioniert.comm
funktioniert nur auf sortierten Zeilen. (Der Perl-Einzeiler funktioniert, obwohl ich ihn nicht lesen konnte.)git find-merge h master
(gibt nichts zurück, sollte aber h zurückgeben),git find-merge d master
(gibt f zurück, sollte aber d zurückgeben),git find-merge c feature
(gibt e zurück, sollte aber g zurückgeben).Fügen Sie dies zu Ihrem hinzu
~/.gitconfig
:Dann können Sie die Aliase wie folgt verwenden:
Verwenden Sie, um die Nachricht des Zusammenführungs-Commits und andere Details anzuzeigen
git show-merge
dieselben Argumente, anzuzeigen.(Basierend auf Gauthiers Antwort . Vielen Dank an Rosen Matev und Javabrett für die Behebung eines Problems mit
sort
.)quelle
sort -k2 | uniq -f1 -d | sort -n | tail -1 | cut -f2
die letzte gemeinsame Zeile nicht richtig gefunden wird. Hier ist ein Beispiel, wo es fehlschlägt.16db9fef5c581ab0c56137d04ef08ef1bf82b0b7
hier gefunden, wenn ich es auf Ihrer Paste ausführe. Wird das nicht erwartet? Auf welchem Betriebssystem bist du?29c40c3a3b33196d4e79793bd8e503a03753bad1
git-get-merge sucht und zeigt das gesuchte Merge-Commit:
Der Befehl folgt den untergeordneten Elementen des angegebenen Commits, bis eine Zusammenführung in einen anderen Zweig (vermutlich Master) gefunden wird.
quelle
Das heißt, um Gauthiers Beitrag zusammenzufassen:
BEARBEITEN: Da hierfür die Prozessersetzung "
<()
" verwendet wird, ist es nicht POSIX-kompatibel und funktioniert möglicherweise nicht mit Ihrer Shell. Es funktioniert mitbash
oderzsh
obwohl.quelle
<()
nicht POSIX-kompatibel. Sie verwenden müssenbash
,zsh
oder ein Shell - Unterstützung Prozess Substitution . Ich habe meine Antwort entsprechend bearbeitet.Ich musste das tun und fand es irgendwie
git-when-merged
(was tatsächlich auf diese SO-Frage verweist, aber Michael Haggerty hat hier nie einen Verweis auf sein sehr schönes Python-Skript hinzugefügt). Also jetzt habe ich.quelle
Aufbauend auf Gauthiers großartiger Antwort müssen wir
comm
die Listen nicht vergleichen. Da wir nach dem letzten Ergebnis suchen, in--ancestry-path
dem auch enthalten ist--first-parent
, können wir in der Ausgabe des ersteren einfach nach dem letzteren suchen :Oder für etwas Bissiges und Wiederverwendbares, hier ist eine Funktion, in die Sie eintauchen können
.bashrc
:quelle
comm
funktionierte nicht, wenn die Eingaben nicht sortiert waren.Für die Ruby-Menge gibt es Git-Woher . Sehr leicht.
quelle
Ich benutze das folgende Bash-Skript, das ich am Pfad platziere
~/bin/git-find-merge
. Es basiert auf Gauthiers Antwort und der Antwort von evilstreak mit wenigen Änderungen, um Eckfälle zu behandeln.comm
wird ausgelöst, wenn die Eingaben nicht sortiert sind.grep -f
funktioniert perfekt.Eckfälle:
~/bin/git-find-merge
Skript:Was mich das machen lässt:
Dieses Skript ist auch auf meinem Github verfügbar .
quelle
Suchen Sie dann vor dem Festschreiben nach der ersten Zusammenführung.
quelle
Meine Ruby-Version von @ robinsts Idee funktioniert zweimal schneller (was wichtig ist, wenn nach sehr alten Commits gesucht wird).
find-commit.rb
Sie können es einfach so verwenden:
quelle
Sie können so etwas versuchen. Die Idee ist, alle Zusammenführungs-Commits zu durchlaufen und zu prüfen, ob das Commit "c" von einem von ihnen aus erreichbar ist:
quelle
git rev-list <SHA-1_for_c>..master --ancestry-path --merges
Ich musste dies mehrmals tun (danke an alle, die diese Frage beantwortet haben!) Und schrieb schließlich ein Skript (nach Gauthiers Methode), das ich meiner kleinen Sammlung von Git-Dienstprogrammen hinzufügen konnte. Sie finden es hier: https://github.com/mwoehlke/git-utils/blob/master/bin/git-merge-point .
quelle