본문으로 건너뛰기
개발 머꼬
개발 노트Git
hohyeon.dev13

squash로 합친 브랜치를 다시 머지했더니 같은 변경이 또 올라온 이유

  • #Engineering Note
  • #Git

문제 발생

기능 브랜치를 커밋 하나로 합쳐 올렸습니다.

git merge --squash feature/login
git commit -m "로그인 화면 추가"

그 뒤 같은 브랜치에서 작업을 이어가 다시 머지했더니, 이미 반영된 변경이 또 올라오고 충돌까지 났습니다. git branch --merged에도 그 브랜치가 나오지 않았습니다.

원인 분석

squash는 머지가 아닙니다. Git 문서가 정확히 적습니다 — (머지 정보를 제외하면) 실제 머지가 일어난 것과 같은 작업 트리와 인덱스 상태를 만들지만, 실제로 커밋을 만들지 않고 HEAD를 옮기지 않으며 $GIT_DIR/MERGE_HEAD를 기록하지도 않습니다.

즉 결과 파일 내용만 같고 이력상의 연결은 없습니다. 새로 만든 커밋은 부모가 하나뿐이라, Git은 feature/login이 합쳐졌다는 사실을 알 방법이 없습니다.

그래서 다음 머지에서 Git은 공통 조상 이후의 모든 커밋을 다시 가져오려 합니다. 이미 같은 내용이 반영돼 있으니 충돌이 나기 쉽습니다.

해결 방안

  1. squash 머지한 브랜치는 재사용하지 않습니다. 합친 뒤 삭제하고, 다음 작업은 최신 기본 브랜치에서 새로 시작합니다 — GitHub의 "Squash and merge"를 쓰는 팀이 머지 후 브랜치를 지우는 이유입니다.

  2. 이어서 작업해야 한다면 리베이스로 정리합니다. 이미 반영된 커밋을 떨어내고 새 작업만 남깁니다.

git rebase --onto main feature/login@{u} feature/login
  1. 이력 연결이 필요하면 일반 머지를 씁니다. 머지 커밋이 남는 대신 "합쳐졌다"는 사실이 기록되어 이후 머지가 조용히 동작합니다.

  2. 팀의 전략을 하나로 정합니다. squash 머지와 일반 머지를 섞으면 --merged 판정과 릴리스 노트 생성이 모두 어긋납니다.

  3. --squash--commit은 함께 쓸 수 없습니다. 문서가 명시하는 제약이고, 그래서 커밋을 별도로 만들어야 합니다 — 이 단계에서 커밋 메시지를 제대로 쓸 기회로 삼습니다.

  4. 되돌릴 때도 다릅니다. squash 결과는 평범한 커밋 하나라 git revert로 간단히 되돌아갑니다 — 머지 커밋을 되돌릴 때 필요한 -m 고민이 없습니다. 장단이 이렇게 갈립니다.

공식 문서

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.