이전 버전의 파일을 볼 수있는 빠른 Git 명령이 있습니까?


1509

Git에 특정 파일의 특정 버전 을 stdout에 덤프하거나 (또는 ​​in $PAGER또는 in $EDITOR) 명령이 있습니까?



이진 파일의 이전 버전 (예 : 이미지)을 확인하고 싶기 때문에이 질문에 도달 한 경우 이전 커밋을 체크 아웃하고 확인해야 할 사항을 확인한 다음 HEAD로 돌아 오는 것이 좋습니다. 이를 위해 git checkout <sha1-of-the-commit-you-need>, 이후git checkout HEAD
Homero Esmeraldo

답변:


1730

git show저장소 루트의 경로 ( ./또는 ../상대 경로) 와 함께 사용할 수 있습니다 .

$ git show REVISION:path/to/file

REVISION실제 수정 버전으로 대체하십시오 (Git 커밋 SHA, 태그 이름, 브랜치 이름, 상대 커밋 이름 또는 Git에서 커밋을 식별하는 다른 방법 일 수 있음)

예를 들어, <repository-root>/src/main.c4 커밋 전에 파일 버전을 보려면 다음을 사용하십시오.

$ git show HEAD~4:src/main.c

Windows 용 Git 은 현재 디렉토리에 상대적인 경로에서도 슬래시 가 필요합니다 . 자세한 내용은 설명서 페이지를 참조하십시오 git-show.


5
실제로 작동하지 않는 것 같습니다. 사용해 보셨습니까? "git show HEAD : path / to / file.c"의 경우 "모호한 인수"오류가 발생합니다.
mike

2
망할 놈의 repo의 상단에서, 전체 경로이어야한다
richq

20
당신이 창문에 있다면, 그것은 경로 분리기 일 것입니다; git show HEAD : dir \ subdir \ file을 수행하면 모호한 인수가 발생합니다. git show HEAD : dir / subdir / file을 수행하면 예상대로 작동합니다.
Matt McMinn

12
: 다음에 제공해야하는 경로는 git 저장소의 루트에서 온 것입니다. (이것은 답변으로 아래에 주어졌지만이 답변에 대한 의견으로 생각되었다고 생각합니다)
MatrixFrog

9
Vim 분할에서 함께 스크롤하여 보려면 스크롤 하는 방법을 보여주는 간단한 블로그 게시물 을 작성 했습니다.
Flaviu

257

날짜별로이 작업을 수행하면 다음과 같습니다.

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt

주의 HEAD@{2013-02-25}(사용이 저장소에서 "HEAD가 2013년 2월 25일에 있었다"수단 reflog가 ) 없습니다 "지난 역사에서이 지점에 2013년 2월 25일 전에 커밋".


5
대박. github에 가지 않고 커밋을 보는 대신 내 시간을 절약합니다.
Fizer Khan

파일 경로의 "점"이 내 문제였습니다. 감사!
tomascharad

5
이 명령은 지사에있는 경우에 master대신 유용합니다HEAD@{2013-02-25}
funroll

1
시간을 포함 할 수 있습니까 git log --since='2016-04-28 23:59:59 +0100'?
dumbledad

7
이 구문이 reflog를 사용한다는 사실은 중요하며 reflog에 모든 커밋이 포함되어 있지 않기 때문에 강조해야합니다 . 참조 blog.endpoint.com/2014/05/git-checkout-at-specific-date.html
앨리스 히튼에게

113

GUI가 마음에 들면 gitk를 사용할 수 있습니다.

  1. 다음과 같이 gitk를 시작하십시오 :

    gitk /path/to/file
    
  2. 설명이나 날짜 등 화면 상단에서 수정본을 선택하십시오. 기본적으로 화면 하단에는 해당 "버전"의 차이가 표시됩니다 ( "패치"라디오 버튼에 해당).

  3. 선택한 개정판의 파일을 보려면

    • "트리"라디오 버튼을 클릭하십시오. 해당 개정판에서 파일 트리의 루트가 표시됩니다.
    • 파일로 드릴 다운하십시오.

7
이것은 또한 tig repo 뷰어 인 tig 와도 작동합니다 .
Matthew G

1
@Paul Slocum :이 명령은 내장 명령이 아닌 일반적인 명령이 아니기 때문일 수 있습니다. 이 명령은 Windows에서만 작동한다고 생각합니다.
Envil

이것은 git 저장소의 루트에서 시작한 경우에만 작동하는 것 같습니다.
Marc

gitk를 사용하여 특정 개정판을 확인하려면이 단축키를 사용할 수도 있습니다 gitk REVISION /path/to/file. 예를 들어 특정 버전을 확인하려는 경우에 유용 할 수 있습니다.
Christian.D

89

명령 으로 commit hash(종종이라고도 함 commit ID)을 지정할 수도 있습니다 .git show


간단히 말해서

git show <commitHash>:/path/to/file


단계별

  1. 주어진 파일에 대한 모든 변경 사항의 로그를 git log /path/to/file
  2. 도시 변화의 목록에서, 상기 표시 commit hashcommit 06c98...(06c98 ... (가) 해시 커밋 임)
  3. 복사 commit hash
  4. 3 단계 및 1 단계를 git show <commitHash>:/path/to/file사용 하여 명령 을 실행하십시오 .commit hashpath/to/file

