Estou trabalhando em uma regressão no código fonte. Eu gostaria de dizer ao Git: "verifique a fonte com base em uma data / hora parametrizada". Isso é possível?
Também realizei mudanças na minha visão atual que não quero perder. Idealmente, eu gostaria de alternar entre a fonte atual e uma versão na qual estou interessado com base em uma data anterior.
git
git-checkout
Amir Afghani
fonte
fonte
git bisect good
ponto inicial .tags
.Respostas:
Para manter suas alterações atuais
Você pode manter seu trabalho escondido, sem comprometer-o
git stash
. Você usariagit stash pop
para recuperá-lo. Ou você pode (como disse Carleeto )git commit
em um ramo separado.Fazer o check-out por data usando a análise de revisão
Você pode fazer o check-out de um commit em uma data específica usando o
rev-parse
seguinte:Mais detalhes sobre as opções disponíveis podem ser encontradas em
git-rev-parse
.Conforme observado nos comentários, esse método usa o reflog para encontrar o commit em seu histórico. Por padrão, essas entradas expiram após 90 dias . Embora a sintaxe para usar o reflog seja menos detalhada, você só pode voltar 90 dias.
Saída por data usando rev-list
A outra opção, que não usa o reflog, é usar
rev-list
para obter o commit em um determinado momento com:Observe o --primeiro pai, se você quiser apenas o histórico e não as versões trazidas por uma mesclagem. Isso é o que você geralmente quer.
fonte
git co 'master@{2 days ago}'
.git rev-list -n 1 --before="2009-07-27 13:37" master
$(...)
são os preferidos.A solução de Andy não funciona para mim. Aqui eu encontrei outra maneira:
Git: check-out por data
fonte
error: unknown switch `n'
alguma idéia de como contornar isso?Parece que você precisa de algo assim: Git checkout com base na data
Em outras palavras, você usa
rev-list
para encontrar o commit e, em seguida, usa o checkout para obtê-lo.Se você não deseja perder as alterações em etapas, o mais fácil seria criar uma nova ramificação e enviá-las para essa ramificação. Você sempre pode alternar entre ramificações.
Edit: O link está inoperante, então aqui está o comando:
fonte
git checkout branch@{date}
pára de funcionar quando o reflog expira, mas você pode usá-logit checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
.Para aqueles que preferem um cachimbo para comandar a substituição
fonte
No meu caso, a
-n 1
opção não funciona. No Windows, descobri que a seguinte sequência de comandos funciona bem:Isso retorna o SHA da confirmação apropriada para a data especificada e, em seguida:
fonte
A
git rev-parse
solução proposta por @Andy funciona bem se a data em que você está interessado é a data do commit . Se, no entanto, você desejar fazer o check-out com base na data do autor ,rev-parse
não funcionará, porque não oferece uma opção para usar essa data para selecionar os commits. Em vez disso, você pode usar o seguinte.(Se você também quiser especificar o tempo usado
$1 >= "2016-04-12" && $2 >= "11:37"
no predicado awk .)fonte
Indo além com a
rev-list
opção, se você deseja encontrar a consolidação de mesclagem mais recente de sua ramificação principal em sua ramificação de produção (como um exemplo puramente hipotético):Eu precisava encontrar o código que estava nos servidores de produção em uma determinada data. Isso encontrou para mim.
fonte
Se você quiser retornar à versão precisa do repositório no momento da construção, é melhor marcar o commit a partir do qual você faz a construção.
As outras respostas fornecem técnicas para retornar o repositório ao commit mais recente em uma ramificação a partir de um certo tempo - mas elas nem sempre são suficientes. Por exemplo, se você criar a partir de uma ramificação e, posteriormente, excluir a ramificação ou construir a partir de uma ramificação que é posteriormente rebaseada, a confirmação da qual você criou poderá se tornar "inacessível" no git a partir de qualquer ramificação atual. Objetos inacessíveis no git podem eventualmente ser removidos quando o repositório é compactado.
Colocar uma tag no commit significa que ele nunca se torna inacessível, não importa o que você faça com as ramificações depois (exceto remover a tag).
fonte
pegue a sequência impressa (por exemplo, XXXX) e faça:
fonte