revisão mais antiga de um arquivo com um novo nome, git-checkout

264

Eu tenho o arquivo " main.cpp" aberto no meu editor.

Também quero ver a revisão anterior de " main.cpp" no editor.

O jeito que eu faço agora é assim.

close "main.cpp" in the editor

prompt> mv main.cpp tmp
prompt> git checkout HEAD^ main.cpp
prompt> mv main.cpp old_main.cpp
prompt> mv tmp main.cpp
prompt>

open "main.cpp" and "old_main.cpp" in the editor

Pode ser simplificado, para que eu não precise fechar "main.cpp" no editor?

O que eu espero é que uma variante git-checkoutdisso possa fazer isso.


UPDATE: estou usando o git no mac osx 10.5.7

prompt> git --version
git version 1.6.0.4
prompt> 

UPDATE2: Jakub Narębski resposta é:

prompt> git show HEAD^:dir1/dir2/dir3/main.cpp > old_main.cpp
prompt>

UPDATE3: resposta de Karmi, para uma revisão específica:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 
neoneye
fonte
Qual editor você usa? Talvez tenha plugin / addon / module adicionando suporte ao Git?
Jakub Narębski
Eu uso colega de texto. Ele tem algum suporte ao git, mas ainda não verifiquei se é possível.
Neoneye 20/05/09
Textmate tem pacote git: github.com/timcharper/git-tmbundle (você deveria ter verificado InterfacesFrontendsAndTools página no wiki git: git.or.cz/gitwiki )
Jakub Narębski
A propósito, a interface VC no Emacs (para a qual o Git também tem suporte na forma de vc-git.el) possui o comando 'Show Other Version'. Se o TexMate Git Bundle (git-tmbundle) não o possuir, talvez valha a pena adicioná-lo.
Jakub Narębski 20/05/09
Uso links simbólicos para acompanhar melhor meu projeto no TextMate. 25 dirs, 300 arquivos. Isso ajuda a ocultar builddirs e outros diretórios irrelevantes. No entanto git / TextMate não é muito feliz com essas ligações, por isso não :-(
neoneye

Respostas:

312

Você pode usar o "git show" para isso:

prompt> git show HEAD^:main.cpp > old_main.cpp

(Observe que há um :caractere de dois pontos [ ] entre HEAD^e main.cpp.) A <revision>:<path>sintaxe é descrita na página de manual git rev-parse , ao lado do último ponto na seção "Especificando revisões":

  • <rev>: <caminho>, por exemplo, HEAD: README,: README, master: ./ README

    Um sufixo :seguido de um caminho nomeia o blob ou a árvore no caminho especificado no objeto tree-ish nomeado pela parte antes dos dois pontos. :path(com uma parte vazia antes dos dois pontos) é um caso especial da sintaxe descrita a seguir: conteúdo gravado no índice no caminho especificado.

    Um caminho que começa com ./ou ../é relativo ao diretório de trabalho atual. O caminho especificado será convertido para ser relativo ao diretório raiz da árvore de trabalho. Isso é mais útil para abordar um blob ou árvore de uma confirmação ou árvore que tenha a mesma estrutura de árvore que a árvore de trabalho.

Observe que <path>aqui está o caminho COMPLETO em relação ao diretório superior do seu projeto, ou seja, o diretório com o .git/diretório. (Ou, para ser mais exato em " <revisão> " (que em geral pode ser qualquer <árvore->> , ou seja, algo que represente árvore))

Se você quiser usar o caminho relativo ao diretório atual, precisará usar a ./<path>sintaxe (ou ../pathpara subir do diretório atual).

Editar 2015-01-15: informações adicionadas sobre a sintaxe do caminho relativo


Na maioria dos casos, é possível obter a mesma saída usando o git cat-filecomando de baixo nível (encanamento) :

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp
Jakub Narębski
fonte
3
Estou interessado em uma cópia completa, mas o git-show me mostra apenas as diferenças .. Tentei brincar com a opção --pretty .. prompt> git show --pretty = full HEAD ^ main.cpp, mas isso não aconteceu resolva isso.
Neoneye 20/05
7
"git show HEAD ^ main.cpp" (com espaço entre HEAD ^ e main.cpp) é DIFERENTE de "git show HEAD ^: main.cpp" (com dois pontos ':' entre HEAD ^ e main.cpp).
Jakub Narębski 20/05/09
Hmm, com dois pontos vejo esse erro, então pensei que os dois pontos eram um erro. Sim, parece que o cólon é o caminho a percorrer, mas como faço para resolver isso? prompt> git show HEAD ^: main.cpp fatal: argumento ambíguo 'HEAD ^: main.cpp': revisão desconhecida ou caminho que não está na árvore de trabalho. Use '-' para caminhos separados de revisões prompt>
neoneye
2
Isso provavelmente significa que você deu PATHNAME errado (infelizmente, por causa do "git show", o git mágico não pode dar uma melhor mensagem de erro). Deve estar cheio caminho relativo ao diretório superior do seu projeto: $ (git ls-árvore -r --name somente CABEÇA ^ | main.cpp grep)
Jakub Narębski
3
Em vez do caminho completo, nos documentos: "Um caminho começando com ./ ou ../ é relativo ao diretório de trabalho atual". Funciona na minha versão 1.8.5.
LVB
24

Apenas para adicionar à resposta de Jakub: você nem precisa redirecionar a saída para um arquivo >, se estiver interessado apenas em escanear o conteúdo do arquivo no terminal. Você pode apenas correr $ git show 58a3db6:path/to/your/file.txt.

karmi
fonte