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.
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
@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. –
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