Git diff 커밋 범위에서 더블 도트“..”와 트리플 도트“…”의 차이점은 무엇입니까?


190

다음 명령의 차이점은 무엇입니까?

git diff foo master   # a 
git diff foo..master  # b
git diff foo...master # c

diff 매뉴얼 은 그것에 대해 이야기합니다 :

가지 비교

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. 주제의 팁과 마스터 브랜치 간 변경.
  2. 같은 상기와.
  3. 토픽 브랜치가 시작된 이후 마스터 브랜치에서 발생한 변경 사항.

그러나 완전히 명확하지 않습니다.


질문은 중복 아니지만, 이 응답 쇼 그래픽의 의미 .....git diff그들의 다른 의미에서 git log.
Mark Longair

답변:


335

이미이 이미지를 만들었으므로 ..(dot-dot)와 ...(dot-dot-dot) 의 차이점에 대한 설명 은 본질적으로 manojlds의 답변 과 동일 하지만 다른 대답으로 사용할 가치가 있다고 생각했습니다 .

git diff일반적으로이 명령 ¹은 커밋 그래프에서 정확히 두 점 사이의 트리 상태 차이 만 표시합니다. .....의 표기 git diff의 의미는 다음과 같습니다 :

git diff에 대한 커밋을 지정하는 다른 방법의 그림

다시 말해, git diff foo..bar정확히 동일합니다 git diff foo bar. 모두 당신에게 두 가지의 팁 사이의 차이가 표시됩니다 foobar. 반면 git diff foo...bar에, 두 가지의 "병합 기반"과의 팁 간의 차이점을 보여줍니다 bar. "병합 기반"은 일반적으로 두 가지 분기 사이에 공통으로 적용되는 마지막 커밋이므로이 명령은 작업 bar중에 발생한 모든 변경 사항을 표시 하면서 그 동안 수행 된 모든 내용은 무시 foo합니다.

.....표기법에 대해 알아야 할 모든 것 입니다 git diff. 하나...


... 혼란의 일반적인 소스는 여기에 있다는 것입니다 .....같은 명령을 사용할 때 미묘하게 다른 것을 의미 git log것으로 예상 하나 개 이상의 인수로 커밋의 세트를. (이러한 명령은 모두 git rev-list인수에서 커밋 목록을 구문 분석하는 데 사용 됩니다.)

의 의미 .....위해는 git log다음과 같이 그래픽으로 표시 할 수 있습니다 :

자식 로그에 대한 커밋 범위를 지정하는 다양한 방법의 그림

따라서 git rev-list foo..barbranch bar에없는 분기의 모든 것을 보여줍니다 foo. 한편, git rev-list foo...bar쇼 당신의 하나있는 모든 커밋 foo 또는 bar , 그러나 둘을 . 세 번째 다이어그램은 두 가지를 나열하면 두 가지 중 하나 또는 모두에있는 커밋을 얻는다는 것을 보여줍니다.

글쎄, 어쨌든 약간 혼란스럽고 커밋 그래프 다이어그램이 도움이된다고 생각합니다. :)

¹ 예를 들어 병합 충돌을 해결할 때 git diff3 방향 병합이 표시 되므로 "일반적으로"만 말합니다 .


1
나는 당신의 도표를 좋아합니다. 나도 전에 내 자신을 생각해 내었다 . git diff나중에 만들 다이어그램에 대한 아이디어가 있습니다.

34
누군가 알아 차렸습니까? 의 효과 .....느낌은 반전git diff(비교 git rev-list)!
Robert Siemer

2
당신은 저에게 "그게 당신이 알아야 할 전부 [...]입니다. 그러나 ..."입니다. :-) Git은 비슷한 표기법과 용어가 다른 상황에서 다른 것을 의미하는 이런 것들로 가득합니다. 이것을 명확히 해 주셔서 감사합니다.
ShreevatsaR

rev-list를 언급 해 주셔서 감사합니다. rev-parse를 통해 rev-list가 수행하는 방법을 찾고있는 동안이 질문을 보았습니다.
미친 물리학 자

"즉, git diff foo..bar정확히 동일합니다 git diff foo bar. 둘 다 foo와 bar의 두 가지 끝의 차이점을 보여줍니다." "두 가지 끝의 차이"란 정확히 무엇을 의미합니까?
Asad Moosvi

60

통합 버전 diff vs log 와 함께 .. vs ...

Diff vs Log & .. vs ..


