Ir para uma revisão específica

582

Eu clonei um repositório git de um determinado projeto. Posso transformar os arquivos no estado inicial e, quando revisar os arquivos, vá para a revisão 2, 3, 4 ... mais recente? Eu gostaria de ter uma visão geral de como o projeto estava evoluindo.

xralf
fonte

Respostas:

874

Use git checkout <sha1>para verificar uma confirmação específica.

Marcelo Cantos
fonte
2
Você pode fazer isso git log -n1. Mas, a menos que git checkoutfalhe, é um desperdício de esforço.
Marcelo Cantos
2
Funciona. Eu tive que usar sha1 completo (não parcial). E se eu quiser colocar o projeto em segunda revisão? git logmostra apenas o primeiro commit agora, posso descobrir o sha1 do próximo commit?
xralf 25/09
6
Você só deve usar o sha1 suficiente para garantir a exclusividade. Talvez você tenha tido uma infeliz coincidência. Git não tem conceito do "próximo" commit; a história é um DAG com todas as setas apontando para trás. Você deve executar git log --onelinee colar a saída em um arquivo de texto para referência (as somas abreviadas de sha1 que ele fornece são garantidas como únicas). Outra opção, se sua história é linear, é descobrir quantos commits existem desde o primeiro comprometer até mastere uso git checkout master~543(se houver 543 commits), então git checkout master~542, etc.
Marcelo Cantos
20
e como fazer o checkout de volta ao commit atual em "git checkout <sha1>"?
アレックス
6
@AlexanderSupertramp Finalize a compra da filial.
Marcelo Cantos
50

Para ir para uma versão / confirmação específica, execute os seguintes comandos. HASH-CODE você pode obtergit log --oneline -n 10

git reset --hard HASH-CODE

Nota - Após redefinir para uma versão / confirmação específica, você pode executar git pull --rebase, se desejar recuperar todos os commits descartados.

J4cK
fonte
1
Note-se que a resetnão apenas o checkout um determinado ponto no gráfico que também irá mover o momento check-out branch
Liam
Além disso reset, todas as alterações pendentes são descartadas.
WilliamKF
2
--hard flag excluirá todos os commits após o hash mencionado .... provavelmente deseja adicionar um pouco de detalhe aqui. Tenho certeza que as pessoas perderam a história e se perguntaram o porquê.
Urasquirrel
git pull --rebasefunciona apenas se você tiver um controle remoto para seu repositório e estiver atualizado.
Keith Thompson
19

Você pode obter uma visão gráfica do histórico do projeto com ferramentas como gitk. Apenas corra:

gitk --all

Se você deseja fazer check-out de uma ramificação específica:

git checkout <branch name>

Para uma confirmação específica, use o hash SHA1 em vez do nome da ramificação. (Veja Treeishes no Livro da Comunidade Git , que é uma boa leitura, para ver outras opções para navegar em sua árvore.)

git log também possui um conjunto de opções para exibir o histórico detalhado ou resumido.

Não conheço uma maneira fácil de avançar em um histórico de consolidação. Projetos com uma história linear provavelmente não são tão comuns assim. A idéia de uma "revisão" como você faria com o SVN ou CVS não é tão boa assim no Git.

Esteira
fonte
2
Esteja ciente: o git não mentirá para você, fornecendo um histórico linear único do projeto. Isto é, a menos que o projeto realmente tenha evoluído dessa maneira.
Andres Jaan Tack
Seguir em frente é logicamente sem sentido (mesmo em uma história linear), pois um commit não faz referência ao "futuro". Na melhor das hipóteses, você pode identificar todas as confirmações que têm a confirmação em questão como pai. Lembre-se, retroceder também não é um exercício trivial, devido a fusões.
Marcelo Cantos
5

