git merge --squash: 여러 커밋을 하나로 병합하는 방법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
DevOps
대상자
- 개발자, Git 사용자: 커밋 히스토리 관리, 팀 협업, 기록 정리에 관심 있는 사람
- 난이도: 중급 (Git 기초 지식 필요)
핵심 요약
git merge --squash
는 병합 대상 브랜치의 모든 커밋을 하나의 새로운 커밋으로 합쳐 히스토리에 단일 변경사항을 남김--no-ff
는 병합 히스토리 유지,--squash
는 히스토리 정리 및 간결성 강조--squash
사용 시 커밋 메시지 상실 가능 →git log
를 통해 최상위 커밋 메시지 추출 권장
섹션별 세부 요약
1. 일반 병합 vs. `--squash` 병합
- 일반 병합:
- main
브랜치에 feature
브랜치의 3개 커밋(파일 C 추가, 파일 A 수정, 파일 B 버그 수정)을 그대로 복사
- 병합 커밋 생성 → 히스토리 복잡성 증가
--squash
병합:
- main
브랜치에 하나의 커밋("Implemented new feature"
) 생성
- 커밋 히스토리 간결성 확보
2. `--squash` 실행 단계
- 스테이징 영역 확인:
- git status
→ 변경 사항 확인
- git diff --cached
→ 커밋 될 변경 내용 검토
- 커밋 생성:
- git commit -m "메시지"
→ 병합된 변경사항을 단일 커밋으로 저장
3. 인터랙티브 리베이스 방법
- 커밋 병합:
- git rebase -i main
→ 커밋 이력에서 squash
명령 사용
- git merge feature
→ 빠른 포워드 병합 가능
4. 원본 브랜치 보존
- 파생 브랜치 생성:
- git checkout -b feature-squashed
→ 기존 feature
브랜치 복사
- git merge --squash feature
→ 병합 후 feature-squashed
브랜치 유지
5. `--no-ff` vs. `--squash` 비교
--no-ff
:
- 병합 히스토리 유지 → git blame
에서 원본 작성자 추적 가능
- 기능 브랜치 히스토리 보존
--squash
:
- 병합 후 원본 브랜치 삭제 가능 → 히스토리 간결성 확보
- git blame
에서 병합된 커밋의 작성자만 표시
6. 주의사항 및 해결 방법
- 커밋 메시지 상실:
- git log feature --oneline | head -1
→ 최상위 커밋 메시지 추출
- 충돌 해결 차이:
- --squash
병합 시 일반 병합과 다른 충돌 처리 방식
- 역추적 어려움:
- --squash
병합은 하나의 커밋만 복원 가능 → 전체 변경사항 롤백
결론
- 간결한 히스토리 유지가 중요할 때
git merge --squash
사용 (예: 버그 수정, 단기 기능 개발) - 히스토리 보존이 필수적일 때
--no-ff
병합 선택 (예: 장기 기능 개발, 팀 협업 시 기록 추적) - 커밋 메시지 상실 방지를 위해
git log
로 메시지 추출 후 사용 권장