Git을 사용하다 보면 하나의 기능이나 이슈를 해결하기 위해 여러 번의 커밋이 발생할 수 있습니다. 코드 수정, 버그 해결, 코드 리뷰 대응 등 다양한 이유로 커밋이 쌓이게 되는데요. 이런 여러 커밋을 그대로 남겨두면 커밋 히스토리가 불필요하게 복잡해질 수 있습니다. 특히, 오픈 소스 프로젝트나 여러 개발자가 협업하는 환경에서는 깔끔한 커밋 히스토리가 매우 중요합니다. 이를 해결하기 위한 방법으로 Git Squash를 사용할 수 있습니다.
이 포스트에서는 Git Squash가 무엇인지, 왜 필요하며, 어떻게 사용하는지에 대해 자세히 알아보겠습니다.
Git Squash란 무엇인가?
Git Squash는 여러 커밋을 하나로 합치는 기능입니다. Squash를 사용하면 여러 개의 커밋 이력을 단일 커밋으로 병합하여 커밋 히스토리를 깔끔하게 유지할 수 있습니다. 주로 다음과 같은 상황에서 사용됩니다:
- 하나의 작업을 완료하기 위해 여러 번 커밋을 했을 때, 이를 하나의 의미 있는 커밋으로 정리하고 싶을 때
- 코드 리뷰가 완료된 후, 리뷰 피드백을 반영한 커밋들을 하나로 합쳐 히스토리를 단순화하고 싶을 때
- 협업 프로젝트에서 이력을 정리해, 히스토리를 더 깔끔하고 이해하기 쉽게 만들고 싶을 때
Git Squash가 왜 필요한가?
커밋 이력이 너무 많거나 불필요한 커밋이 섞여 있으면, 프로젝트 유지보수가 복잡해질 수 있습니다. 예를 들어, 코드 리뷰 과정에서 "작동 확인", "오타 수정" 등의 사소한 커밋이 쌓인 경우, 전체적인 히스토리를 파악하기 어려워질 수 있습니다.
Git Squash를 사용하면:
- 커밋 이력을 깔끔하게 정리할 수 있습니다.
- 커밋 메시지를 재작성하여 더 명확하게 변경 사항을 설명할 수 있습니다.
- 프로젝트 팀원이나 다른 협업자가 커밋 이력을 쉽게 파악할 수 있습니다.
Git Squash 사용법
이제 Git Squash를 실제로 사용하는 방법을 예시와 함께 살펴보겠습니다.
예시: 세 개의 커밋을 하나로 합치기
아래와 같은 커밋 로그가 있다고 가정해보겠습니다
$ git log --pretty=oneline
3a5c9f3 (HEAD -> feature-branch) Add feature implementation
b1d45fc Fix typo in feature implementation
0a1d2e1 Initial feature setup
위의 세 개의 커밋을 하나의 커밋으로 합치려면 Git Rebase와 Squash 명령어를 사용해야 합니다.
Git Rebase 명령어 실행
먼저, 세 개의 커밋을 하나로 합치기 위해 rebase -i 명령어를 실행합니다. 이때, 세 번째 커밋 전 커밋을 기준으로 Rebase를 시작합니다.
$ git rebase -i HEAD~3
Squash 설정
Rebase 명령을 실행하면 아래와 같은 인터페이스가 나타납니다. 각 커밋에 대해 어떻게 처리할지 선택할 수 있는 화면입니다.
pick 0a1d2e1 Initial feature setup
pick b1d45fc Fix typo in feature implementation
pick 3a5c9f3 Add feature implementation
여기서, 첫 번째 커밋은 그대로 두고, 나머지 커밋을 첫 번째 커밋에 합치기 위해 pick을 squash로 변경합니다
pick 0a1d2e1 Initial feature setup
squash b1d45fc Fix typo in feature implementation
squash 3a5c9f3 Add feature implementation
커밋 메시지 작성
Squash 과정이 완료되면, Git은 합쳐질 커밋들의 메시지를 보여주며 새로운 커밋 메시지를 작성하도록 요청합니다. 필요에 따라 메시지를 수정할 수 있습니다.
# This is a combination of 3 commits.
Initial feature implementation with typo fixes and feature addition
- 작성이 완료되면, 저장 후 Rebase 과정을 종료합니다.
커밋 로그 확인
이제 세 개의 커밋이 하나로 합쳐졌는지 확인할 수 있습니다
$ git log --pretty=oneline
5f3b7c2 (HEAD -> feature-branch) Initial feature implementation with typo fixes and feature addition
- 성공적으로 Squash가 완료된 것을 확인할 수 있습니다.
원격 저장소로 Push하기
Squash 후에는 로컬 커밋 이력이 변경되었기 때문에, 원격 저장소에 이를 반영하려면 강제 푸시가 필요합니다.
$ git push origin feature-branch -f
이 명령어를 사용하면 원격 저장소에 Squash된 커밋을 강제로 푸시할 수 있습니다.
이 명령어를 사용하면 원격 저장소에 Squash된 커밋을 강제로 푸시할 수 있습니다.
'DevOps' 카테고리의 다른 글
GitLab Merge Request 충돌 해결하기: 웹에서 vs. 로컬에서 (0) | 2024.09.30 |
---|---|
애자일, 스크럼 그리고 칸반: 성공적인 프로젝트 관리의 비밀 (0) | 2024.09.26 |
왜 Git을 선택해야 할까? - 버전 관리의 혁신적인 도구, Git의 특징과 장점 (0) | 2024.09.25 |
GitHub vs GitLab: 무엇을 선택할까? – SaaS와 자체 호스팅 솔루션의 장단점 분석 (0) | 2024.09.25 |
완벽한 협업을 위한 Git 브랜치 전략: Git Flow, GitHub Flow, GitLab Flow 완벽 가이드! (0) | 2024.09.25 |