Usando a chave SHA1 de uma confirmação, você pode fazer o seguinte:

  • Primeiro, encontre a confirmação que você deseja para um arquivo específico:

    git log -n <# commits> <file-name>

    Isso, com base no seu <# commits>, gerará uma lista de confirmações para um arquivo específico.

    DICA: se você não tem certeza do que cometer você está procurando, uma boa maneira de descobrir é usando o seguinte comando: git diff <commit-SHA1>..HEAD <file-name>. Este comando mostrará a diferença entre a versão atual de uma confirmação e uma versão anterior de uma confirmação para um arquivo específico.

    NOTA: A chave SHA1 de uma confirmação é formatada na git log -nlista de:

comprometer <SHA1 id>

  • Segundo, faça o checkout da versão desejada:

    Se você encontrou o commit / versão desejado, basta usar o comando: git checkout <desired-SHA1> <file-name>

    Isso colocará a versão do arquivo que você especificou na área de preparação. Para retirá-lo da área de preparação, use o comando:reset HEAD <file-name>

Para reverter para onde o repositório remoto está apontado, basta usar o comando: git checkout HEAD <file-name>

Mago
fonte
2

Eu estava em uma situação em que possuímos uma ramificação principal e, em seguida, outra ramificação chamada 17.0 e, dentro dessa versão 17.0, havia um hash de confirmação sem dizer "XYZ" . E o cliente recebe uma compilação até a revisão XYZ. Agora, descobrimos um bug e isso precisa ser resolvido para esse cliente. Portanto, precisamos criar ramificações separadas para esse cliente até o hash "xyz". Então aqui está como eu fiz isso.

Primeiro, criei uma pasta com esse nome de cliente na minha máquina local. Digamos que o nome do cliente seja "AAA" quando a pasta for criada, emita o seguinte comando dentro desta pasta:

  1. git init
  2. git clone Após este comando, você estará no ramo principal. Então mude para o ramo desejado
  3. git checkout 17.0 Isso o levará ao ramo em que seu commit está presente
  4. git checkout Isso levará seu repositório até o commit do hash. Veja o nome da sua ramificação que foi alterada para esse commit hash no. Agora, forneça um nome de filial para esse hash
  5. git branch ABC Isso criará uma nova ramificação em sua máquina local.
  6. git checkout ABC
  7. origem do git push ABC Isso enviará esta ramificação para o repositório remoto e criará uma ramificação no servidor git. Você terminou.
acinzentado
fonte
1

Uma maneira seria criar todos os commits já feitos nos patches. faça o checkout do commit inicial e aplique os patches em ordem após a leitura.

use git format-patch <initial revision>e então git checkout <initial revision>. você deve obter uma pilha de arquivos no seu diretor começando com quatro dígitos, que são os patches.

Quando terminar de ler sua revisão, faça o git apply <filename>que deve parecer git apply 0001-*e contar.

Mas eu realmente me pergunto por que você não gostaria de ler os patches em si? Por favor, poste isso em seus comentários porque estou curioso.

o manual do git também me fornece o seguinte:

git show next~10:Documentation/README

Mostra o conteúdo do arquivo Documentation / README como eles estavam atualizados no 10º último commit da ramificação a seguir.

você também pode dar uma olhada, git blame filenamefornecendo uma lista na qual cada linha está associada a um autor de hash + de confirmação.

Alex
fonte
1

Para chegar a um código confirmado específico, você precisa do código hash desse commit. Você pode obter esse código de hash de duas maneiras:

  1. Obtenha-o na sua conta github / gitlab / bitbucket. (Está no seu URL de confirmação, por exemplo: github.com/user/my_project/commit/ commit_hash_code ), ou você pode
  2. git loge verifique seus commits recentes nesse ramo. Ele mostrará o código de hash do seu commit e a mensagem que você deixou enquanto estava enviando seu código. Basta copiar e depois fazergit checkout commit_hash_code

Depois de passar para esse código, se você quiser trabalhar nele e fazer alterações, faça outra ramificação com git checkout -b <new-branch-name>, caso contrário, as alterações não serão mantidas.

Ianiv Hojman
fonte
0

Para verificar uma confirmação (você está olhando o passado!).

  • git checkout "commmitHash"

Para reiniciar brutalmente a partir de uma confirmação e excluir os ramos posteriores que você provavelmente errou.

  • git reset --hard "commmitHash"
Jeremy
fonte