2015-07-18 4 views
8

Ich möchte einen Zweig auf dem Master-Zweig rebasen, 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?wie man in chronologischer Reihenfolge rebase und commits hält?

Hintergrund: Ich bin mit git Spur der Puppen Konfiguration einer Serverfarm zu halten. 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 Domainnamen ändern, ein SSL-Zertifikat konfigurieren, checke ich seinen Zweig und übergebe alle Konfigurationen.

Nachdem die neue Konfiguration abgeschlossen ist, rebase ich die Änderungen an dem Master-Zweig:

# git checkout new_config 
Switched to branch 'new_config' 
# git rebase master 
First, rewinding head to replay your work on top of it... 
Applying: fix routing rules 
Applying: fix netmask 
Applying: configure new ip address 
# git checkout master 
Switched to branch 'master' 
# git merge new_config 
Updating 21a3120..b0b79d7 
Fast-forward 
files/custom/xxxx | 45 +++++++++++++++++++++++++++++++++++++++++++++ 
files/custom/yyyy | 38 -------------------------------------- 
manifests/site.pp | 6 +++--- 
3 files changed, 48 insertions(+), 41 deletions(-) 
# 

Die neuen Commits jetzt oben auf das Protokoll sind, aber sie haben ihre ursprünglichen (Vergangenheit) Daten. Es sieht wie folgt aus:

commit b0b79d7924ec97e367664ccc26aaf0021916a30d 
Author: 
Date: Sun Jul 12 17:14:41 2015 +0200 

    configure new ip address 

commit f60d00abd57d6b8582f49bf1322efb88d44ee86e 
Author: 
Date: Fri Jul 10 13:19:45 2015 +0200 

    fix netmask 

commit 6eaae6c328faf55e5725f65a947bbb23ea29b166 
Author: 
Date: Fri Jun 12 14:05:25 2015 +0200 

    fix routing rules 

commit 21a31200e6694c640b2cb526d773af11cd703ff1 
Author: 
Date: Wed Jul 15 15:08:41 2015 +0200 

    (most recent commit on master before rebase) 

commit a7fa9cfa9c317fbbeb7dac8a89009c7d935fdd11 
Author: 
Date: Wed Jul 15 11:56:59 2015 +0200 

    (second most recent commit on master) 

Beachten Sie, wie die alten Zeitstempel der Branche an der Spitze des Flog angezeigt verpflichtet, statt im Protokoll weiter unten zusammengefasst werden entsprechend ihrer begehen Daten. Ich muss ein anderes git rebase --interactive laufen lassen, um die commits so neu anzuordnen, dass meine Protokollakte alle commits in chronologischer Reihenfolge zeigt.

+3

Könnten Sie bitte erklären, warum es für Sie wichtig ist, dass Commits in chronologischer Reihenfolge angezeigt werden? –

+0

es ist mein persönlicher Geschmack. Ich finde es verwirrend, wenn es so sortiert ist. – nn4l

Antwort

3

Ihre Frage ist ein bisschen underspecified, weil git log immer seine Ausgabe sortiert, aber es takes options telling it how to sort:

Commit Bestellung

Standardmäßig werden die Commits in umgekehrter chronologischer Reihenfolge angezeigt.

--date-order

    zeigen keine Eltern vor allen seinen Kindern gezeigt werden, aber ansonsten zeigen begeht in dem Zeitstempel, um begehen.

--author-date-order

    zeigen keine Eltern vor allen seinen Kindern gezeigt werden, aber ansonsten zeigen begeht in dem Autor Zeitstempel um.

--topo-order

    zeigen keine Eltern vor allen seinen Kindern gezeigt werden, und vermeiden Commits auf mehreren Linien der Geschichte vermischte zeigt.

Also, ohne Optionen, git log zeigt Commits in chronologischer Reihenfolge, egal was.

ich denken, was Sie fragen ist, statt, wie Sie können Änderung die Zeitstempel auf den umbasiert Commits. In der Standardeinstellung werden bei der Umbuchung die Zeitstempel beibehalten.

Beachten Sie, dass bei jedem Commit zwei Zeitstempel vorhanden sind: das Autorendatum und das Datum des Täters.


Die rebase documentation beschreibt diese zwei Möglichkeiten:

--committer-date-is-author-date, --ignore-date

    Diese Fahnen werden an git am weitergegeben leicht die Daten der umbasiert Commits zu ändern (siehe git-am (1)). Inkompatibel mit der Option --interactive.

die git am documentation Beratung gibt eine bessere Beschreibung dieser:

--committer-date-is-author-date

    Standardmäßig ist der Befehl, um das Datum der Nachricht E-Mail zeichnet als Autor Datum begehen, und nutzt die Zeit der Commit-Erstellung als Committer-Datum. 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 Autor Datum begehen, und nutzt die Zeit der Schöpfung als Committer Datum zu begehen. Dies ermöglicht dem Benutzer, über das Datum des Autors zu lügen, indem er denselben Wert wie das Datum des Täters verwendet.

Sie beide Autor und Committer verfügbaren Daten können mit dem fuller Format mit git log, zum Beispiel (git log --format=fuller).

Ich glaube, dass Sie --ignore-date verwenden möchten, was jedes umgestützte Festschreiben "ab sofort" passieren lässt (das setzt voraus, dass ich Ihre Frage richtig interpretiere!).

+0

Ich habe beide Optionen ausprobiert, aber "git log" zeigt immer noch die neuen Einträge an. Ich habe meine ursprüngliche Frage geklärt, um besser zu zeigen, was ich brauche. – nn4l

+0

Ich schaue mir den Quellcode an und bin mir nicht sicher über etwas; Können Sie die zitierte git-Ausgabe mit '--format = fulller' wiederholen, so dass sowohl commit * als auch * author dates angezeigt werden?Entweder liegt in der Dokumentation die Frage nach der Sortierung nach (Committer-) Datum, oder Ihre Committer-Daten wurden auf "Now" geändert, wobei die Autorendaten allein gelassen wurden, so dass Sie "--commit-date-is-author-date" erhalten haben sollten was du wolltest. – torek

1

Wenn Sie die ursprünglichen Daten behalten möchten, sind Sie mit der Neuausrichtung nach Ihren Daten fest.

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.

Fenster: git rebase --force-rebase --exec "ping localhost -n 3" --exec "git commit --amend --date=now" master

Linux: nur git rebase --force-rebase --exec "sleep 2" --exec "git commit --amend --date=now" master

Beachten Sie, dass git rebase --ignore-date master tun, nicht funktioniert, weil das Datum zweite Auflösung und unterschiedliche Commits hat das gleiche Datum erhalten und in einer nicht spezifizierten Reihenfolge sortiert werden . Wenn Sie --exec und --ignore-date zusammen verwenden, wird der Parameter --ignore-date ignoriert. Weil es nicht mit dem interaktiven Modus kompatibel ist, der --exec verwendet.

Verwandte Themen