437 Stimmen

Wie kann man in Git nach Datum auschecken?

Ich arbeite gerade an einer Regression im Quellcode. Ich würde Git gerne sagen: "Checkout der Quelle basierend auf einem parametrisierten Datum/Uhrzeit". Ist dies möglich?

Ich habe auch Änderungen in meiner aktuellen Ansicht vorgenommen, die ich nicht verlieren möchte. Im Idealfall möchte ich zwischen der aktuellen Quelle und einer Version, die mich aufgrund eines früheren Datums interessiert, hin und her schalten.

11voto

VonC Punkte 1117238

Zur Erinnerung, seit Git 2.23 (Aug. 2019)

  • zu einem neuen Zweig von einem früheren Commit nach Datum wechseln:

    git switch -c newBranch $(git rev-list -n1 --before=yyyy-mm-dd main)
  • Wiederherstellung einer Datei zu einem früheren Zeitpunkt im aktuellen Arbeitsbaum

    git restore -SW -s $(git rev-list -n1 --before=yyyy-mm-dd main) -- path/to/file

Verwenden Sie nicht die alt, veraltet und verwirrend git checkout Befehl im Jahr 2021/2022: git switch y git restore genau beschreiben, was sie tun (sie arbeiten nur mit Zweigen für git switch und nur mit Dateien für git restore )

Verwenden Sie nicht ``: bevorzugen die modernere $(command substitution) シンタックス über die veraltete Backtick-Syntax.

6voto

Um einen neuen Zweig aus dem Checkout zu erstellen, verwenden Sie die Option -b mit dem Namen des neuen Zweigs.

git checkout -b 19July2021 `git rev-list -n1 --before=2021-7-19 master`

Sie können vermeiden git switch wenn Sie sich im Zustand "abgesetzter Kopf" befinden

5voto

Diomidis Spinellis Punkte 18162

En git rev-parse Die von @Andy vorgeschlagene Lösung funktioniert gut, wenn das Datum, an dem Sie interessiert sind, das Datum der Übergabe . Wenn Sie jedoch die Kasse auf der Grundlage der Datum des Autors , rev-parse wird nicht funktionieren, weil es keine Option bietet, dieses Datum für die Auswahl der Übertragungen zu verwenden. Stattdessen können Sie das Folgende verwenden.

git checkout $(
  git log --reverse --author-date-order --pretty=format:'%ai %H' master |
  awk '{hash = $4} $1 >= "2016-04-12" {print hash; exit 0 }
)

(Wenn Sie auch die Zeit angeben möchten, verwenden Sie $1 >= "2016-04-12" && $2 >= "11:37" im awk Prädikat).

3voto

egerlach Punkte 71

Weiter geht es mit der rev-list wenn Sie den letzten Merge-Commit von Ihrem Master-Zweig in Ihren Produktionszweig finden wollen (als rein hypothetisches Beispiel):

git checkout `git rev-list -n 1 --merges --first-parent --before="2012-01-01" production`

Ich musste den Code finden, der sich zu einem bestimmten Datum auf den Produktionsservern befand. Dies hat ihn für mich gefunden.

3voto

antlersoft Punkte 14491

Wenn Sie in der Lage sein wollen, zu der genauen Version des Repositorys zurückzukehren, wenn Sie einen Build durchführen, ist es am besten, den Commit zu markieren, von dem aus Sie den Build durchführen.

Die anderen Antworten bieten Techniken, um das Repository auf die jüngste Übergabe in einem Zweig ab einem bestimmten Zeitpunkt zurückzusetzen - aber sie reichen möglicherweise nicht immer aus. Wenn Sie z.B. von einem Zweig aus bauen und diesen später löschen oder von einem Zweig aus bauen, der später rebased wird, kann der Commit, von dem aus Sie gebaut haben, in Git von jedem aktuellen Zweig aus "unerreichbar" werden. Unerreichbare Objekte in Git werden möglicherweise entfernt, wenn das Repository komprimiert wird.

Wenn Sie die Übergabe mit einem Tag versehen, wird sie nie unerreichbar, egal was Sie danach mit den Zweigen machen (außer Sie entfernen das Tag).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X