2014-09-24 2 views
1

자식 분기가있는 부모 분기 A가 있습니다. 분기 B에는 두 개의 별도 커밋이 있습니다. 유엔 합병으로자식을 병합 한 후 분기를 --squash와 병합

git log A..B 

그것은 지점 B에서 모두 커밋을 보여줍니다 난 지점 B와 지점 A를 비교할 때 나는이

git merge --squash B 

처럼 스쿼시와에서 지점 B를 합병했다. 어떻게 부모 지점 A의 으스러진 커밋과 비교할 수 있습니까? 이 가지 모두 사이의 응답

감사합니다 인용

답변

3

을 차이를 얻을 수 있도록 git merge documentation--squash 의미 : 실제 병합이 일어난 것처럼

제외 (작업 트리와 인덱스 상태를 생산 병합 정보의 경우) 실제로 커밋하거나 HEAD을 이동하거나 $GIT_DIR/MERGE_HEAD을 녹음하여 다음 git commit 명령이 병합 커밋을 만들지 않도록하십시오. 이렇게하면 다른 브랜치 (또는 문어의 경우 더 많이)를 병합하는 것과 동일한 효과를 가지는 현재 브랜치 위에 단일 커밋을 생성 할 수 있습니다.

즉, 결과가 git commit이면 정규 커밋이 있고 병합 커밋이 아닙니다. 트리이 일반적인 커밋과 관련이 있습니다. 작업 디렉토리에서 확인한 경우 병합을 수행하여 얻은 트리와 일치하지만 실제 병합은 기록되지 않습니다.

당신이 설명 설정을 감안할 때, 당신은 git merge --squash B을 실행하기 전에이 있었다 : 당신의 그래프를 저지로

...- o   <-- A 
     \ 
     o - o <-- B 

합니다. git checkout A; git merge --squash B; git commit -m squash-B 후 당신은 지금이 : 최신 사이

...- o ----- * <-- HEAD=A 
     \ 
     o - o  <-- B 

주 없음이 있음을 커밋 그래프의 연결 지점 B에만있는 두 커밋 * 및 하나를 커밋합니다. *를 저지하기위한 트리는 정기적 병합을 수행하여 얻었을 것이다 것과 동일하지만 커밋 그래프는 다른 : 실제 병합이 닮은 것 :

...- o ----- * 
     \ /
     o - o 

(나는 왼쪽으로 이 레이블은 여기에 실제로있는 것과 다르다는 것을 강조하기 위해 레이블을 붙입니다).


도트 도트 표기법 A..B는 "B에서 도달 커밋, 마이너스 A에서 도달 커밋"을 요청합니다.그래프는 다음과 같이 (상기 일부와 같은 단지 명확성을 위해 여기서 반복) 같다 : 하부 따라

...- o ----- * <-- HEAD=A 
     \ 
     o - o  <-- B 

o 커밋 상부 o 및 이전 커밋 함께 B로부터 도달이다; 위의 o과 그 이전 커밋은 이라고 표시된 커밋에서 시작하여 뒤로 작업 할 수 있기 때문에 A에서 접근 할 수 있으므로 제외됩니다. 그 결과 두 개의 o 커밋을 남겨 둡니다. 즉, 분기 끝의 애트룹 B과 그 전의 커밋이 있습니다.

실제 병합을 수행 한 경우 지점 B의 팁에서 도달 가능한 모든 커미트에도 A 분기의 팁에서 도달 할 수 있으므로 A..B은 비어 있습니다. (그리고 반대로, 즉 B에서 A 아니라에서 연결할 것 커밋 이후 B..A*를 저지 할 것이다 그러나 이것은뿐만 아니라 노 실제 병합 스쿼시 전용 역사를 가진 사실이다.)

+0

가 어떤인가 저주받은 커밋 만 얻는 방법? – Arif

+0

아니요. 여기서 중요한 점은'git merge --squash' *는 병합 커밋 *을하지 않는다는 것입니다 (커밋을 전혀하지 않습니다!). 따라서 커밋 된 커밋과 후속 수동 커밋을 구분할 수 없습니다 . (위와 같은 커밋에 특별한 커밋 메시지 문자열을 지정하고 자신의 특수 문자열을 검색 할 수는 있지만 커밋을 찾기 위해 미리 정의 된 프로토콜을 준수해야합니다.) – torek

+0

torek : 좋습니다, 감사합니다. – Arif

관련 문제