2017-10-12 1 views
2

내 자식 repo에 두 개의 분기가 있습니다. AB에는 공통 조상 인 C이 있습니다. C에서 A 사이의 커밋은 C에서 B으로 커밋 된 스쿼시 된 병합 또는 다른 방법으로 다시 작성된 기록을 포함 할 수 있습니다. 어떻게 결정합니까? git diff으로 해결할 수 있습니까? 비대칭 diff

일반적인 용어로, 나는 C에서 A에 커밋 C에서 B에 커밋의 모든 텍스트 변경 사항이 포함되어 있는지 알고 싶습니다. git diff A BC에서 이 아닌 C에서 B까지 커밋의 모든 변경 사항을보고하기 때문에 내가 원하는 것을 수행하지 않습니다. 나는 단지 C에서 B로 변경된 커밋의 변경 사항이 C에서 A으로 커밋되지 않기를 원한다. 이 문제를 어떻게 해결할 수 있습니까?

답변

1

편집 (질문 당 편집) : 나는 이것을 할 수있는 완전히 신뢰할만한 방법이 없다고 생각합니다. 기본적으로 문제가 CA에 일부 변화가 겹치는 경우 B-C 일부 변경 취소하거나 덮어 쓰거나 그런 경우 왜 일반적으로 알려 C 사이 B - 그것은의 불가능은 diff를 수정겠나이다. 우리가 발산을 부여하고있다

이 같은 그래프를 커밋 :

 a1--a2--...--a_i_max-minus-1--A 
    /
...--C 
     \ 
     b0--...--b_j_max-minus-1--B 

(중 내가 = J 또는 내가 즉, J을, ≠ 아무런 제약이 없다, 여기에 다른 길이있다 하나 또는 다른 것을 의미하는 것은 아닙니다). 여기에 A이라는 커밋은 실제로는 최종 Ai이고, 마찬가지로 B입니다. 사용자는 C-VS-B 일부 K <리터 위해 C-VS-A I, 심지어 K -Vs-A 리터 중 어느 하나에 포함되어 있는지 발견 할. 그게 사실인지 알기 위해 철저히 테스트 할 수는 있지만 비용이 많이들 것입니다. 또한 "논리적으로 사실"이지만 시퀀스의 최종 커밋은 C-vs-B와 완전히 동일하지 않습니다. 병합 충돌을 해결하기 위해 수정되었습니다.

철저한 테스트는 아마도 최대한 근접한 테스트입니다. A i 일련의 커밋에서 커밋 메시지 또는 커밋 노트가 스쿼시 병합에 첨부되도록 작업 흐름 요구 사항을 적용 할 수 있다면 가장 좋을 것입니다. 그런 다음 커밋을 열거하고 각각에 대해 메모를 검사해야합니다 나는 C를 대파 한 결과이다..


이 문제가 잘 형성-에서하지 않는 이상하지 힘내 - 토지 때문에 그런 일이 "A의 변화"로 존재하지에 (원래의 대답은 다음과). A이 브랜치 이름 일 경우 특정 커밋을 지정합니다. 변경 사항을 찾으려면두 개의 커밋과 git diff 커밋해야합니다.브랜치 이름 B에 대해서도 마찬가지다 : 브랜치에 대한 팁 커밋 인 B을 (이전의 커밋과 관련하여) 변경 세트로 바꾸려면 먼저 커밋을 선택해야한다. 일반적으로

, 사람들이 물어 보면, 그들은 특정 셋째을 염두에 커밋 :

  o--o--A <-- BranchA 
     /
...--o--* 
     \ 
      o--o--B <-- BranchB 

이 세 번째 커밋, 표시 여기 *, 두 가지가 일명 '까지 가입 "장소이다 병합베이스.

커밋 *이 비대칭 diff를 생성하기위한 (단일) 세 번째 포인트로 사용하기로 한 커밋이 아닌 경우이 나머지 답변 중 아무 것도 적용되지 않습니다. 그러나 인 경우 병합을 수행 한 다음 병합 결과를 관심있는 분기 팁과 비교하는 것이 좋습니다.

병합 모든 변경 사항의 조합 걸릴 (*에서 A에, 그리고 *에서 B에) 및 병합에 넣어 것입니다 커밋 :

$ git checkout --detach BranchA # doesn't matter which one we use 
$ git merge BranchB 

결과를 (어떤 병합 충돌이없는 경우)에서 하나는 (diffing의)를 비교하여 B 시작하는 경우처럼 이제 볼 수 있습니다

  o--o--A <-- BranchA 
     /  \ 
...--o--*   M <-- HEAD (detached) 
     \  /
      o--o--B <-- BranchB 

* 일등석 A는 속M 대 : 여기 또한 * 일등석 B DIFF으로 기여하지 않은 * 일등석 A DIFF에 의해 기여 변화가 나타

$ git diff HEAD^2 HEAD # or git diff BranchB HEAD 

뭐든지.

마찬가지로, * 일등석 A DIFF에없는 있었다 * 일등석 B DIFF에 의해 기여 변경 표시됩니다 A 커밋에 대해 병합 커밋 비교 :

$ git diff HEAD^1 HEAD 

git show -m를 사용하여 수행 할 수 있습니다 같은 시간에 두 개의 별개 diff를 볼 수 있습니다. 의 경우는 git show입니다.

+0

주셔서 감사합니다. 나는 그것을 전부 소화하고 나가 나가 찾고있는 무엇을하는 경우에 결정하기 위하여 그것을 몇 시간 읽어야한다. 여기에 귀하의 예문에 대한 질문을 다시 말하면서, *에서 A 로의 변화가 *에서 B로 나타나는지 알고 싶습니다. * -to-B에서 도입되었을 수도있는 추가 변경 사항은 신경 쓰지 않습니다. –

+0

그런 경우 merge-vs-B가 비어 있는지 확인하지 않고 도망 갈 수 있습니다. – torek

+0

나는 더 나은 해결책을 찾으려고 아직도 노력 중이다. 나는 내가 찾고있는 것이 더 명확하게되기를 희망하면서 나의 OP를 수정했다. 시간이 있으시면 한번보세요. –