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


답변:


251

log명령을 사용하는지 또는 명령을 사용하는지에 따라 다릅니다 diff. 이 log경우 man git-rev-parse문서에 있습니다.

커밋에서 도달 가능한 커밋을 제외하기 위해 접두사 ^ 표기법이 사용됩니다. 예를 들어 ^ r1 r2는 r2에서 도달 가능한 커밋을 의미하지만 r1에서 도달 가능한 커밋은 제외합니다.

이 설정 작업은 너무 자주 표시되어 속기가 있습니다. 두 개의 커밋 r1과 r2가있는 경우 (위의 스펙 수정에 설명 된 구문에 따라 이름이 지정됨), "^ r1 r2"에 의해 r1에서 도달 할 수있는 커밋을 제외하고 r2에서 도달 할 수있는 커밋을 요청할 수 있습니다. "r1..r2".

비슷한 표기법 "r1 ... r2"를 r1과 r2의 대칭 차이라고하며 "r1 r2-$ (git merge-base --all r1 r2)"가 아닌 것으로 정의합니다. r1 또는 r2 중 하나에서 도달 할 수 있지만 둘 다에서 도달 할 수없는 커밋 세트입니다.

이것은 기본적으로 두 가지 중 하나에 있지만 두 가지 모두에있는 모든 커밋을 얻음을 의미합니다.

diff경우 man git-diff문서에 있습니다.

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

      This form is to view the changes on the branch containing and up to
      the second <commit>, starting at a common ancestor of both
      <commit>. "git diff A...B" is equivalent to "git diff
      $(git-merge-base A B) B". You can omit any one of <commit>, which
      has the same effect as using HEAD instead.

약간 퍼지입니다. 기본적으로 그것은 다른 브랜치와 비교하여 해당 브랜치의 차이점 만 표시한다는 것을 의미합니다. 첫 번째 커밋을 가진 마지막 커밋을 찾은 다음 두 번째 커밋을 차이점과 비교합니다. 이 브랜치의 변경 사항 만 통지하지 않고이 브랜치와 비교하여 해당 브랜치의 변경 내용을 쉽게 확인할 수 있습니다.

이 방법 ..은 다소 간단합니다.이 git-diff경우 a git diff A B와 동일하고 A와 B를 비교합니다.이 log경우 B에는 있지만 A에는없는 모든 커밋이 표시됩니다.


31
그것은의 의미를 어떻게 꽤 말도 안 ..하고 ...정확하게 로그와 DIFF에 대한 교환한다 : log A..B무엇이고 B에 병합베이스에서 변화 diff A...B하지
phiresky

1
@ phiresky 그래, 그건 실용성이 좋지 않다. 에 점 표기법을 사용하지 않는 것이 좋습니다 git diff.
wisbucky

2
이것이 A...B== 의미합니까 A..B + B..A?
Danon

2
대한 @Danon git log이 절대적으로 그렇다
maoizm

659

힘내 로그와 커밋 범위 사용

이 같은 범위 커밋 사용할 때 .....와를 git log, 그들 사이의 차이는 지점 A와 B에 대한, 즉이다

git log A..B

B에 A에없는 커밋이 모두 표시 되지만

git log A...B

당신에게 보여줍니다 모두 B는 A가없는 것을, 또는 다른 말로 것을는 A가 가지고있는 커밋 것을 B가 가지고 있지 않으며, 커밋 이 커밋을 모두 걸러을하는 A와 B의 주 모두, 따라서 공유 하지 않는 커밋 만 표시합니다 .

벤 다이어그램 및 커밋 트리를 사용한 시각화

의 시각적 표현은 다음과 같습니다 git log A..B. A에 존재하지 않는 브랜치 B에 포함 된 커밋은 커밋 범위에 의해 반환되는 것이며, 벤 다이어그램에서 빨간색으로 강조 표시되고 커밋 트리에서 파란색 원으로 표시됩니다.

 "git log A..B"다이어그램나무 1

에 대한 다이어그램입니다 git log A...B. 두 분기에서 공유 하는 커밋은 다음 명령으로 반환되지 않습니다.

 "git log A ... B"다이어그램나무 2

트리플 도트 커밋 범위를 ...더욱 유용하게 만들기

옵션을 ...사용하여 --left-right어느 커밋이 어느 브랜치에 속하는지 보여 줌으로써 로그 명령에서 트리플 도트 커밋 범위를 더욱 유용 하게 만들 수 있습니다 .

$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt

위의 출력에서에 속하는 커밋 master은 접두사가 붙고 <,에 속하는 커밋 origin/master은 접두사가 붙는 것을 볼 수 있습니다 >.

Git Diff와 함께 커밋 범위 사용

언젠가 커밋 범위가 어떻게 작동하는지에 대한 내 자신의 설명을 추가 git diff할 수는 있지만 지금 은 Git diff commit에서 더블 도트 ".."와 트리플 도트 "..."의 차이점 을 확인하고 싶을 수도 있습니다 . 범위? .

또한보십시오


35
이 답변은 실제로 간결한 텍스트, 예제 및 그림으로 차이점을 설명합니다. 나는 명확하지 않은 문서를 인용하는 현재 가장 많이 투표 된 답변보다 훨씬 낫습니다. (tl; dr이 답변 덕분에 나는 실제로 차이점을 이해합니다.)
aerique

4
@ 컵케익 git diff에서 의미를 추가 할 수 있습니까?
Marius

1
@Marius 실제로, 지금 당신이 그것을 가져 왔으므로, 나는 당신과 같은 미래 독자들을 위해 내 대답에서 다른 질문에 링크 할 것입니다.

2
이것은 실제로 반대가 아닌가? dig diff a..b는 모든 diff이거나 기본적으로 git diff a b와 동일합니다. git dif a ... b는 a에서 분기 한 이후 b 만 변경 한 것입니다.
wejrowski

2
적어도 git log의 경우. git diff의 경우 상황이 바뀔 수 있습니다. stackoverflow.com/questions/7251477/…
Benjamin Atkin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.