2012-04-04 19 views
19

Betrachten Ich habe verpflichtetgit Squash und bewahren letzten commit Zeitstempel

... -- A -- B -- C 

Wenn ich git rebase -i verwenden, um alle drei Commits in einem Squash, könnten wir

pick A 
squash B 
squash C 

Ich sehe die Folge begehen A hat seine Original Zeitstempel. Wie könnte es den Zeitstempel von commit C (der letzte) erben?

Was ich denken kann, ist git commit --amend --date=<new_time>, aber auf diese Weise muss der Zeitstempel des Commits C vor Squash oder von Reflog erinnern.

Ich finde den Zeitstempel der letzten Commit ist vernünftiger, weil es zeigt, wenn ich tatsächlich die Arbeit fertig, die in den Commits sind.

Danke.

Antwort

11

Es gibt keine triviale Möglichkeit, dies zu tun, aber es gibt ein paar Optionen. Hier ist eine:

git commit --amend --date="$(git show -s --pretty=tformat:%ai <sha1-of-C>)" 

Und ein anderer:

git commit --amend -c <sha1-of-C> 

Letzteres wird clobber Ihre bestehende Nachricht begehen, so dass Sie es neu zu schreiben werde.

+0

Warum verwenden Sie 'tformat'? –

+0

@CrendKing: In diesem Fall ist es egal, ob es sich um 'format' oder' tformat' handelt, da das 'tformat'-Newline durch die Befehlsersetzungsregeln der Shell entfernt wird. In 99% der Fälle möchte ich jedoch den endgültigen Zeilenumbruch (oder was auch immer der Terminator ist), da ich normalerweise die benutzerdefinierte Protokollausgabe mit einem Skript analysiere. Um sicherzustellen, dass ich "tformat" gewohnheitsmäßig tue, wenn es darauf ankommt, verwende ich "tformat", auch wenn es keine Rolle spielt. –

3

git commit --amend --reset-author

+0

Dies verwendet nicht den Zeitstempel von C, es verwendet die aktuelle Zeit als Zeitstempel. – Doug

Verwandte Themen