같은 브랜치에서 서로 다른 두 커밋 사이에 같은 파일을 어떻게 다른가요?


1143

Git에서 같은 브랜치 (예 : 마스터)에서 두 개의 다른 커밋 (연속적이지 않은) 사이의 동일한 파일을 어떻게 비교할 수 있습니까?

VSS ( Visual SourceSafe ) 또는 TFS ( Team Foundation Server ) 와 같은 비교 기능을 찾고 있습니다. 힘내에서 가능합니까?

답변:


1475

로부터 git-diff맨 :

git diff [--options] <commit> <commit> [--] [<path>...]

예를 들어, 현재와 두 개의 커밋 간의 "main.c"파일의 차이점을 보려면 다음과 같은 세 가지 명령이 있습니다.

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c

43
..그것 (아마 상당히 이전 버전 제외)이 도와 드리겠습니다하지만, 정말 필요가 없습니다. 두 커밋이 매우 멀리 떨어져있는 경우 사용할 SHA1을 사용 git log하거나 gitk찾을 수도 있습니다 . gitk컨텍스트 메뉴에 "diff selected-> this"및 "diff this-> selected"도 있습니다.
Cascabel

17
두 커밋 사이에서 파일 이름을 수정 한 경우에도 작동합니까?
reubenjohn

26
"-"의 목적은 무엇입니까?
user64141

29
@ user64141 --예를 들어, 이름이 -p. 인 파일이있을 때 유용합니다 . 실제로 필요한 경우는 드물지만 스크립트에 사용하는 것이 좋습니다.
Palec

13
참고 : 리포지토리의 루트에 상대적인 경로를 사용해야합니다. 현재 작업 디렉토리에 상대적인 경로가 작동하지 않습니다.
Kevin Wheeler

280

다음과 같이 두 개의 다른 파일에서 두 개의 다른 파일을 비교할 수도 있습니다.

git diff <revision_1>:<file_1> <revision_2>:<file_2>


25
경우처럼 노트는 보이는 것을 <file_1>하고 <file_2>있지 최고 수준의 자식 관리 디렉토리에 현재 디렉토리에있는 사람이 앞에 추가로 가지고, ./유닉스 :<revision_1>:./filename_1
앙드레 HOLZNER

7
<revision> : 생략 할 수 있으므로 아직 커밋되지 않은 파일로 비교할 수 있습니다.
Yaroslav Nikitenko

2
Windows에서는 파일 경로에 '\'가 아닌 '/'를 사용해야합니다.
np8

87

"difftool"을 구성한 경우 사용할 수 있습니다

git difftool revision_1:file_1 revision_2:file_2

예 : 같은 분기에서 마지막 커밋에서 이전 커밋으로 파일 비교 : 프로젝트 루트 폴더에 있다고 가정

$git difftool HEAD:src/main/java/com.xyz.test/MyApp.java HEAD^:src/main/java/com.xyz.test/MyApp.java

~ / .gitconfig 또는 project / .git / config 파일에 다음 항목이 있어야합니다. p4merge를 설치하십시오 [이것은 내가 선호하는 diff and merge 도구입니다]

[merge]
    tool = p4merge
    keepBackup = false
[diff]
    tool = p4merge
    keepBackup = false
