서로 다른 두 지점의 파일을 비교하는 방법은 무엇입니까?


1537

한 지점에서 잘 작동하고 다른 지점에서 깨진 스크립트가 있습니다. 두 버전을 나란히보고 다른 점을보고 싶습니다. 이를 수행 할 수있는 방법이 있습니까?

분명히 하기 위해 비교 도구를 찾고 있지 않습니다 (비욘드 비교 사용). 마스터 버전을 현재 분기 버전과 비교하여 변경된 내용을 확인할 수있는 git diff 명령을 찾고 있습니다. 나는 합병이나 다른 일이 아닙니다. 난 그냥 같은 말을하고 싶어

git diff mybranch/myfile.cs master/myfile.cs

답변:


2208

git diff 두 커밋의 차이점을 보여줄 수 있습니다.

git diff mybranch master -- myfile.cs

또는 동등하게 :

git diff mybranch..master -- myfile.cs

어느 한쪽 인 경우, 후자의 구문을 사용 HEAD이 생략 될 수있다 (예 master..비교 masterHEAD).

당신은 또한 mybranch...master( git diff문서에서 )에 관심이있을 수 있습니다 :

이 양식은 <commit>두 가지 공통 조상에서 시작 하여 두 번째까지 포함 된 분기의 변경 사항을 확인하기위한 것 <commit>입니다. git diff A...B와 같습니다 git diff $(git-merge-base A B) B.

다시 말해,이 방식은 master분기 된 mybranch이후로 변경 사항이 달라 지지만 이후에 새로운 변경 사항은 없습니다 mybranch.


모든 경우에 --파일 이름 앞에 있는 구분 기호는 명령 행 플래그의 끝을 나타냅니다. 인수가 커밋 또는 파일을 참조하는 경우 Git이 혼동하지 않는 한 선택 사항이지만 포함시키는 것은 나쁜 습관이 아닙니다. 몇 가지 예는 https://stackoverflow.com/a/13321491/54249 를 참조 하십시오 .


동일한 인수가 git difftool구성된 경우 동일한 인수를 전달할 수 있습니다 .


44
비교하려는 두 버전 중 어느 것도 작업 트리가 아니면을 사용할 수 있습니다 git diff branch1 branch2 myfile.cs. ( --최대 2 개의 수정 인수 만 취할 수 있으므로 더 이상 필요하지 않아야합니다.)
Cascabel

8
나는 이것의 모든 버전을 시도했지만 아무 일도 일어나지 않습니다. difftool이 구성되어 있습니다 (병합에 효과적 임). bd.ps1이라는 파일이 있습니다. 내가 입력 한 모든 명령 버전은 아무 것도 수행하지 않습니다. 잘못을 저 지르지도 않습니다. WTH!?!?!
Micah

3
@ Micah : 당신은 일반 diff로 시도하고 있습니까? 현재 디렉토리에 상대적인 경로를 올바르게 입력하고 있습니까? (파일이 존재하지 않으면 자동으로 diff를 표시하지 않으며 --. 일반적이고 쉬운 실수를 사용합니다.)
Cascabel

5
표시된 것처럼 파일의 전체 경로를 포함시키지 않으면 나에게 도움이되지 않았습니다 git diff --name-status branch1..branch2(아마도 명백하지만 다른 사람과 같은 문제가있는 경우 언급 할 것이라고 생각했습니다).
hBrent

4
mybranch와 master의 순서도 중요합니다. 첫 번째 분기의 파일은 '-'접두사로 표시되고 두 번째 분기의 파일은 '+'접두사로 표시됩니다.
timbo

414

당신은 이것을 할 수 있습니다 : git diff branch1:path/to/file branch2:path/to/file

difftool을 구성한 경우 다음을 수행 할 수도 있습니다. git difftool branch1:path/to/file branch2:path/to/file

관련 질문 : 시각적 diff 프로그램으로 git diff 출력을 보는 방법


4
콜론을 사용하는 것은 실제로 좋은 방법은 아닙니다. 즉, 트리 객체를 통해 파일을 참조한다는 것을 의미하므로 현재 디렉토리를 기준으로하지 않고 전체 경로를 입력해야합니다.
Cascabel

13
@Jefromi, 이것은 최신 버전에서 변경되었을 수 있지만 적어도 이제는 상대 경로 (예 :)를 사용할 수 있습니다 branch1:./file. 파일이 분기 (예 :) 사이의 별도 위치에있는 경우에도 유용합니다 git diff branch1:old/path/to/file branch2:new/path/to/file.
redbmk

4
@redbmk 예, 2010 년과 지금 사이였습니다. 그래도 두 브랜치에서 동일한 파일이면 다음과 같이 할 필요가 없습니다 git diff branch1 branch2 path/to/file.
Cascabel

3
@ jefromi cool, 나는 그것이 추가 될 때 타임 라인을 확신하지 못했습니다. 그래, 일반적으로 당신이 언급 한 구문을 사용하지만, 팀의 대답은 나에게이 질문을 물어 있었는지 정말 아니더라도, 다른 경로로 파일을 비교하는 방법을 알아낼 도움이
redbmk

