[Git] Git Squash로 커밋 정리하기
여러번의 커밋으로 복잡해진 히스토리를 관리하다 보면, 코드 리뷰 과정이나 협업 시 불필요한 커밋들이 쌓여 코드의 흐름을 이해하기 어려워질 수 있다. 이 때 유용한 git의 기능 중 하나가 바로 git squash다.
Git Squash란?
여러 개의 커밋을 하나로 합치는 작업을 말한다.
이를 통해 코드베이스의 커밋 히스토리를 깔끔하고 간결하게 유지할 수 있다.
예를 들어, 하나의 기능을 개발하면서 여러 번 커밋을 남기게 되는데, 이를 코드베이스에 병합하기 전에 커밋으로 합쳐서 기록하는 것이 일반적이다.
💡 왜 Squash를 사용할 까?
- 작업 중간중간 불필요한 커밋들을 합쳐서 메인 브랜치에 병합할 때, 커밋 히스토리를 깔끔하게 유지할 수 있다.
- 리뷰어가 기능 하나당 하나의 커밋을 리뷰할 수 있도록 도와준다.
- git rebase와 함께 사용하면, 브랜치 병합 시 불필요한 병합 커밋을 피할 수 있다.
Git Squash 사용법
기본 사용법: Interactive Rebase
git squash는 주로 git rebase 명령어와 함께 사용된다. git rebase -i 명령어를 사용하면, 선택한 커밋들을 하나로 합칠 수 있다.
git rebase -i HEAD~n
여기서 'n'은 합치고 싶은 커밋의 수다. 예를 들어, 마지막 3개의 커밋을 합치고 싶다면 HEAD~3을 사용한다.
Squash 과정
1. Rebase 시작
git rebase -i HEAD~n 명령어를 입력하면, 텍스트 편집기가 열리며 최근 n개의 커밋 목록이 표시된다.
2. Squash 선택
합치고 싶은 커밋의 앞에있는 pick을 squash 또는 간단히 s로 변경한다.
첫 번째 커밋은 그대로 두고, 나머지 커밋들에 대해 squash를 선택한다.
pick e1a2b3c Add feature A
squash f4d5e6f Fix typo in feature A
squash a7b8c9d Update comments in feature A
3. 커밋메시지 수정
squash가 완료되면, 합쳐진 커밋의 메시지를 수정할 수 있는 편집기가 열린다.
메시지를 정리하고 저장 후 종료하면, 커밋이 하나로 합쳐진다.
강제 푸시
Squash 이후에는 로컬 브랜치와 원격 브랜치의 커밋 히스토리가 달라지기 때문에, 변경된 히스토리를 원격 저장소에 강제로 푸시해야 한다.
git push origin 브랜치명 --force
⚠ 강제 푸시는 협업 환경에서 다른 팀원에게 영향을 미칠 수 있어, 팀원들과 소통 후 꼭 필요할 때만 사용해야 한다.
Example
예를 들어 feature/login 브랜치에서 작업을 하면서 아래와 같은 커밋 히스토리가 있다고 가정해보자.
e1a2b3c Add login feature
f4d5e6f Fix bug in login validation
a7b8c9d Improve login UI
이제 세 개의 커밋을 하나로 합쳐보자
# Rebase 명령어 실행
git rebase -i HEAD~3
# Squash 설정
# 아래와 같이 두 번째, 세 번째 커밋에 대해 squash를 설정한다.
pick e1a2b3c Add login feature
squash f4d5e6f Fix bug in login validation
squash a7b8c9d Improve login UI
# 커밋 메시지 수정
# 편집기에서 최종 커밋 메시지를 설정한다.
Add login feature
- Fix bug in login validation
- Improve login UI
# 강제 푸시
git push origin feature/login --force
'💽 CICD > Git' 카테고리의 다른 글
[Git] 폴더, 파일 이름 변경 (0) | 2024.10.15 |
---|---|
[Git] 원격 저장소와 로컬 저장소의 소스 코드 일치 시키기 (0) | 2024.09.06 |
[Git] 특정 파일만 pull 받아오기 (0) | 2024.08.21 |
[Git] fatal: push options must not have new line characters (0) | 2024.04.24 |
[Git] remote: You are not allowed to push code to this project. (0) | 2024.04.18 |