안녕하세요, 오랜만에 글을 써봅니다.
이 정도면 오랜만에 글을 쓴다가 인사인 거 같아요.
아무튼 예전에도 프로젝트를 하다가 한번씩 Confilct가 폭발한 적이 종종 있었는데,
진행중인 프로젝트에 다시 Confilct이 폭발했고 오늘 그 원인을 찾았습니다.
Squash & Merge 이 친구가 범인이었어요...
(🥪 프로젝트는 곧 홍보할 예정입니다!)
이미 당연하게 아시는 분들도 계실 테니 1줄 요약 먼저 드립니다.
1. Feature -> Develop 머지만 Squash & Merge 사용하자.
언제부턴가 히스토리가 깔끔해진다고 듣고 Squash & Merge를 자주 사용했는데요,
Squash는 깃의 이력을 압축해 줍니다.
예를 들어 아래처럼 커밋 이력이 3개가 있다고 가정해 볼게요.
- a123b123c123: A View 그렸어요
- b123c123d123: B View 그렸어요
- c123d123f123: C View 그렸어요
Squash & Merge를 사용하면 이 이력을 하나의 이력으로 바꿔줍니다.
- n123n123n123: 홈 탭 작업
그리고 기존 내용들은 커밋 메시지 Description에 자동으로 담깁니다.
(description: A View 그렸어요, B View 그렸어요, C View 그렸어요)
결과적으로 커밋 내역이 깔끔해지죠!
문제는
Git은 공통 커밋 내역을 추적해야 하는데,
Develop -> Release, 또는 Develop -> Main으로
머지할 때 Squash를 사용하면 추적이 안 되는 상황이 발생합니다.
예를 들어
Feature -> Develop으로 Squash를 사용하면
다음과 같이 새로운 커밋 이력을 생성하겠죠?
- n123n123n123
그럼 이제
Develop -> Main으로 Squash를 사용하면
다음과 같이 새로운 커밋 이력을 생성하겠죠?
- nn123nn123nn123
여기서 Main에 있는 nn123nn123nn123 이력이
Develop 브랜치에는 존재하지 않습니다.
그러면 다음에 머지할 때 Main 브랜치 입장에서는
"어? 공통된 커밋 이력이 없는데?"
"전부 다 비교(Confilct) 해야겠군"
이렇게 되는 거죠....
정말 사소하지만
Develop에서 Main으로 머지할 일이 잘 없다 보니
이제야 원인을 찾았네요.