[Git] rebase로 커밋 정리하기
git으로 작업을 하다보면, 이미 저장한 커밋들의 내용을 변경하거나, 쓸데없이 자잘하게 나뉜 커밋을 합치고 싶은 경우가 있다.
그럴 때 유용한 기능 중 하나가 rebase다.
커밋 합치기
지금 내 경우에는 배포가 자꾸 실패해서 커밋을 좀 많이 했었는데, 그것 때문에 쓸데없는 커밋이 잔뜩 쌓인 상태다.
어떻게 봐도 좋은 상태라고 하긴 힘들다.
저기서 merge 이후부터 최근까지의 9개를 뭉쳐보겠다.
git rebase -i HEAD~조회할 개수
의 형태로 명령을 주면 된다.
난 로컬에서 커밋을 추가로 한번 더 해서 10으로 해놨다.

그냥 다 보고싶으면 ~~로 줘도 된다.
보기만 하고 무시해도 되니까...
그럼 대충 이런 식으로 편집창이 뜰 것이다.

저기 펼쳐보면
pick, rewor, edit, squash, fixup, drop 등의 항목이 있다.
pick은 그냥 그대로 두는거고,
우리가 지금 쓸 건 squash다.
이건 지금 커밋으로 이전 커밋을 찍어눌러버린다.
그래서 쭉 내리고
오케이 버튼 누르면
편집창이 뜬다.
저장하고 닫으면
반영이 될 것이다.
이대로 강제 푸시를 하면

짜잔.
히스토리가 깔끔하게 정리된 것을 볼 수 있다.
fixup도 squash와 비슷한 기능인데, 합치는 건 동일하지만 커밋 메세지는 합치지 않는다는 것이 다르다.
커밋 메세지 수정
이외에도 다양한걸 할 수 있다. 커밋 메세지를 잘못 적었더라도 rebase와 push -f를 사용하면 입맛대로 바꿔쓸 수가 있다.
rebase를 켠 다음에
바꿀 항목을 reword로 선택한 뒤 start rebase 버튼을 누른다.
그럼 편집창이 뜰 것이다.

잘 바꾸고
나간 다음에

강제로 푸시하면 된다.

그럼 다시 잘 바뀌어있을 것이다.
커밋 삭제
특정 커밋들을 삭제하려면 rebase의 drop 기능을 사용하면 된다.
난 저기서 '실수' 커밋을 삭제하고 싶다
그러면 rebase 창으로 진입해서

drop으로 깔아주면 된다.
그리고 강제푸시하면
잘 삭제될 것이다.
커밋 수정하기
특정 커밋의 메세지뿐 아니라 실제 작업내용들도 수정을 하고싶을 수도 있다.
그럴때는 edit 기능을 사용한다.
그리고 그냥 오케이 버튼 누르면

현재 커밋이 edit할 커밋으로 바뀐다.
지금 상태에서 파일들을 적당히 수정하고, amend 옵션과 함께 커밋을 한다.

수정할 파일들 주석 해제하고
rebase --coninue 를 준다.
rebase로 인해 발생한 conflict를 해결하는 명령이다.
그리고 강제푸시하면 끝이다.

그럼 커밋 메세지 등은 유지된 채로 작업내용만 바뀌어있을 것이다.

그렇다.
참조
https://cjh5414.github.io/git-rebase/
https://junwoo45.github.io/2019-10-23-rebase/
https://backlog.com/git-tutorial/kr/stepup/stepup7_6.html