Ich möchte eine Verzweigung auf dem Master-Zweig referenzieren, aber so, dass alle Commits im Git-Log in chronologischer Reihenfolge erscheinen. Ist das möglich ohne git rebase --interactive
und die Commits manuell neu anordnen?
Hintergrund: Ich verwende git, um die Marionettenkonfiguration einer Serverfarm zu verfolgen. Der Master-Zweig befindet sich immer in einem bekannten guten Zustand, so dass alle vorhandenen Server ihre Konfiguration vom Puppet-Master-Server abrufen können.
Jeder neue Server erhält seinen eigenen Zweig. Wenn ich also an der Konfiguration eines neuen Servers arbeite, z. B. einen Domänennamen ändern oder ein SSL-Zertifikat konfigurieren möchte, überprüfe ich seinen Zweig und setze alle Konfigurationen fest.
Nachdem die neue Konfiguration abgeschlossen ist, rebase ich die Änderungen auf den Master-Zweig:
%Vor%Die neuen Commits stehen nun oben auf dem Protokoll, aber sie haben ihre ursprünglichen (vergangenen) Daten. Es sieht so aus:
%Vor% Beachten Sie, wie die alten Zeitstempel der Zweig-Commits oben im Protokoll angezeigt werden, anstatt im Protokoll entsprechend ihren Commit-Daten weiter unten zusammengeführt zu werden. Ich muss ein weiteres git rebase --interactive
ausführen, um die Commits neu anzuordnen, so dass meine Protokolldatei alle Commits in chronologischer Reihenfolge zeigt.
Ihre Frage ist etwas unterspezifiziert, weil git log
die Ausgabe immer sortiert, aber nimmt Optionen, die es wie zum Sortieren sagen:
Bestellung bestätigen
Standardmäßig werden die Commits in umgekehrter chronologischer Reihenfolge angezeigt.
--date-order
Zeigt keine Eltern an, bevor alle seine Kinder gezeigt werden, sondern zeigen Commits in der Zeitfolge des Commit-Timestamps.
--author-date-order
Zeigt keine Eltern an, bevor alle seine Kinder angezeigt werden, ansonsten zeigen sie Commits in der Zeitstempelreihenfolge des Autors.
--topo-order
Zeige keine Eltern, bevor alle ihre Kinder angezeigt werden, und vermeide es, Commits in mehreren Zeilen der Geschichte untereinander zu zeigen.
Ohne Optionen zeigt git log
Commits in chronologischer Reihenfolge an, egal was passiert.
Ich denke Sie fragen stattdessen, wie Sie die Zeitstempel für die gestaffelten Commits ändern können . Standardmäßig werden bei der Umbuchung die Zeitstempel beibehalten.
Beachten Sie, dass es bei jedem Commit zwei Zeitstempel gibt: das Datum des Autors und das Datum des Committer.
Die Referenzdokument-Dokumentation beschreibt diese zwei Optionen:
>
--committer-date-is-author-date
,--ignore-date
Diese Flags werden an
git am
übergeben, um die Daten der gestaffelten Commits einfach zu ändern (siehe git-am (1)). Inkompatibel mit der Option--interactive
.
In der git am
-Dokumentation finden Sie eine genauere Beschreibung diese:
--committer-date-is-author-date
Standardmäßig zeichnet der Befehl das Datum aus der E-Mail-Nachricht als das Datum des Festschreibungsautors auf und verwendet den Zeitpunkt der Erstellung der Festschreibung als das Datum des Festschreibungsereignisses. Dadurch kann der Benutzer über das Committer-Datum lügen, indem er denselben Wert wie das Autorendatum verwendet.
--ignore-date
Standardmäßig zeichnet der Befehl das Datum aus der E-Mail-Nachricht als das Datum des Festschreibungsautors auf und verwendet den Zeitpunkt der Erstellung der Festschreibung als das Datum des Festschreibungsereignisses. Dies ermöglicht dem Benutzer, über das Datum des Autors zu lügen, indem er den gleichen Wert wie das Datum des Committer verwendet.
Sie können sowohl Autor- als auch Committer-Daten im fuller
-Format mit git log
anzeigen, zum Beispiel ( git log --format=fuller
).
Ich glaube, dass Sie --ignore-date
verwenden wollen, was jede Neuvergabe zu einem "im Moment" passiert (das setzt voraus, dass ich Ihre Frage richtig interpretiere!).
Wenn Sie die ursprünglichen Daten beibehalten möchten, bleiben Sie bei der Neuausrichtung Ihrer Daten hängen.
Wenn Sie jedoch eine Pull-Anforderung erstellen und die Commits korrekt in einem Tool sortieren möchten, das nach Autordatum sortiert (TFS und GitHub tun beides), möchten Sie möglicherweise stattdessen die Daten ändern.
Windows:
git rebase --force-rebase --exec "ping localhost -n 3" --exec "git commit --amend --date=now" master
Linux:
git rebase --force-rebase --exec "sleep 2" --exec "git commit --amend --date=now" master
Beachten Sie, dass das Ausführen von git rebase --ignore-date master
nicht funktioniert, da das Datum nur eine zweite Auflösung hat und verschiedene Commits dasselbe Datum erhalten und in einer nicht angegebenen Reihenfolge sortiert werden. Wenn Sie --exec
und --ignore-date
zusammen verwenden, wird der Parameter --ignore-date
ignoriert. Weil es mit dem interaktiven Modus nicht kompatibel ist, welches --exec
verwendet.
Tags und Links git git-rebase