참고 :./ 상대 경로를 지정할 때를 추가하는 것이 중요 git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html합니다.


1
파일 경로를 모르는 경우 사용 git show <SHA1> --name-only하여 가져옵니다.
Tiina

이 명령 op-심지어 메모리에서 자동 완성-삭제 된 디렉토리에서 테스트 ... 그 gg보다 더 많은 op를 얻을 수 없음
treyBake

43

Jim Hunziker 의 답변 외에도

수정본에서 파일을 다음과 같이 내보낼 수 있습니다.

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt

도움이 되었기를 바랍니다 :)


23

파일의 이전 버전과의 차이점을 빠르게 보려면 :

git show -1 filename.txt > 파일의 마지막 개정과 비교

git show -2 filename.txt > 마지막 개정과 비교

git show -3 fielname.txt > 마지막 3 번째 개정과 비교


18
해당 명령은 현재 버전과의 차이점을 보여 주지만 전체 파일을 표시하지는 않습니다.
Jean Paul

18

git log -p커밋 로그뿐만 아니라 각 커밋의 차이점을 보여줍니다 (병합 커밋 제외). 그런 /다음를 누르고 파일 이름을 입력 한 후를 누르십시오 enter. 를 눌러 n또는 p이전 / 다음 발생으로 이동합니다. 이렇게하면 파일의 변경 사항뿐만 아니라 커밋 정보도 볼 수 있습니다.


3
git log -pm병합 커밋도 표시하는 것 같습니다 .
sanbor

2
git log -p -- filename.txt기록을 원하는 파일로만 제한하기 위해 실행할 수도 있습니다 .
Jean Paul

3

다음과 같은 스크립트를 사용하여 파일의 모든 버전을 별도의 파일로 덤프 할 수 있습니다.

예 :

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

다른 유사한 질문에 대한 답변으로 여기스크립트를 작성하십시오.


1
git_root, git_log_shortgit_log_message_for_commit누락되었습니다.
mogsie

잘 잡아! 나는이 답변을 두 개의 다른 지점에 두 번 게시 하고이 것을 제거하고 다른 하나와 연결하여 사람들이 전에 이것에 대해 말한 곳과 연결되었습니다 ... 감사합니다 @mogsie!
Brad Parks

이 스크립트는 매우 유용합니다!
XMAN

3

방법 1 : (나는이 방법을 선호한다)

  1. 다음을 사용 하여 커밋 ID 를 찾으십시오 .git reflog
  2. 커밋에서 파일 목록 git diff-tree --no-commit-id --name-only -r <commitHash>

예 : git diff-tree --no-commit-id --name-only -r d2f9ba4// "d2f9ba4"는 "1"의 커밋 ID입니다.

  1. 명령으로 필요한 파일을여십시오.

git show <commitHash>:/path/to/file

예 : git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift// "Src / ..."는 "2"의 파일 경로입니다.

방법 2 :

  1. 다음을 사용 하여 커밋 ID 를 찾으십시오 .git reflog
  2. 이 커밋으로 강제 재설정하십시오. git reset --hard %commit ID%

git reset-하드 c14809fa

  1. 불필요한 변경을 수행하고 필요한 분기에 새로 커밋하십시오. :)

0

주어진 개정판에서 여러 파일을 가져 오는 도우미

병합 충돌을 해결하려고 할 때이 도우미는 매우 유용합니다.

#!/usr/bin/env python3

import argparse
import os
import subprocess

parser = argparse.ArgumentParser()
parser.add_argument('revision')
parser.add_argument('files', nargs='+')
args = parser.parse_args()
toplevel = subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).rstrip().decode()
for path in args.files:
    file_relative = os.path.relpath(os.path.abspath(path), toplevel)
    base, ext = os.path.splitext(path)
    new_path = base + '.old' + ext
    with open(new_path, 'w') as f:
        subprocess.call(['git', 'show', '{}:./{}'.format(args.revision, path)], stdout=f)

GitHub의 상류 .

용법:

git-show-save other-branch file1.c path/to/file2.cpp

결과 : 다음은 파일의 대체 버전을 포함합니다.

file1.old.c
path/to/file2.old.cpp

이런 식으로 파일 확장자를 유지하여 편집기가 불평하지 않도록하고 새로운 파일 바로 옆에있는 기존 파일을 쉽게 찾을 수 있습니다.


@MickeyPerlstein 더 나은 구현으로 동일한 인터페이스를 만들 수 있다면 나는 모두 귀합니다.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

어쩌면 나는 이해하지 못하고 (그렇다면 내 사과) 사과하지 않습니다 : "git show version : ./ path> new_path"?
미키 펄 스테인

@MickeyPerlstein 안녕, 예, 내 명령은 CLI를 생성하지만 여러 파일을 반복하고 입력에서 출력 이름을 생성하므로 너무 많이 입력하지 않아도됩니다. 물론 혁명적 인 것은 없지만 편리합니다.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.