Comment commander à Git par date?

Je travaille sur une régression dans le code source. Je voudrais dire à Git: “vérifier la source en fonction d’une date / heure paramétrée”. Est-ce possible?

J’ai aussi mis en scène des changements dans ma vision actuelle que je ne veux pas perdre. Idéalement, je voudrais basculer entre la source actuelle et une version qui m’intéresse en fonction d’une date antérieure.

Pour garder vos changements actuels

Vous pouvez garder votre travail caché, sans le commettre, avec git stash . Vous ne devriez pas utiliser git stash pop pour le récupérer. Ou vous pouvez (comme dit Carleeto ) git commit à une twig séparée.

Checkout par date à l’aide de la fonction Rev-Parse

Vous pouvez extraire un commit à une date spécifique en utilisant rev-parse comme ceci:

 git checkout 'master@{1979-02-26 18:30:00}' 

Vous trouverez plus de détails sur les options disponibles dans git-rev-parse .

Comme indiqué dans les commentaires, cette méthode utilise le renvoi pour rechercher le commit dans votre historique. Par défaut, ces entrées expirent après 90 jours . Bien que la syntaxe pour utiliser le reflog soit moins verbeuse, vous ne pouvez revenir en arrière que 90 jours.

Sortie par date en utilisant la liste de révocation

L’autre option, qui n’utilise pas le reflog, consiste à utiliser rev-list pour obtenir le commit à un moment donné avec:

 git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master` 

La solution d’Andy ne fonctionne pas pour moi. Ici j’ai trouvé un autre moyen:

 git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master` 

Git: vérification par date

On dirait que vous avez besoin de quelque chose du genre: Git checkout basé sur la date

En d’autres termes, vous utilisez rev-list pour rechercher le commit, puis utilisez checkout pour l’obtenir.

Si vous ne voulez pas perdre vos modifications par étapes, le plus simple serait de créer une nouvelle twig et de l’engager dans cette twig. Vous pouvez toujours basculer entre les twigs.

Edit: Le lien est en panne, alors voici la commande:

 git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master` 

Pour ceux qui préfèrent une pipe à la substitution de commande

 git rev-list -n1 --before=2013-7-4 master | xargs git checkout 

Dans mon cas, l’option -n 1 ne fonctionne pas. Sous Windows, j’ai trouvé que la séquence de commandes suivante fonctionne correctement:

 git rev-list -1 --before="2012-01-15 12:00" master 

Cela retourne le SHA de la validation appropriée pour la date donnée, puis:

 git checkout SHA 

En allant plus loin avec l’option rev-list , si vous voulez trouver la validation de fusion la plus récente de votre twig principale dans votre twig de production (comme exemple purement hypothétique):

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

Je devais trouver le code qui se trouvait sur les serveurs de production à une date donnée. Cela l’a trouvé pour moi.

La solution git rev-parse proposée par @Andy fonctionne bien si la date qui vous intéresse est la date du commit . Si toutefois vous souhaitez effectuer une vérification en fonction de la date de l’ auteur , l’ rev-parse ne fonctionnera pas, car elle n’offre pas une option permettant d’utiliser cette date pour sélectionner les validations. Au lieu de cela, vous pouvez utiliser les éléments suivants.

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

(Si vous souhaitez également spécifier l’heure, utilisez $1 >= "2016-04-12" && $2 >= "11:37" dans le prédicat awk .)

Si vous souhaitez pouvoir revenir à la version précise du référentiel au moment où vous effectuez une génération, il est préférable de baliser la validation à partir de laquelle vous avez effectué la génération.

Les autres réponses fournissent des techniques pour renvoyer le référentiel à la validation la plus récente dans une twig à un certain moment – mais elles peuvent ne pas toujours suffire. Par exemple, si vous créez à partir d’une twig et supprimez plus tard la twig, ou si vous créez une twig qui sera rebasée ultérieurement, la validation générée peut devenir “inaccessible” dans n’importe quelle twig actuelle. Les objects inaccessibles dans git peuvent éventuellement être supprimés lorsque le référentiel est compacté.

Mettre une balise sur la validation signifie qu’elle ne devient jamais inaccessible, peu importe ce que vous faites avec les twigs par la suite (sauf en supprimant la balise).

 git rev-list -n 1 --before="2009-07-27 13:37" origin/master 

prenez la chaîne imprimée (par exemple XXXX) et faites:

 git checkout XXXX