commit끼리 큰 변동사항이 없다거나, bug만 수정한 커밋을 추가한다거나 할 때
commit 여러개를 하나로 합치고 싶은 욕망이 생긴다! 🔥
이렇게 여러개의 commit을 하나로 합치는 데 사용하는게 git rebase 커맨드이다.
rebase에는 합치는 것 말고도 다양한 기능이 있는데, 커맨드를 합칠 때는 그 중 squash 옵션을 사용한다.
Command & Result
git rebase -i HEAD~(합치려는 커밋 수)
// editor에서 pick -> s로 수정 후 :wq 로 저장
// 합친 커밋의 커밋 메시지 적절히 수정
설명
아래 그림처럼 4개의 커밋이 있다고 하자.
git rebase -i HEAD~4
여기서 HEAD~ 뒤에는 합치려는 커밋의 수를 적어준다.
그럼 아래와 같은 화면이 나오는데, 이건 이 커밋들을 어떻게 수정 하고싶은데? 라고 물어보는 것이다.
아래 설명에 보면 squash라는 command가 있다.
use commit, but meld into previoud commit. 즉 이 commit을 쓰긴 쓸건데 이전 커밋에 합쳐버릴래, 하는 뜻이다.
커밋은 가장 위에 있는게 가장 오래된 것이다.
아래에 있는 커밋들을 다 첫번째 커밋에 합칠 거니깐
아래 3개의 commit의 pick을 squash 또는 s로 수정해주고 esc + :wq 로 저장한다.
4개의 커밋이 합쳐진 커밋의 commit message를 수정하는 화면이 나오는데,
나는 보통 첫번째꺼만 남기고 다 삭제해버린다.
이렇게 하면 깔끔하게 커밋이 하나로 합쳐진다.
! 만약 이미 origin에 일부 커밋을 push한 상황이라면)
origin에서 local이랑 버전을 맞출수가 없다며 push를 거부할 것이다.
이럴 때는 'local이 맞아!' 강력 주장해주기 위해
git push --force
--force 옵션을 주어 push를 하면 된다.
force 옵션을 줄 때는 항상 신중해야 한다. 그 사이에 그 브랜치에 다른 사용자가 커밋을 했다거나 하면, 얄짤없이 그 커밋은 날라가고 내 Local과 동기화 된다!