3
색상이 너무 많지 않고 ../ ...작업 과 함께 설정 된 작업을 혼합하지 않은 경우 매우 좋습니다 . 예를 들어 log A...B명령이 교차점 (다이어그램의 흰색 부분) 또는 나머지 AB 공용체 (녹색)를 반환하는지 여부는 명확하지 않습니다. 피연산자가 설정되어 있지 않고 색상이 하나만있는 지점에 더 가깝습니다.
xealits

1
이것이 실제로 diff A..B<—> 이어야합니까 log A...B, 즉 실제로 2 개의 점으로 차이나는가 3 (!) 점의 로그에 해당 합니까? 또는 이미지에 오타가 있습니까? 도트의 색상이 어떻게 코딩되어 있는지 보면 이미지에 오타가있는 것 같습니다. 왼쪽 하단 : , 오른쪽 (?) log A...B이어야합니다 log A..B. 그리고 로그 바로 오른쪽은해야 ...하지 ...
KajMagnus

1
안녕하세요 DolphinDream, 그림 주셔서 감사합니다. 여기에 참조로 사용합니다 : gitlab.com/tortoisegit/tortoisegit/issues/3427#note_227200695
Yue Lin Ho

1
@KajMagnus 실제로 빨강 / 파랑 색상은 diff 또는 log와 상관없이 2 도트와 3 도트를 구별하는 데 사용됩니다. 다이어그램이 맞습니다. 첫 번째 열에서 2 도트의 diff 결과는 3 도트의 로그와 유사하므로 전체 목적 다이어그램으로 시작합니다. 2 개의 점이있는 diff는 분기 지점까지의 수정 점 (커밋 주위의 녹색 버블과 밴 다이어그램의 녹색 부분으로 표시됨)의 코드 변경을 제공하고 3 개의 점이있는 로그는 변경 로그 (커밋 메시지)를 제공합니다. 두 분기점에서 분기점까지 내려갑니다.
DolphinDream

28

git diff foo master foo와 master의 상단 (머리) 커밋 사이의 차이점.

git diff foo..master 같은 일을하는 또 다른 방법.

git diff foo...master 공통 조상과의 차이 (git merge-base foo masterfoo와 master )에서 master의 끝까지 차이가 ​​있습니다. 다시 말해, 마스터 브랜치가 foo와 공통 조상 이후 도입 한 변경 사항 만 표시합니다.

GitHub 의이 예제 는 두 가지를 언제 사용해야하는지 설명합니다.

예를 들어, 'dev'브랜치를 만들고 파일에 함수를 추가 한 경우 'master'브랜치로 돌아가서 README에서 줄을 제거한 후 다음과 같이 실행하십시오.

$ git diff master dev

첫 번째 파일에서 함수가 추가되었고 README에 행이 추가되었음을 알려줍니다. 왜? 브랜치에서 README는 여전히 원래 라인을 가지고 있지만 '마스터'에서는이를 제거했습니다. 따라서 스냅 샷을 직접 비교하는 것은 'dev'가 추가 된 것처럼 보입니다.

당신이 정말로 비교하고 싶은 것은 당신의 브랜치가 분기 된 후 'dev'가 변경된 것입니다. 그렇게하기 위해 Git에는 약간의 속 기법이있다.

$ git diff master...dev

2
git diff foo ... 마스터 브랜치가 foo와 공통 조상이기 때문에 마스터 브랜치가 도입 한 변경 사항
0fnt

@manojlds ok, 그래서 다른 질문입니다 .dev 브랜치에 있고 변경 사항 (함수)을 커밋하고 변경 사항을 원격 dev 브랜치로 푸시하면 눈에 띄는 변경이 기능 또는 함수 및 readme입니까?
David

내가 실수하지 않으면 GitHub의 풀 요청 diff는 트리플 도트를 사용합니다. 맞습니까?
Shaun Luttin

GitHub 예제 페이지에 대한 링크가 끊어졌습니다.
K.-Michael Aye

6
git diff foo master

해당 시점에서 주제와 마스터 지점의 차이점을 보여줍니다.

git diff foo..master

이 시점에서 주제와 마스터 브랜치의 차이점을 보여줍니다.

git diff foo...master

이것은 지점에서 주제가 작성된 시점과 이후의 모든 차이점을 표시합니다.

처음 두 명령은 동일하며 마지막 명령은 diff history에서 더 넓은 시야를 보여줍니다.


1

자식 로그 트리

상단 그림은 하단 그래프 트리와 같습니다.

A0 <- A1 <- A2 <- A3 (master)
   \
    C0 <- C1 (test)

그림은 천 단어의 가치가 있으며 그 차이점 .. ... ^은 다음과 같습니다.

$ git log master..test
# output C0 C1

$ git log ^master test
# output C0 C1

$ git log master…test
# output A1 A2 A3 C0 C1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.