4 Stimmen

Git: Wie findet man alle Commits in Zweig A, die aus einem abgeleiteten Zweig B stammen, der wieder in A zusammengeführt wurde?

Wenn ich in Git (1) einen Zweig A und (2) einen Zweig B habe, der irgendwann in der Vergangenheit von A abgeleitet und dann wieder in A zusammengeführt wurde, wie kann ich dann alle Commits finden, die jetzt in A sind und ihren Ursprung in B haben?

Ziel ist es, den Änderungssatz der in B durchgeführten Arbeiten jetzt in A zu identifizieren, um Probleme schneller aufzuspüren.

Ein Squash-Commit würde natürlich den gesamten Änderungssatz in einen Commit packen, um eine einfache Referenz zu ermöglichen, aber die Nachteile (wie der Verlust von Informationen und individueller Zuordenbarkeit) machen diese Option für uns unerwünscht. Daher meine Frage.

5voto

Tim Henigan Punkte 57320

Unter der Annahme, dass B wurde vollständig verschmolzen mit A können Sie verwenden:

git cherry -v <merge-commit>^ <topic-branch>

...wo:

  • <merge-commit>^ ist der Elternteil des Commits, in dem Sie den Themenzweig zusammengeführt haben.
  • <topic-branch> ist der Zweig, den Sie prüfen wollen

1voto

Cascabel Punkte 449595

Sobald ein Zweig wieder eingefügt wurde, ist der Merge-Commit der Marker für seine Existenz. Angenommen, Sie spielen nicht zu viel mit Ihren Merge-Commit-Nachrichten herum, könnten Sie etwa so vorgehen:

#!/bin/bash

die_with_usage() {
    # add a git alias for merged-commits to be able to call it like this
    echo "usage: git merged-commits <branch-merged> <branch-merged-into>" 1>&2
    exit 1
}

if [ $# -ne 2 ]; then
    die_with_usage
fi

# Find the merge commits
merges=($(git log --pretty=%H --grep="Merge branch '$1' into $2"))

if [ ${#merges[@]} -eq 0 ]; then
    echo "error: no such merges found!" 1>&2
    die_with_usage
fi

for merge in ${merges[@]}; do
    # The first parent is the merged-into branch
    bar=$merge^1
    # The second is the merged branch
    foo=$merge^2

    # Find the merge base
    base=$(git merge-base $bar $foo)

    # Show the commits
    git log --pretty=%H $base..$foo
done

Ich dachte mir, dass es hilfreich wäre, die SHA1s einfach zu drucken und Sie dann damit machen zu lassen, was Sie wollen, aber natürlich können Sie mit dem Ausgabeformat der letzten Datei herumspielen. git log .

(Ich habe das sogar getestet und werde es vielleicht behalten; es ist ein cooler kleiner Einzeiler).

Eine weitere Möglichkeit, die Sie (in Zukunft) nutzen können, ist eine Merge-Commit-Nachricht nach dem Vorbild von git.git, die im Wesentlichen das Shortlog der zusammengeführten Commits in die Merge-Commit-Nachricht einbettet (hier ist ein Beispiel ). Es gibt einen eingebauten Weg, um dies zu tun eines Tages (es wurde zu nächsten, aber nicht Master zusammengeführt), aber für jetzt müssten Sie Ihre eigenen rollen, oder machen Sie einen mutigen Schritt und bauen von nächsten.

1voto

Jakub Narębski Punkte 286531

Werfen Sie einen Blick auf git-resurrect.sh Skript in contrib/ Bereich der Git-Quellen.

usage: git resurrect \[-a\] \[-r\] \[-m\] \[-t\] \[-n\] \[-b <newname>\] <name>

    -b, --branch ...      save branch as  instead of <name>
    -a, --all             same as -l -r -m -t
    -k, --keep-going      full rev-list scan (instead of first match)
    -l, --reflog          scan reflog for checkouts (enabled by default)
    -r, --reflog-merges   scan for merges recorded in reflog
    -m, --merges          scan for merges into other branches (slow)
    -t, --merge-targets   scan for merges of other branches into 
    -n, --dry-run         don't recreate the branch

**git-resurrect** attempts to find traces of a branch tip called <name>,
and tries to resurrect it.  Currently, the reflog is searched for checkout
messages, and with \`-r' also merge messages.  With \`-m' and \`-t', the
history of all refs is scanned for "_Merge <name> into other_" /
"_Merge <other> into <name>_" (respectively) in commit subjects,
which is rather slow but allows you to resurrect other people's
topic branches.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X