[difftool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
[mergetool]
    keepBackup = false
[difftool]
    keepBackup = false
[mergetool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
    cmd = p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"

50

를 확인 하고 두 개의 다른 커밋 $ git logSHA-1 ID를 복사 한 다음 git diff해당 ID로 명령을 실행하십시오 . 예를 들면 다음과 같습니다.

$ git diff (sha-id-one) (sha-id-two)

18
특정 파일의 diff를 원하면 명령 끝에 파일 경로를 추가하십시오.
hBrent

또한 두 커밋이 다른 브랜치에있는 경우 전체 트리 정보를 다운로드하려면 "git pull"을 수행하십시오. 그렇지 않으면 "치명적 : 잘못된 개체"오류가 발생합니다.
user238607

4
git diff (sha-id-one) (sha-id-two) -- filename.ext 파일 이름이 없으면 해당 두 커밋 의 모든 파일의 diff가 나열됩니다 .
SherylHohman

40

커밋별로 두 커밋 사이에서 파일의 모든 변경 사항을 보려면 다음을 수행하십시오.

git log -u $start_commit..$end_commit -- path/to/file


"$ start_commit"및 "$ end_commit"는 무엇입니까? 문자 그대로입니까, 아니면 그렇지 않은 경우 예제를 제공 할 수 있습니까?
피터 Mortensen

그것들은 시작과 끝 수정을 포함하는 쉘 변수이며, 대신 sha1 리터럴 또는 참조가 될 수 있습니다
cxreg

21

다음은 Git log 명령에서 찾은 주어진 파일에 대한 Git diff 명령을 출력하는 Perl 스크립트입니다.

예 :

git log pom.xml | perl gldiff.pl 3 pom.xml

수율 :

git diff 5cc287:pom.xml e8e420:pom.xml
git diff 3aa914:pom.xml 7476e1:pom.xml
git diff 422bfd:pom.xml f92ad8:pom.xml

그런 다음 셸 창 세션에서 잘라내어 붙여 넣을 수 있습니다 /bin/sh.

노트:

  1. 숫자 (이 경우 3)는 인쇄 할 행 수를 지정합니다.
  2. 파일 (이 경우 pom.xml)은 두 위치에서 모두 동의해야합니다 (두 곳에서 동일한 파일을 제공하기 위해 셸 함수로 파일을 감쌀 수 있음) 또는 쉘 스크립트로 바이너리 디렉토리에 넣을 수 있습니다

암호:

# gldiff.pl
use strict;

my $max  = shift;
my $file = shift;

die "not a number" unless $max =~ m/\d+/;
die "not a file"   unless -f $file;

my $count;
my @lines;

while (<>) {
    chomp;
    next unless s/^commit\s+(.*)//;
    my $commit = $1;
    push @lines, sprintf "%s:%s", substr($commit,0,6),$file;
    if (@lines == 2) {
        printf "git diff %s %s\n", @lines;
        @lines = ();
    }
    last if ++$count >= $max *2;
}

14

@mipadi로 지정된 방법으로 둘 이상의 파일로 diff를 만들려면 다음을 수행하십시오.

예를 들어 HEAD및 사이에 차이 master가 있으면 모든 .coffee파일 을 찾을 수 있습니다.

git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`

이렇게하면 your_search_folder/모든 .coffee파일 을 재귀 적으로 검색하여 파일과 master버전을 구분할 수 있습니다.


13

여러 파일이나 디렉토리가 있고 비 연속 커밋을 비교하려면 다음을 수행하십시오.

임시 지점 만들기 ( 이 예에서는 "수정" )

git checkout -b revision

첫 번째 커밋 대상으로 되감기

git reset --hard <commit_target>

관심있는 커밋에 대한 체리 따기

git cherry-pick <commit_interested> ...

diff 적용

git diff <commit-target>^

당신이 할 때

git branch -D revision

2
이 솔루션에 감사드립니다. 내 유스 케이스에 잘 작동했습니다. 내가 업데이트 할 유일한 것은 완료했을 때 분기를 삭제할 수 없다는 것입니다.
Steven Dix

9

Git의 굉장함을 사용하는 또 다른 방법 ...

git difftool HEAD HEAD@{N} /PATH/FILE.ext

이 답변에서 bash와 함께 작동하는 별칭을 정의했습니다.difftool-file = "!git difftool HEAD@{\"$2\"} HEAD \"$1\" #"
blueogive

2

Visual SourceSafe 또는 Team Foundation Server (TFS) 에서 얻을 수있는 것과 같이 Windows에서 간단한 시각적 비교를 원하면 다음을 시도하십시오.

  • 파일 탐색기에서 파일을 마우스 오른쪽 버튼으로 클릭하십시오
  • 'Git History'를 선택하십시오

참고 : Windows 10으로 업그레이드 한 후 Git 컨텍스트 메뉴 옵션이 손실되었습니다. 그러나 명령 창에서 'gitk'또는 'gitk filename'을 사용하여 동일한 결과를 얻을 수 있습니다.

'Git History'(Git 히스토리)를 호출하면 왼쪽 상단 창에 파일 히스토리와 함께 Git GUI 도구가 시작됩니다. 비교할 버전 중 하나를 선택하십시오. 그런 다음 두 번째 버전을 마우스 오른쪽 버튼으로 클릭하고

차이점-> 선택

또는

선택한 Diff->이

왼쪽 하단 창에 색상으로 구분 된 차이점이 나타납니다.


다운 보더에 대한 참고 사항 :이 솔루션은 간단한 솔루션이며 구현하기 쉽고 OP 문제를 해결합니다. OP가 명확하게 사용하는 Windows에서 작동합니다 (문제의 TFS 및 VSS에 대한 참조 참조).
자원
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.