2013-03-29 1 views
2

커밋 병합에 지점 토폴로지를 유지 :힘내 : 나는 힘내 다음 시나리오에서 병합에 대해 묻고 싶다

branchA -*-*-*-*-* 
        \ 
      branchB *-*-*-* 

그것은 자식이 경우 병합 다음과 같은 결과를 얻을 할 수 있습니까? 내가 얻을 싶습니다 어떤

branchA -*-*-*-*-*---------* 
        \  /
      branchB *-*-*-* 

는 하나의 병합 branchB에서 모든 변경 사항을 통합 branchA에 커밋하는 것입니다. git merge 명령에 --squash 옵션이 있다는 것을 알고 있지만 표준 병합과 100 % 동일한 지 여부는 확실하지 않았습니다.

따라서 내 지류 토폴로지를 방지하고 이 아니라면은 앞으로 빨리 감기 만 할 수 있습니다.

도움을 위해 미리 감사드립니다.

+0

왜 그렇게하고 싶습니까? 무엇을 성취하려고합니까? –

+0

필자의 동기는 다음과 같다. branchA는 일종의 mainline branch이고 branchB는 개발 branch이다. branchB에 대한 커밋 중 일부는 컴파일/전달 테스트 스위트가 아닐 수도 있지만 결국에는 branchB가 mainline으로 갈 준비가되었습니다. 나는 그것이 완료된 작업을 나타내는 동시에 branchB (필요한 경우)에 대한 내역을 볼 수 있기 때문에 메인 라인에서 하나의 커밋을하고 싶습니다. – Tomek

답변

3

시도 git merge branchb --no-ff (brancha).

git-merge(1)에서 --no-FF

병합은 빨리 감기로 해결하는 경우에도 병합 커밋 만듭니다. 자식이 현재 HEAD (지점 A, 당신이 양식을 병합 될 곳이기 때문에이) 지점 B에 커밋의 조상하지만 아무것도 없다는 것을 알게 될 때

그것은했다 변경하지 않고, 심지어 빨리 감기를 방지

+1

그게 내가 찾고 있던 바로 그거야. 대단히 감사합니다. – Tomek

1

아니요, 분기의 모든 변경 사항을 통합하는 실제 병합 커밋을 생성 할 수 없습니다. git merge --squash은 변경 사항과 함께 단일 커밋을 생성하지만 병합 커밋이 아닙니다.

Git 커밋은 이전 커밋의 변경 사항이 아니라 지정된 시간에 저장소의 전체 상태를 기록합니다. 따라서 차이점은 나중에 커밋이 만들어지지 않을 때 이력을 조사 할 때 생성됩니다.

그러나 git commit --no-ff branchB을 사용하면 새 커밋을 만들지 않고 빨리 감기 병합을 수행 할 수있을지라도 커밋이 만들어 지도록 병합을 만듭니다. 그런 다음 git log -m --first-parent을 사용하면 branchB에서 수행 된 커밋을 무시하고 해당 병합 커밋에 의해 모든 변경 사항이 도입 된 것으로 나타나고 -m 옵션을 사용하면 병합 커밋에 전체 diff가 표시됩니다 (diff가있는 경우). 그렇지 않으면 표시됨).

+0

답장을 보내 주셔서 감사합니다! 나는 git merge branchB를 시도했다. --no-ff이고, 내가 찾던 바로 그 것이다. 다시 한번 감사드립니다. – Tomek