관리 메뉴

피터의 개발이야기

[Git] git에서 중간 커밋 합치기, squash 본문

Programming/GitHub

[Git] git에서 중간 커밋 합치기, squash

기록하는 백앤드개발자 2025. 1. 14. 03:26
반응형

ㅁ 들어가며

  git에서 중간 커밋 과정을 정리하는 주요 방법은 git squash이다. git squash를 사용하면 여러 개의 커밋을 하나의 의미 있는 커밋으로 합칠 수 있어 커밋 히스토리를 깔끔하게 관리할 수 있다. 오늘은 중간 커밋을 합쳐주는 squash에 대해서 정리하였다. 

 

 

ㅁ 체리픽

 예전에 [git] 체리픽 Cherry-pick, feature 로그 깔끔하게 merge하기 작성한 글에서, 체리픽은 값만 복사하는 별개의 커밋이지 중간 커밋은 정리가 되지 않았다.

 

 체리픽 값만 복사해서 dev에 머지를하기 때문에 commit ID가 다른 별개의 커밋이다.

ㅇ 하지만 feature 중간에 히스토리는 그대로 남아 있다.

 

ㅁ 테스트를 위한 git init

# workspace 생성
mkdir git_test

# git 초기화
git init

# 테스트 커밋
echo "git_squash" > test.txt"

ㅇ 테스트를 위해 다섯개의 커밋을 생성하였다.

 

ㅁ Sourcetree를 이용한 squash 방법

ㅇ 스쿼시하려는 커밋들 중 가장 오래된 커밋의 바로 아래 커밋을 선택한다.

ㅇ 선택한 커밋에서 우클릭하여 "하위 요소 대화식 재배치..."를 클릭

 

 

ㅇ 커밋 정정으로 네번째를 선택하고 다섯 번째를 클린한 상태에서 아래의 이전 것과 합치기를 클릭한다.

ㅇ 같은 방법으로 다섯 번째 커밋 +3 squashed commit 상태를 만들었다.

ㅇ 메시지 내용을 정리하기 위해 메시지편집 버튼을 클릭한다.

ㅇ 메시지를 수정하고 확인을 클릭한다.

 

 

ㅇ 두번째~다섯번째가 하나의 커밋으로 합쳐졌다.


ㅁ git squash  -i 사용법

# HEAD를 사용
git rebase -i HEAD~4

# 커밋 아이디 사용
git rebase -i 7468a95

ㅇ 이 명령어를 실행하면 텍스트 에디터가 열리고 지정한 수의 최근 커밋 목록이 표시된다.

 

# 탭 키를 이용한 자동완성 기능 사용 시 과거 이력을 볼 수 있다.
$ git rebase -i {tab}
HEAD       ORIG_HEAD  main
98519ff  -- [HEAD]    다섯 번째 커밋 (70 minutes ago)
33a3a02  -- [HEAD^]   네 번재 커밋 (70 minutes ago)
988c4df  -- [HEAD^^]  세 번째 커밋 (71 minutes ago)
e9e1791  -- [HEAD~3]  두 번째 커밋 (72 minutes ago)
7468a95  -- [HEAD~4]  첫 번째 커밋 (72 minutes ago)

 

 

4개의 커밋 합치기

# 4개의 커밋 합치기
git rebase -i HEAD~4

# 선택을 위한 4개 커밋이 제시 된다.
pick e9e1791 두 번째 커밋
pick 988c4df 세 번째 커밋
pick 33a3a02 네 번재 커밋
pick 98519ff 다섯 번째 커밋

 

커밋 squash 지정

ㅇ 에디터에서 합치고 싶은 커밋 앞의 'pick'을 'squash' 또는 's'로 변경한다.

ㅇ 커밋 Squash 지정 시 맨 이전의 commit은 선택하면 안된다. 

 

커밋 메시지 정리

ㅇ 두번째 커밋을 커밋 합치기로 수정하였다.

 

ㅇ 주석을 제외한 모든 부분이 커밋 메시지로 정리된다.


ㅁ gir rebase --abort, 초기화 방법

 

모두 커밋 squash 지정하면

error: cannot 'squash' without a previous commit
You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.
Or you can abort the rebase with 'git rebase --abort'.

ㅇ 두번째 커밋을 s로 바꾸면 위의 경고가 발생한다.

ㅇ 이런 경우 git rebase --abort를 명령어를 사용해서 초기화 한다. 

 


ㅁ git reset 사용법

git reset HEAD~[커밋 개수]

ㅇ 이 명령어는 지정한 수의 최근 커밋을 취소하고 변경사항을 staged 상태로 되돌린다.

 

ㅇ 필요한 수정을 진행할 수 있다.

ㅇ 수정된 내용은 새로운 커밋으로 생성된다.

 

ㅁ 함께 보면 좋은 사이트

Git Squash: 커밋 기록 깔끔하게 관리하기

git 현재커밋과 이전커밋 합치기

 

반응형
Comments