Je travaille sur une régression dans le code source. Je voudrais dire à Git: "extraire la source en fonction d'une date / heure paramétrée". Est-ce possible?
J'ai également mis en scène des changements dans ma vue 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 précédente.
git
git-checkout
Amir Afghani
la source
la source
git bisect good
point initial .tags
.Réponses:
Pour conserver vos modifications actuelles
Vous pouvez garder votre travail caché, sans le commettre, avec
git stash
. Vous seriez alors prêtgit stash pop
à le récupérer. Ou vous pouvez (comme l' a dit Carleeto )git commit
dans une branche distincte.Commander par date à l'aide de rev-parse
Vous pouvez extraire un commit à une date spécifique en utilisant
rev-parse
comme ceci:Vous trouverez plus de détails sur les options disponibles dans le
git-rev-parse
.Comme indiqué dans les commentaires, cette méthode utilise le reflog pour trouver le commit dans votre historique. Par défaut, ces entrées expirent après 90 jours . Bien que la syntaxe d'utilisation du reflog soit moins détaillée, vous ne pouvez revenir en arrière que 90 jours.
Commander par date à l'aide de rev-list
L'autre option, qui n'utilise pas le reflog, est d'utiliser
rev-list
pour obtenir la validation à un moment donné avec:Notez le --first-parent si vous ne voulez que votre historique et non les versions apportées par une fusion. C'est ce que tu veux d'habitude.
la source
git co 'master@{2 days ago}'
.git rev-list -n 1 --before="2009-07-27 13:37" master
$(...)
sont préférées.La solution d'Andy ne fonctionne pas pour moi. Ici, j'ai trouvé un autre moyen:
Git: paiement par date
la source
error: unknown switch `n'
des idées pour contourner ce problème?On dirait que vous avez besoin de quelque chose dans le sens de ceci: Git checkout basé sur la date
En d'autres termes, vous utilisez
rev-list
pour trouver le commit, puis utilisez checkout pour le récupérer.Si vous ne voulez pas perdre vos modifications par étapes, la chose la plus simple serait de créer une nouvelle branche et de les valider dans cette branche. Vous pouvez toujours basculer entre les branches.
Edit: Le lien est en panne, voici donc la commande:
la source
git checkout branch@{date}
Arrête donc de fonctionner lorsque le reflog expire, mais vous pouvez l'utilisergit checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
.À ceux qui préfèrent une pipe pour commander la substitution
la source
Dans mon cas, l'
-n 1
option ne fonctionne pas. Sous Windows, j'ai constaté que la séquence de commandes suivante fonctionne correctement:Cela renvoie le SHA du commit approprié pour la date donnée, puis:
la source
La
git rev-parse
solution proposée par @Andy fonctionne bien si la date qui vous intéresse est la date du commit . Si toutefois vous souhaitez commander en fonction de la date de l' auteur ,rev-parse
cela ne fonctionnera pas, car il ne propose pas l'option d'utiliser cette date pour sélectionner les validations. Au lieu de cela, vous pouvez utiliser ce qui suit.(Si vous souhaitez également spécifier l'utilisation du temps
$1 >= "2016-04-12" && $2 >= "11:37"
dans le prédicat awk .)la source
Pour aller plus loin avec l'
rev-list
option, si vous souhaitez trouver le commit de fusion le plus récent de votre branche principale dans votre branche de production (à titre d'exemple purement hypothétique):J'avais besoin de trouver le code qui était sur les serveurs de production à une date donnée. Cela me l'a trouvé.
la source
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 le commit à partir duquel vous effectuez 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 branche à partir d'un certain temps, mais elles peuvent ne pas toujours suffire. Par exemple, si vous générez à partir d'une branche, puis supprimez la branche ou créez à partir d'une branche qui est ensuite rebasée, la validation à partir de laquelle vous avez créé peut devenir "inaccessible" dans git à partir de n'importe quelle branche actuelle. Les objets 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, quoi que vous fassiez avec les branches par la suite (sauf en supprimant la balise).
la source
prenez la chaîne imprimée (par exemple XXXX) et faites:
la source