2010-12-28 5 views
8

한 커밋은 두 커밋을 가지며 한 커밋은 다른 커밋의 조상입니다. (그들은 지점의 시작과 끝 지점이 될 수 있습니다. 나는 중요하다고 생각하지는 않지만, 그렇다면 그것을 포함 할 것입니다).git에서 두 개의 커밋에 대한 병합되지 않은 차이 표시

두 커밋 사이의 차이점을보고 싶지만 은 두 커밋 사이에 만들어진 병합 커밋 (즉, 둘 이상의 부모가있는 커밋) 중에 변경된 내용을 제외하고입니다. (기본적으로, 병합을 제외하고 지점에 만들어진 "진짜"커밋을 원합니다.)

이것이 가능합니까? 그렇다면 어떻게 이것을 성취합니까?

필요한 경우 병합 커밋 중에 해결 된 충돌이 없다고 가정하고 우아하게 처리 할 수있는 솔루션의 보너스 포인트를 가정합니다.

+0

분명히 : 병합 커밋이 아닌 각 커밋에 대해 개별 diff를 원하십니까? 아니면 다른 것이 있습니까? –

+0

@Autocracy : 나는 그것을 편집했고 내가 바라는 것을 명확히 밝히기를 바란다. 아직도 이해가되지 않으면 알려주세요. –

답변

7

귀하의 질문에 약간 모호하지만 나는 이것을 원한다고 생각합니다.

git log --no-merges -p branch-start..branch-end 
+0

대신에 --first-parent를 선호 할 수도 있습니다. –

+1

-p는 --no-merges와 결합 된 티켓입니다. 감사! –

+0

캐쉬 된/현재 (커밋되지 않은)에 대해 이것을 할 수 없다 (범위를 생성하는 것) ...'diff ($ git merge-base branchA currentbranch)'로 전체 diff를 얻을 수있다. S! –

2

나는 --no-병합 -o 옵션을 몰랐다하지만 여기에 또 다른 솔루션 (I는 병합 마스터에서 수행되어 있다고 가정) :

git checkout -b temp 
git rebase --onto master branch-start branch-end 
git diff master 
2

당신의 병합 모두에서 제공된 경우 동일한 지점 (예 : master) 또는 다른 지점에 모두 포함 된 경우 this question에서 solution을 사용할 수 있습니다.

  x---y-+-z-+-branch 
     / //
---a---b---c-+-d-+-e---master 

을하고 비교하려는 두 커밋 bbranch 같습니다

당신은 다음과 같은 나무는 한 가정. 그리고 대신 master (c,d,e의 병합)에 또한 모든 것을 제외 분기 (x,y,z)에서 수행 모든 변경 사항을 표시합니다

git diff master...branch 

를 실행, 직접 두 커밋을 비교. 이것은 또한 아직 브랜치에 있지 않은 마스터에서 수행 된 모든 변경 사항을 무시합니다. - ...]가

이러한 형식 함유 지점의 변화를 볼 수 있고, []

자식 DIFF는 [--options] ... 커밋 커밋 워드 프로세서

두 번째 커밋까지, 공통 조상 인 커밋에서 시작합니다. "git diff A ... B"는 "git diff $ (git-merge-base A B) B"와 동일합니다.

관련 문제