Git에서 하나의 파일을 임의의 버전으로 비교하는 방법은 무엇입니까?


324

pom.xml마스터 분기에서 Git의 임의의 이전 버전 으로 파일을 어떻게 비교할 수 있습니까?

답변:


347

넌 할 수있어:

git diff master~20:pom.xml pom.xml

... 현재를 비교 pom.xml에서 하나에 master최초의 부모를 통해 20 개정 전에. master~20물론 커밋의 오브젝트 이름 (SHA1sum) 또는 개정을 지정하는 다른 많은 방법으로 바꿀 수 있습니다 .

이것은 실제로 pom.xml커밋 된 버전이 아닌 작업 트리 의 이전 버전 과 이전 버전을 비교하는 것 입니다 master. 원하는 경우 대신 다음을 수행 할 수 있습니다.

git diff master~20:pom.xml master:pom.xml

12
이것은 파일에서만 작동하는 것이 아니라 (하위) 디렉토리에서도 작동합니다 git diff <revision>:foo/ HEAD:foo/.

2
또한 윈도우에서 리비전 지정자를 사용하는 경우 디렉토리에 슬래시를 사용해야하거나 git은 해당 리비전에 존재하지 않는 파일 / 디렉토리에 대한 오류를 제공합니다.
Dylan Nissley

1
@DylanNissley 또는 오류가 없으며 diff가 없습니다. 그것이 내가 보는 것입니다. 어쨌든 백 슬래시 대신 슬래시를 사용하는 것에 대한 힌트를 주셔서 감사합니다.
게리 S.

Windows 파일로 나는 디렉토리 변경에 쉽게 그것을 발견 한 후 자식은 diff 마스터 ~ 20 전화 : ./의 pom.xml ./pom.xml
로이드

git의 일부 버전은 <revision>과 <path> 사이에 "-"가 필요합니다
Josh

140
git diff <revision> <path>

예를 들면 다음과 같습니다.

git diff b0d14a4 foobar.txt

파일이 현재 디렉토리에 없으면 버전 1.7.11에서 작동하지 않습니다. 예 : 'git diff f76d078 test / Config'에서 "오류 : 'test / f76d078'에 액세스 할 수 없습니다"
simpleuser

1
@ user1663987은 프로젝트 루트와 관련된 전체 경로를 전달합니다 git diff <revision> root/path/file.

1
test / Config 루트에 상대적입니다 (test는 루트의 하위 디렉토리 임). 그러나 예제 루트 / 경로 / 파일은 루트를 포함하는 것처럼 보입니까?
simpleuser

41

단일 파일의 마지막 커밋 간의 차이점을 보려면 다음을 수행하십시오.

git log -p -1 filename

이것은 당신에게 git 파일의 diff를 줄 것이고, 로컬 파일을 비교하지 않습니다.


2
이것은 아무것도 반환하지 않습니다
Andrei Cristian Prodan

@AndreiCristianProdan 그러면 거기에 변화가 없습니다. -1변경 사항을 얻을 때까지 단계별로 증분 할 수 있습니다 .
카이저

이것은 매우 좋군요. 나는 유용 할 수 있습니다 떠들썩한 기능을 생성 : gitlog () { git log -${3:-p} -${2:-1} $1; } 처럼 사용 : gitlog Rakefilegitlog Rakefile 5하고 gitlog Rakefile 10 s. 첫 번째는 하나의 차이점을 보여줍니다. 두 번째는 다섯 개의 차이점을 보여줍니다. 세 번째는 열을 보여줍니다 --no-patch.
auxbuss

18

마지막 커밋에서 파일에서 변경된 내용을 보려면

git diff HEAD~1 path/to/file.

숫자 (~ 1)를 diff하려는 n 번째 커밋으로 변경할 수 있습니다.


이 답변은 정말 단지 특정 케이스입니다 이 더 일반적인 대답 , HEAD~1대체되어 <revision>이 대답 중복한다.

1
이 작동하지 않습니다! 치명적 : 모호한 인수 'HEAD ~ 1': 작업 트리에없는 알 수없는 개정 또는 경로. 사용 '-'별도의 경로로 수정에서
안드레이 크리스티안 Prodan

이 대답은 간단하고 기능적입니다.
Douglas Frari

6

일반 구문 :

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt

리포지토리의 "FileName.xml"이라는 이름의 모든 파일

"-"와 "**"사이의 공백에 주목하십시오.

질문에 대한 답변 :

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 

항상 git과 마찬가지로 tag / sha1 / "HEAD ^"를 사용하여 커밋을 식별 할 수 있습니다.

우분투에서 git 1.9.1로 테스트했습니다.


6

커밋이 HEAD가 아니면 bash의 중괄호 확장이 특히 유용합니다. 특히 파일 이름이 긴 경우 위의 예는 다음과 같습니다.

git diff master~20:pom.xml master:pom.xml

될 것이다

git diff {master~20,master}:pom.xml

bash로 Brace 확장 에 대해 자세히 알아보십시오 .


6

현재 커밋에 대한 5 커밋을 비교하려면 on master만 수행하면됩니다.

git diff master~5:pom.xml master:pom.xml

또한 해시 번호 커밋을 참조 할 수 있습니다. 예를 들어 해시 번호가 x110bd64인 경우 차이점을 확인하기 위해 다음과 같이 할 수 있습니다.

git diff x110bd64 pom.xml


2
git diff master~20 -- pom.xml

마스터 브랜치에도 있지 않은 경우 작동합니다.


2

그래픽 도구를 사용하는 것이 좋거나 선호하는 경우 다음을 수행 할 수 있습니다.

gitk pom.xml

gitk에서는 커밋을 클릭하고 ( "선택") 다른 커밋을 마우스 오른쪽 버튼으로 클릭하여 원하는 순서에 따라 팝업 메뉴에서 "이 옵션을 선택-> 선택"또는 "선택을 선택->이"를 선택할 수 있습니다.



0

예를 들어 숨김 파일로 단일 파일을 비교해야 할 경우

git diff stash@{0} -- path/to/file

-1

특정 커밋에서 diff를 찾고 명령 줄 대신 github UI를 사용하려는 경우 (예 : 다른 사람들과 연결하려는 경우) 다음을 수행 할 수 있습니다.

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>

예를 들면 다음과 같습니다.

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

커밋의 모든 파일을 탐색 할 수있는 오른쪽 상단의 이전 및 다음 링크를 참고하십시오.

이것은 임의의 두 버전 사이를 비교하지 않고 특정 커밋에만 작동합니다.

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