1
나는이 아이디어를 좋아하지만 git diff docs 에서이 구문을 작동 시키거나 언급 할 수는 없습니다. 내가 무엇을 놓치고 있습니까? 감사!
yoyo

160

보다 현대적인 구문 :

git diff ..master path/to/file

이중 점 접두사는 "현재 작업 디렉토리에서"까지를 의미합니다. 당신은 또한 말할 수 있습니다 :

  • master..즉, 위의 반대입니다. 이것은와 동일합니다 master.
  • mybranch..master, 현재 작업 트리 이외의 상태를 명시 적으로 참조합니다.
  • v2.0.1..master즉, 태그를 참조합니다.
  • [refspec]..[refspec]기본적으로 git에 대한 코드 상태로 식별 가능한 모든 것.

33

서로 다른 두 가지의 파일을 비교하는 방법에는 여러 가지가 있습니다.

  • 옵션 1 : n 특정 분기에서 다른 특정 분기로 파일을 비교하려는 경우 :

    git diff branch1name branch2name path/to/file
    

    예:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    이 예에서는“mybranch”분기의 파일을“mysecondbranch”분기의 파일과 비교합니다.

  • 옵션 2 : 간단한 방법 :

     git diff branch1:file branch2:file
    

    예:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    이 예는 옵션 1과 유사합니다.

  • 옵션 3 : 현재 작업 디렉토리를 일부 분기와 비교하려는 경우 :

    git diff ..someBranch path/to/file
    

    예:

    git diff ..master myfile.cs
    

    이 예에서는 실제 분기의 파일을 마스터 분기의 파일과 비교합니다.


12

나는 단순히 git diff branch1 branch2 path/to/file

파일 간의 차이점을 확인합니다. 변경 사항은 branch1빨간색으로 표시됩니다. 변경 사항은 branch2녹색입니다.

branch1과거와 branch2미래 라고 가정합니다 . diff에서 분기의 순서를 반대로 바꾸어 이것을 되돌릴 수 있습니다.git diff branch2 branch1


어떤 버전의 git diff가 이것을 할 수 있습니까? 실행중인 버전 (2..9.2.windows.1)에서 지원되지 않는 것 같습니다.
빈스 Bowdren

9

현재 분기에 대해 diff를 만들고 싶다면 생략하고 다음을 사용할 수 있습니다.

git diff $BRANCH -- path/to/file

이렇게하면 현재 분기에서 참조 분기 ( $BRANCH)로 다릅니다 .


5

@dahlbyk가 제안한 답변에 동의합니다. 코드 검토를 위해 diff를 diff 파일에 쓰려면 다음 명령을 사용하십시오.

git diff branch master -- filepath/filename.extension > filename.diff --cached

2

내 경우에는 아래 명령을 사용합니다.

git diff <branch name> -- <path + file name>

이 명령은 두 개의 다른 브랜치에서 동일한 파일을 비교하는 데 도움이 될 수 있습니다


1

가장 좋은 방법 git diff은 다음과 같은 방법으로 사용 하는 것입니다. git diff <source_branch> <target_branch> -- file_path

해당 브랜치의 파일 간 차이를 확인합니다. git 명령 및 작동 방법 에 대한 자세한 내용은이 기사를 참조하십시오 .


1

커밋 해시를 다음과 같이 사용하십시오.

git diff <hash1> <hash2> <filename>

어디 hash1이 될 수있는 어떤 지점에 같은에서 커밋 hash2 .


1

파일을 비교하는 두 가지 시나리오가 있습니다.

시나리오 1 : 원격 지점의 파일 비교 (두 지점 모두 원격 저장소에 있어야 함)

시나리오 2 : 로컬 작업 영역 사본의 로컬 파일을 원격 저장소의 파일 비교하십시오.

논리는 간단합니다. diff에 두 개의 브랜치 이름을 제공하면 항상 원격 브랜치를 비교하고 하나의 브랜치 이름 만 제공하면 로컬 작업 복사본과 원격 리포지토리 (제공 한 이름)를 항상 비교합니다. range를 사용하여 원격 저장소를 제공 할 수 있습니다.

예 : 지점 체크 아웃

git checkout branch1
git diff branch2 [filename]

이 경우 파일 이름을 제공하면 파일 이름의 로컬 사본과 이름이 " branch2 "인 원격 분기를 비교합니다 .

git diff branch1 branch2 [filename]

이 경우 이름이 " branch1 인 원격 분기의 파일 이름을 비교합니다. "과 " branch2 "

git diff ..branch2 [filename]

이 경우에는 " branch1 "과 " branch2 " 라는 원격 브랜치의 파일 이름을 비교 합니다. 위와 동일합니다. 그러나 방금 다른 지점에서 지점을 만든 경우 "마스터"라고 말하고 현재 지점이 원격 저장소에 없으면 원격 지점을 비교합니다. 마스터 "와 원격 " branch2를 비교합니다. "를 합니다.

유용하길 바랍니다.


0

git bash에서 두 파일을 비교하려면 다음 명령을 사용해야합니다.

git diff <Branch name>..master -- Filename.extension   

이 명령은 bash 자체에서 두 파일의 차이점을 보여줍니다.

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