새로운 이름으로 파일의 이전 버전을 git-checkout


264

main.cpp편집기에 " " 파일이 열려 있습니다.

main.cpp편집기에서도 이전 버전의 " "을 ( 를)보고 싶습니다 .

내가 지금하는 방식은 이렇습니다.

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

단순화 할 수 있으므로 편집기에서 "main.cpp"를 닫을 필요가 없습니까?

내가 기대하는 것은 git-checkout이것을 할 수 있는 변형입니다 .


업데이트 : Mac OSX 10.5.7에서 git을 사용하는 메신저

prompt> git --version
git version 1.6.0.4
prompt> 

업데이트 2 : Jakub Narębski 답변은 다음과 같습니다

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

업데이트 3 : 특정 개정에 대한 Karmi의 답변 :

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 

어떤 편집기를 사용하십니까? 아마도 Git에 대한 지원을 추가하는 플러그인 / addon / 모듈이 있습니까?
Jakub Narębski

나는 텍스트 메이트를 사용합니다. 그것은 git 지원을 가지고 있지만, 할 수 있는지 확인하지는 않았습니다.
neoneye

Textmate에는 git 번들이 있습니다 : github.com/timcharper/git-tmbundle (git wiki의 InterfacesFrontendsAndTools 페이지를 확인해야합니다 : git.or.cz/gitwiki )
Jakub Narębski

그런데 Emacs의 VC 인터페이스 (Git도 vc-git.el 형식으로 지원)에는 'Show Other Version'명령이 있습니다. TexMate Git 번들 (git-tmbundle)에없는 경우 추가해야합니다.
Jakub Narębski

TextMate에서 프로젝트를 더 잘 추적하기 위해 심볼릭 링크를 사용합니다. 25 개 디렉토리, 300 개 파일 이것은 builddirs 및 기타 관련없는 디렉토리를 숨기는 데 도움이됩니다. 그러나 git / TextMate는 이러한 심볼릭 링크에 대해 너무 행복하지 않으므로 :-(
neoneye

답변:


312

"git show"를 사용할 수 있습니다 :

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

( 와 :사이에 콜론 [ ] 문자 가 있음에 유의하십시오 .) 구문은 "버전 지정"섹션의 마지막 지점 옆에 있는 git rev-parse 맨 페이지에 설명되어 있습니다.HEAD^main.cpp<revision>:<path>

  • <rev> : <path>, 예 : HEAD : README, : README, master : ./ README

    접미사 :다음에 경로가 오는 경우 콜론 앞 부분에 의해 명명 된 tree-ish 객체의 지정된 경로에서 BLOB 또는 트리 이름이 지정됩니다. :path(콜론 앞에 빈 부분이있는)은 다음에 설명되는 구문의 특별한 경우입니다. 주어진 경로에서 색인에 기록 된 내용입니다.

    현재 작업 디렉토리 로 시작 ./하거나 ../현재 경로 입니다. 주어진 경로는 작업 트리의 루트 디렉토리를 기준으로 변환됩니다. 이것은 작업 트리와 동일한 트리 구조를 가진 커밋 또는 트리에서 Blob 또는 트리를 처리하는 데 가장 유용합니다.

참고 <path>여기 FULL 받는 상대 경로 상위 디렉토리 프로젝트의와 예 디렉토리 .git/디렉토리. (또는 " <revision> "에 더 정확해야합니다 (일반적으로 <tree-ish> 일 수 있습니다 (예 : 트리를 나타내는 것)).

현재 디렉토리에 상대적인 경로를 사용하려면 ./<path>구문 을 사용 하거나 ../path현재 디렉토리에서 위로 올라 가야합니다.

2015-01-15 편집 : 상대 경로 구문에 대한 정보 추가


대부분의 경우 저수준 (배관) git cat-file명령을 사용하여 동일한 출력을 얻을 수 있습니다 .

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp

3
나는 전체 사본에 관심이 있지만 git-show는 차이점 만 보여줍니다. --pretty 옵션으로 놀아 보았습니다 .. prompt> git show --pretty = fuller HEAD ^ main.cpp 해결하지 못했습니다.
neoneye

7
"git show HEAD ^ main.cpp"(HEAD ^와 main.cpp 사이에 공백이 있음)는 "git show HEAD ^ : main.cpp"( HEAD ^와 main.cpp 사이에 콜론 ':')와 다릅니다.
Jakub Narębski

흠, 콜론이 있으면이 오류가 표시되므로 콜론이 실수라고 생각했습니다. 예, 콜론이 갈 길처럼 보이지만 어떻게 해결할 수 있습니까? prompt> git show HEAD ^ : main.cpp 치명적 : 모호한 인수 'HEAD ^ : main.cpp': 알 수없는 개정 또는 경로가 작업 트리에 없습니다. 수정 프롬프트에서 경로를 구분하려면 '-'를 사용하십시오.>
neoneye

2
아마도 잘못된 PATHNAME을 지정했음을 의미합니다 (불행히도 "git show"때문에 매직 git은 더 나은 오류 메시지를 표시 할 수 없습니다). 프로젝트의 최상위 디렉토리에 상대적인 전체 경로 이름이어야합니다. $ (git ls-tree -r --name-only HEAD ^ | grep main.cpp)
Jakub Narębski

3
문서에서 전체 경로 대신 "./ 또는 ../로 시작하는 경로는 현재 작업 디렉토리와 관련이 있습니다." 내 1.8.5 버전에서 작동합니다.
LVB

24

Jakub의 답변에 추가하기 만하면 >터미널의 파일 내용을 감추고 싶은 경우 출력을 파일로 리디렉션 할 필요조차 없습니다 . 당신은 그냥 실행할 수 있습니다 $ git show 58a3db6:path/to/your/file.txt.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.