git merge --squash: Combine Multiple Commits into One
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

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로 메시지 추출 후 사용 권장