2013-01-08 2 views

Antwort

7

Dinge, wie Sie bemerken, sind nicht so einfach in Git. Vor allem die Definition von "Vorher" und "Nachher" bedarf noch etwas Klärung.

Wenn Sie den Personen vertrauen, die sich zu Ihrem Repository verpflichten, sich nicht mit Zeitstempeln zu befassen, und Sie wissen bereits, dass beide Commits auf demselben Zweig sind, können Sie die Zeitstempel der Commits vergleichen und sehen, welcher früher ist. Verwenden Sie den folgenden Befehl für jedes Commit und vergleichen Sie das Ergebnis.

git log -1 --format='%ci' <commit> 

Mit Git können Sie müssen nicht unbedingt dem Zeitstempel vertrauen jedoch, da im Gegensatz zu Subversion kein zentrales Repository mit einem Job da, um sie zu produzieren ist. Sie können auch nicht sicher sein, dass zwei Commits auf demselben Zweig sind (obwohl dieses Problem auch bei Subversion existiert).

Um diese Probleme zu vermeiden, sprechen Sie darüber, ob ein Commit ein Vorfahre eines anderen ist, und nicht, ob es davor oder danach kommt.In der folgenden commit Graph, B und C sind Vorfahren der A, während B nicht ein Vorfahre von C noch umgekehrt ist:

B (master) 
| C (branch) 
|/ 
A (root) 

Um zu bestimmen, ob Commit A ist ein Vorfahr von B begehen, verwendet den folgenden Befehl (basierend auf an article at git ready):

git rev-list <commitA> | grep $(git rev-parse <commitB>) 

der erste Teil listet alle zu, dass Vorfahren der Commit A sind; Der zweite Teil erhält den vollständigen Hash von Commit B und durchsucht dann die Vorfahrenliste nach diesem Commit. Wenn Sie eine Ausgabe sehen, ist Commit A ein Vorgänger von Commit B. Tauschen Sie die Argumente aus, um herauszufinden, ob Commit A stattdessen ein Vorgänger von Commit B ist.

Diese zweite Form ist langsamer, aber gibt Ihnen absolute Sicherheit, dass ein Commit ein Vorfahre eines anderen ist.

+0

Was bedeutet repräsentieren die Zeitstempel, wenn ich git log tun -1 --format = '% ci' ? Ich versuche nur ein Szenario zu verstehen, wenn ich dem Timestamp nicht trauen kann. – Glide

+0

@Glide: Dieser Zeitstempel repräsentiert die Zeit, zu der das Commit durchgeführt wurde. Da das Commit jedoch zunächst im lokalen Repository des Entwicklers vorgenommen wird, wenn die Uhr auf ihrem Computer falsch ist oder einen Trick wie das Abspielen mit 'GIT_COMMITTER_DATE' verwendet, könnte dieser Zeitstempel falsch sein. –

+0

Hey, der Befehl funktioniert, aber was Sie gesagt haben, wie es funktioniert, ist falsch. Der Befehl git rev-list bestimmt, ob Commit B ein Vorgänger von Commit A ist. Sie sagen "der erste Teil listet alle Commits auf, die Vorfahren von Commit A sind". Was es anscheinend tut, von einigen Tests habe ich gerade getan. Wenn Sie also diese Liste für einen Commit-SHA durchsuchen, wird der Grep erfolgreich sein. IFF-Commit B ist in dieser Vorfahrenliste, d. H. Ist ein Vorgänger von Commit A - das Gegenteil von dem, was Sie geschrieben haben. – eeeeaaii

0

Wenn Sie Tags verwenden, können Sie tun,

git describe --tags 

Dies wird Ihnen sagen, wie viele Commits seit dem letzten Tag.

2

Verwenden Sie für jedes Commit git show, um das Datum des Commits zu finden. Es gibt keinen Weg, den Hash zu betrachten, um die Reihenfolge zu bestimmen, da es nichts als ein Hash ist.

Sie können benutzerdefinierte Formatzeichenfolgen verwenden, um genau das zu zeigen, was Sie wollen, überprüfen Sie die man pages für weitere Informationen.

git show --format="%ci" <commit> 
2

Sie können alle Informationen aus dem Protokoll erhalten begehen, die den Hash, Autor, Datum zeigt, und Kommentar:

git log 

Sie eine bestimmte Zeit verpflichten ziehen kann/Datum aus dem Protokoll verpflichten. Etwas wie:

git log -1 --format="%cd" <commit> 

Die '% cd' gibt Ihnen das Datum in das Format Protokoll können Sie auch tun:

  • % cD: RFC2822 Stil
  • % Cr: relative
  • % ct: UNIX-Zeitstempel
  • % ci: ISO 8601

Von dort yo Sie können einige Scripting-Vergleiche durchführen, wenn Sie automatisieren müssen.

3

git rev-list --count kann helfen. Gesetzt 110a187 kommt 4 Commits vor 5d41af1, dann:

$ git rev-list --count 110a187..5d41af1 
4 
$ git rev-list --count 5d41af1..110a187 
0 

So etwas wie:

test $(git rev-list --count $a..$b) == 0 && \ 
     echo "$a is not an ancestor of $b" 
+0

Wenn @Glide Eltern/Nachfahren und nicht temporär bedeutet, dann ist diese Antwort genauer, wenn die Commits über Merges aus verschiedenen Zweigen in einen Zweig gelangen. –

Verwandte Themen