2013-09-08 6 views
33

Ich weiß, es gab sehr ähnliche Fragen hier, aber sie haben mein Problem nicht gelöst. Vielleicht gibt es etwas, das ich nicht gut verstehe.Liste commits zwischen 2 commit Hashes in git

Dies ist ein Teil der Commit Geschichte FitNesse (https://github.com/unclebob/fitnesse/):

* | | | | | | | | | | | | | | | fa86be8 Avoid possible issue when using CachingPage under heavy memory load. 
|/////////////// 
* | | | | | | | | | | | | | | 7b4a07a Merge pull request #256 from barredijkstra/fitnesse_issue_250 
|\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 
| * | | | | | | | | | | | | | | ecf5891 Fixed test checking for OS specific exception message. 
| * | | | | | | | | | | | | | | 082236e Added rendering of cause exceptions. Fix for unclebob/fitnesse#250 
* | | | | | | | | | | | | | | | a92b37f Merge pull request #243 from amolenaar/fix/243-hash-table-rendering 

ich die Liste der Commits wollen zwischen 2 Hashes begehen. In diesem speziellen Fall mag ich die Commits zwischen ecf5891 und 7b4a07a, und ich erwarte, dass das Ergebnis sein:

ecf5891 
7b4a07a 

Si Bis jetzt habe ich benutze und es hat mit linearer Geschichte fein gearbeitet. In diesem Fall bekomme ich jedoch viel mehr Commits.

Ich habe das ausprobiert und es funktioniert wie erwartet:

git log --since='<date ecf5891>' --until='<date 7b4a07a>' 

(I manuell für die 2 Tage, gesucht haben).

Eine mögliche Lösung ist, die 2 Daten zu bekommen und tun Sie das, aber ich denke, es sollte einen besseren Weg geben.

Bearbeiten: 7b4a07a Eltern sind ecf5891 und a92b37f. Bisher arbeiten die Lösungen in Ordnung, wenn ich ecf5891-7b4a07a gehen wollen, aber wenn ich a92b37f-7b4a07a hinwollen möchte ich erhalten:

7b4a07a 
ecf5891 
082236e 
a92b37f 

aber ich habe nicht a92b37f

Antwort

3

Fügen Sie^7b4a07a ~ hinzu, um auch alle Objekte auszuschließen, die vom ersten Elternteil der Zusammenführung erreichbar sind. Sie schließen nur aus, was von seinem zweiten Elternteil erreichbar ist.

+0

Typo von Arten, Sie brauchen die '^' vor (oder '--not') – torek

+0

Wo sollte ich diesen Teil hinzufügen? Wie wäre die komplette Linie? – Nico

+0

fügen Sie es dem Rest Ihrer Spezifikation hinzu, nur ein weiteres Argument. @torek: :-P yow. Vielen Dank. – jthill

20

"Between" ist eine etwas schlüpfrige Vorstellung, wenn es um Git Commits geht. nur diese beiden Commits

Der Text, den Sie oben zeigen, mit einem Ausschnitt aus Graphen-Ausgang, zeigt, warum from^..to als mehr produziert: der to Teil ist eine Zusammenführung zu begehen.

Die Notation A..B ist wirklich nur eine Abkürzung für B ^A. Das heißt, "alles ab B und rückwärts arbeiten, minus alles ab A und rückwärts arbeiten". Aber B ist ein Merge-Commit, also "alles, was dort beginnt und rückwärts arbeitet" verwendet beide Eltern.

Hier das erste Elternteil von 7b4a07a ist a92b37f (nicht in Ihrem [Original] Snippet oben, aber ich klonte das verknüpfte Repo und fand es). Wir können uns jedoch symbolisch darauf beziehen, und ich werde unten sehen. Der zweite Elternteil von 7b4a07a ist ecf5891, der "Von" -Teil, an dem Sie interessiert sind.

Wenn Sie fragen nach:

ecf5891^..7b4a07a 

bedeutet das:

7b4a07a ^ecf5891^ 

, die die gleiche ist wie:

7b4a07a ^082236e 

, die Sie beide Elternteile der Zusammenführung bekommt, und dann trimmt alles von 082236e zurück. Sie müssen schneiden Sie alles von 7b4a07a^ -der erst Eltern-und auch zurück:

git rev-list 7b4a07a ^ecf5891^ ^7b4a07a^ 
git log --oneline 7b4a07a ^ecf5891^ ^7b4a07a^ 

Im Allgemeinen wenn Sie das Nachfahre Linie, um herauszufinden, haben (s) abhacken.

Edit: Sie können mit der A..B Notation bleiben, aber Sie müssen die zusätzliche "Exclude" hinzufügen. So funktioniert jthill's answer auch, sobald Sie den Hut nach vorne bewegen.


Re deine Bearbeitung („wenn ich a92b37f-7b4a07a gehen will“): Wir sind zurück zu diesem Thema ‚zwischen‘ Sein ein rutschiger Begriff. Welche Commits sind "zwischen"? Es gibt eine direkte Verbindung von a92b37f zu 7b4a07a, weil a92b37f einer der beiden Eltern des Merge-Commits 7b4a07a ist. Also durch die frühere Logik ("direkt auf einer Ahnenlinie festgeschrieben", vielleicht "inklusive"), das wäre nur eines oder vielleicht beides von diesen beiden Commits. Aber du sagst, dass du zwei Commits willst, die im altersgemäßen Sinn überhaupt nicht mit a92b37f in Beziehung stehen. Warum wollen Sie diese beiden besonderen Commits? Was macht 082236e "interessant" und 082236e^, seine Eltern, "uninteressant"?

+0

Ok, ich verstehe, als du gesagt hast "den ganzen Weg zurück, aber das gilt für die 2 Eltern". Dann tust du, was ich vorher getan habe, und hackst den außerparentalen Teil ab, indem du '^ 7b4a07a ^' machst, was '^ a92b37f' ist. Woher weißt du, dass "7b4a07a ^" "der andere" Elternteil sein wird und nicht "ecf5891"? Ich mache das in einem Skript, also kann ich nicht manuell nachschlagen. – Nico

+0

"Aye, da ist der Haken" -Hamlet. Es gibt keine Möglichkeit * a priori * zu wissen, welche Eltern eines Merges abgeschnitten werden sollen, nur von den Commits selbst. Sie müssen (möglicherweise viel) mehr Hintergrund zur Verfügung stellen. – torek

+0

Im Moment möchte ich die Commits in chronologischer Reihenfolge, die Vorstellung von "zwischen" wäre: Suche nach Commit A und B in der chronologischen Grafik, alle Commits zwischen ihnen einschließlich A und B. Vielleicht macht es nicht viel Sinn und Ich denke zu schnell. Bis jetzt war die Lösung die einfachste und hässlichste Lösung: Hol alle Commit-Hashes, suche nach A und füge zur Liste hinzu, bis ich B finde. Danke trotzdem, du hast einige Dinge beseitigt und mich überlegt, ob der chronologische Weg das ist Ich suche. – Nico

1

Zunächst identifizieren die relevanten 2 Hashes verpflichten, die Sie für das Erhalten der Liste müssen Hashes begehen zwischen ihnen durch

git log --oneline 

Dann verwenden, können Sie die entsprechenden zwei Hashes begehen holen und die Hashes zwischen ihnen begehen finden von

mit
git log <commit hash 1> <commit hash 2> --oneline | cut -d " " -f 1 
+0

Haben Sie diese Antwort getestet? Seine [keine erwarteten Ergebnisse] (http://stackoverflow.com/q/41688733) für mich. – jww

+1

Ich musste folgendes tun: 'git log --oneline hashone..hashtwo' –

11

ich denke, dass Sie `re für --ancestry-path, in Ihrem Fall suchen:

git rev-list --ancestry-path 7b4a07a..ecf5891 
Verwandte Themen