Git에서 rebase와 stash를 사용하여 커밋을 합치면 이력을 깔끔하게 정리할 수 있다.

해당 방법은 리모트 브랜치의 커밋 해시값을 변경하기 때문에 주로 로컬 또는 개인 브랜치에서 사용하는 것을 권장한다. 만약 공동으로 사용하는 브랜치에서 사용해야 한다면 변경 사항을 병합한 후 팀원들이 브랜치를 새로 받아 싱크를 맞춰야 한다.

초기 커밋 로그

$ git log

commit 013f24839c25e0dc249fae5d76290bf364ec6cf1 (HEAD -> main)
Author: joohyun.ha <mylifeforcoding@gmail.com>
Date:   Sat Jun 8 02:24:51 2024 +0900

    test4

commit 444fcbdccb5fa776487cb87832b1c322ae6fa4b5
Author: joohyun.ha <mylifeforcoding@gmail.com>
Date:   Sat Jun 8 02:24:44 2024 +0900

    test3

commit 98ee7d08852a0e143d09f3dd609c697e6c4e33b4
Author: joohyun.ha <mylifeforcoding@gmail.com>
Date:   Sat Jun 8 02:24:36 2024 +0900

    test2

commit 5f2fcbaaa1710125a062d63f3dbb9943cf4eb1b4
Author: joohyun.ha <mylifeforcoding@gmail.com>
Date:   Sat Jun 8 02:24:30 2024 +0900

    test

리베이스

합칠 커밋 범위만큼 HEAD 기준으로 가져와 리베이스를 시작한다.

$ git rebase -i HEAD~4

가장 오래된 커밋은 그대로 두고 합칠 커밋들을 picks or squah로 변경한다.

pick 5f2fcba test
squash 98ee7d0 test2
squash 444fcbd test3
squash 013f248 test4

만약 첫 번째 커밋 pick으로 안 하고 합치려고 하는 경우 error: cannot 'squash' without a previous commit 에러가 발생하니 항상 첫 번째 커밋이 pick으로 설정되어 있어야 한다.

최종 커밋

변경 내용을 저장하고 리베이스를 마무리한다.

$ git rebase --continue

리베이스가 완료되면 새로운 커밋이 생성된 것을 확인할 수 있다.

$ git log

commit e36e89c48d2d9c3aabb932a2ce75365e001f173c (HEAD -> main)
Author: joohyun.ha <mylifeforcoding@gmail.com>
Date:   Sat Jun 8 02:24:30 2024 +0900

    test

    test2

    test3

    test4