SW/Git

squash : pull request을 병합하는 완전히 새로운 방법 : 개념

얇은생각 2019. 10. 10. 07:30
반응형
저장소를 깔끔하게 유지하는 것을 좋아하는 개발자 유형이신가요? 인터랙티브 리베이스의 팬이며 커밋이 제대로 될 때까지 커밋을 수정하고 있습니까? pull request을 완료 할 때 –no-ff 병합에 대한 대안을 원하십니까? PR 분기 프로세스에 새 항목이 추가되어 topic 분기 변경 사항을 squash merge 할 수 있어 대상 분기 히스토리가 크게 단순화되었습니다.



squash merge이란 무엇입니까?
squash merge은 Git에서 하나의 부모와 병합 커밋을 생성하는 병합 옵션입니다. 파일은 일반 병합과 동일하게 병합되지만 커밋 메타 데이터는 상위 커밋 중 하나만 표시하도록 변경됩니다. 결과는 대상 분기에서 단일 병합으로 일반 병합의 모든 변경 사항이 적용됩니다.



왜 squash merge을 사용합니까?
간단히 말해서, squash merge은 더 깨끗한 기록을 생성합니다. 토픽 브랜치에 대해 작업 할 때, 특히 코드 검토 피드백에 응답 할 때 작은 변경 사항이 여러 커밋에 걸쳐 쉽게 커질 수 있습니다. 대화식 리베이스 및 강제 푸시는 종종 이러한 중간 커밋을 정리하는 방법이지만 풀 요청을 사용하고 서버에서 병합하는 경우 새 병합 커밋도 생성됩니다.

병합 및 히스토리 그래프와 관련하여 일러스트레이션이 실제로 도움이 된다고 생각합니다. 마스터 브랜치와 토픽 브랜치가 있고 다음과 같은 그래프가 있는 리포지토리가 있다고 가정하겠습니다.

squash : pull request을 병합하는 완전히 새로운 방법1





 

이제 이 리포지토리의 복사본 두 개를 만들었다고 가정하겠습니다. 첫 번째 리포지토리에서는 주제를 마스터로 정상적으로 병합합니다.

    git check out master
    git merge topic

그러면 다음과 같은 그래프가 나타납니다.
 
squash : pull request을 병합하는 완전히 새로운 방법2


예상대로 새 병합 커밋 F가 만들어지고 마스터의 E와 topic D가 있습니다. 정상적인 pull request merge을 수행 할 때 예상되는 것과 동일한 그래프입니다.

이제 두 번째 리포지토리로 가서 스쿼시 병합을 수행하겠습니다.

    git checout master
    git merge --squash topic

그러면 다음과 같은 그래프가 나타납니다.

squash : pull request을 병합하는 완전히 새로운 방법


새로운 커밋이 생성되었습니다. F '이지만 마스터의 E는 하나뿐입니다. 한눈에, 이것은 전혀 병합처럼 보이지 않습니다. 그러나 F '의 내용에는 마스터 및 topic의 내용이 포함됩니다. F와 F '의 내용을 비교할 경우 실제로 동일한 내용이 포함되어 있음을 알 수 있습니다. 메타 데이터만 다릅니다. 마스터 브랜치에서 커밋 B와 D에 도달 할 수 없으며 topic 브랜치를 삭제하면 찾을 수 없게 됩니다. 그러나 파일 변경 사항이 병합되어 내용이 손실되지 않으므로 걱정하지 마십시오.

각 레포지토리에서 이 명령을 실행하고 출력을 비교하십시오.

    git cat-file -p <commit ID>

트리는 두 개의 병합 커밋에 대해 동일하며 스쿼시 병합이 있는 리포지토리에는 하나의 부모 커밋만 있습니다.



PR 완료시 squash merge
위의 예는 git command line을 사용하여 병합 변경 사항을 지점으로 squash하는 방법을 보여 주지만 pull request을 사용하는 팀에서 작업하는 경우 큰 도움이 되지 않습니다. pull request의 새로운 squash merge option쿼시 병합 옵션이 제공됩니다. 이 옵션을 사용하면 쉽습니다. 

PR을 병합할 준비가 될 때까지 워크 플로가 변경되지 않습니다. 병합 대화 상자에서 "Squash changes when merging" 옵션을 선택하면 서버 측 병합에서 –squash 옵션을 사용합니다.


반응형