squash로 합친 브랜치를 다시 머지했더니 같은 변경이 또 올라온 이유
문제 발생
기능 브랜치를 커밋 하나로 합쳐 올렸습니다.
git merge --squash feature/login
git commit -m "로그인 화면 추가"그 뒤 같은 브랜치에서 작업을 이어가 다시 머지했더니, 이미 반영된 변경이 또 올라오고 충돌까지 났습니다. git branch --merged에도 그 브랜치가 나오지 않았습니다.
원인 분석
squash는 머지가 아닙니다. Git 문서가 정확히 적습니다 — (머지 정보를 제외하면) 실제 머지가 일어난 것과 같은 작업 트리와 인덱스 상태를 만들지만, 실제로 커밋을 만들지 않고 HEAD를 옮기지 않으며 $GIT_DIR/MERGE_HEAD를 기록하지도 않습니다.
즉 결과 파일 내용만 같고 이력상의 연결은 없습니다. 새로 만든 커밋은 부모가 하나뿐이라, Git은 feature/login이 합쳐졌다는 사실을 알 방법이 없습니다.
그래서 다음 머지에서 Git은 공통 조상 이후의 모든 커밋을 다시 가져오려 합니다. 이미 같은 내용이 반영돼 있으니 충돌이 나기 쉽습니다.
해결 방안
-
squash 머지한 브랜치는 재사용하지 않습니다. 합친 뒤 삭제하고, 다음 작업은 최신 기본 브랜치에서 새로 시작합니다 — GitHub의 "Squash and merge"를 쓰는 팀이 머지 후 브랜치를 지우는 이유입니다.
-
이어서 작업해야 한다면 리베이스로 정리합니다. 이미 반영된 커밋을 떨어내고 새 작업만 남깁니다.
git rebase --onto main feature/login@{u} feature/login-
이력 연결이 필요하면 일반 머지를 씁니다. 머지 커밋이 남는 대신 "합쳐졌다"는 사실이 기록되어 이후 머지가 조용히 동작합니다.
-
팀의 전략을 하나로 정합니다. squash 머지와 일반 머지를 섞으면
--merged판정과 릴리스 노트 생성이 모두 어긋납니다. -
--squash와--commit은 함께 쓸 수 없습니다. 문서가 명시하는 제약이고, 그래서 커밋을 별도로 만들어야 합니다 — 이 단계에서 커밋 메시지를 제대로 쓸 기회로 삼습니다. -
되돌릴 때도 다릅니다. squash 결과는 평범한 커밋 하나라
git revert로 간단히 되돌아갑니다 — 머지 커밋을 되돌릴 때 필요한-m고민이 없습니다. 장단이 이렇게 갈립니다.
댓글0
댓글을 남기려면 로그인이 필요해요. 로그인
아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.