현재 브랜치와 마스터 사이에 Git diff가 있지만 병합되지 않은 마스터 커밋은 포함되지 않습니다.


171

아직 마스터로 병합되지 않은 지점의 모든 변경 내용을 비교하고 싶습니다.

나는 시도했다 :

git diff master
git diff branch..master
git diff branch...master

그러나 이러한 각 경우에 diff에는 아직 내 지점으로 병합되지 않은 마스터의 내용이 포함되어 있습니다.

내 지점에 아직 병합되지 않은 마스터의 변경 사항을 제외하는 지점과 마스터 사이의 차이점을 수행하는 방법이 있습니까?


9
두 번째 버전을 뒤집 으면 원하는 것을 얻을 수 있습니다 git diff master..branch. git diff master..지점에 있으면 단축 할 수 있습니다 . r1..r2구문은 짧은 ^r1 r2수단 "에서 하강하는 것이 나에게 모든 것을 보여 어떤 r2과가에서 접근 할 수 없습니다 r1." git help gitrevisions사용할 수있는 다양한 구문에 대한 정보가 있습니다.
John Szakmeister

1
...구문 에 대해 자세히 읽은 후 답변을 확장했습니다 git diff. @jszakmeister는 귀하의 의견이 잘못되었습니다.에 설명 된 개정 범위는와 아무런 관련이 없기 때문 gitrevisions입니다 git diff. Diff는 히스토리에서 두 점을 비교하며 범위를 사용할 수 없습니다.
Palec

당신이 올바른지. 나는 항상 git diff다른 명령과 다르게 작동한다는 사실을 잊어 버립니다 . :-(
John Szakmeister

비교하기 전에 마스터의 로컬 사본을 업데이트하십시오
joe

답변:


232
git diff `git merge-base master branch`..branch

병합 기준 은에서 branch분기 된 지점 입니다 master.

Git diff는이를위한 특별한 문법을 ​​지원합니다 :

git diff master...branch

당신은 다른 지점을 얻을 것이기 때문에 측면을 교환해서는 안됩니다. 반대 방향이 아닌 branch에서로 변경되어 변경된 내용을 알고 싶습니다 master.

느슨하게 관련됨 :


참고 .....기타 망할 놈의 도구와 같은 의미가없는 구문. 에 지정된 의미와 다릅니다 man gitrevisions.

인용 man git-diff:

  • git diff [--options] <commit> <commit> [--] [<path>…]

    이것은 임의의 두 가지 사이의 변화를보기위한 것 <commit>입니다.

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

    이것은 이전 양식과 동의어입니다. 경우 <commit>한쪽을 생략하고, 그것을 사용하는 것과 동일한 효과를 가질 것이다 HEAD대신한다.

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

    이 양식은 <commit>두 가지 공통 조상에서 시작 하여 두 번째까지 포함 된 분기의 변경 사항을 확인하기위한 것 <commit>입니다. " git diff A...B"는 " "와 같습니다 git diff $(git-merge-base A B) B. 중 하나를 생략하면 대신 <commit>사용하는 것과 같은 효과가 HEAD있습니다.

만약 당신이 이국적인 것을하고 있다면 <commit>, ".."표기법을 사용하는 마지막 두 형식을 제외하고는 위의 설명에서 모든 것이 될 수 있다는 점에 유의해야 합니다 <tree>.

철자법에 대한 자세한 전체 목록 <commit>은의 "사양 수정"섹션을 참조하십시오 gitrevisions[7]. 그러나 "diff"는 범위가 아닌 두 끝점을 비교하는 것이며 범위 표기법 ( " <commit>..<commit>"및 " <commit>...<commit>")은의 "SPECIFYING RANGES"섹션에 정의 된 범위를 의미하지 않습니다 gitrevisions[7].


나에게 $ git diff master...branch제작 한 경우 fatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.-이것은 버전 종속 명령입니까?
Joel Peltonen

사실, 난 그냥 "지사는"지사의 이름이어야합니다 것을 깨달았다, 나는 그것이 현재의 지점에 대한 참조라고 생각
조엘 Peltonen

4
당신 말이 맞아, 내 대답은이라는 지점에 의존한다 branch. 나는 OP가 질문에서 선택한 이름을 고수하기로 결정했습니다. 당신이 현재 분기를 사용하려면, 대신 branchHEAD.
Palec

14
git diff master...브랜치를 지정하지 않도록 사용할 수 있습니다 (현재 브랜치가 사용됨).
VasiliNovikov 2016

1
devel@ChrisGuest 를 체크 아웃 한 후에 원래 명령이 작동합니까 ? 아마도 Git은 체크 아웃하는 동안 원격 지점의 로컬 사본 (일반적으로 origin/devel) 으로 지점을 만들었을 것 입니다. 이 경우 git diff origin/devel...bugfix/API-353-api-allows-database-access-when에는 체크 아웃 이전에도 작동했을 것입니다.
Palec

44

나를 위해 일한 것은 다음과 같습니다.

git diff origin/master...

이것은 현재 선택된 로컬 브랜치와 원격 마스터 브랜치 사이의 변경 사항 만 표시하며 병합 커밋에서 나온 로컬 브랜치의 모든 변경 사항은 무시합니다.


참고로 이러한 변경 사항이 포함 된 커밋에 대한 커밋 참조가 필요한 경우을 사용하십시오 git cherry origin/master.
jaytibann

이것이 예상하지 못한 많은 쓰레기를 보여주는 경우, master아래에서 커밋 세트를 리베이스했을 수 있습니다.
마이클 - 클레이 셔키는 어디

21

John Szakmeister와 VasiliNovikov가 언급했듯이 지점에서 마스터의 관점에서 전체 차이점을 얻는 가장 짧은 명령은 다음과 같습니다.

git diff master...

이것은 로컬 마스터 사본을 사용합니다.

특정 파일을 비교하려면 :

git diff master... filepath

출력 예 :

사용법 예

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