리뷰 지적 사항을 fix 커밋 다섯 개로 쌓다가 정리한 방법
문제 발생
리뷰에서 세 군데를 지적받아 고쳤더니 이력이 이렇게 됐습니다.
* fix typo again
* fix review comment
* fix
* 사용자 알림 설정 화면 추가머지 전에 정리하려고 대화형 리베이스를 열었지만, 어떤 fix가 어떤 커밋에 속하는지 며칠 뒤에는 기억나지 않았습니다.
원인 분석
"이 커밋을 고치는 커밋"이라는 정보를 커밋 자체에 담지 않았기 때문입니다. 나중에 rebase -i에서 순서를 옮기고 squash로 바꾸는 작업은 순수하게 사람의 기억에 의존합니다.
Git에는 그 정보를 담는 방법이 있습니다. 문서 설명대로 --fixup=<commit>은 git rebase --autosquash로 적용될 때 그 커밋을 "고치는" 새 커밋을 만들며, 제목이 "fixup!" 뒤에 대상 커밋 제목이 붙는 형태가 되어 git rebase --autosquash가 이를 특별히 인식합니다. 내용만 고치고 로그 메시지는 건드리지 않습니다.
메시지까지 손봐야 하는 경우도 나뉘어 있습니다.
--fixup=amend:<commit>— 내용과 로그 메시지를 함께 교체하는 "amend!" 커밋--fixup=reword:<commit>— 로그 메시지만 교체(스테이징된 변경은 무시)
그리고 문서가 덧붙입니다 — "fixup!"이든 "amend!"든 --autosquash로 적용될 때 대상 커밋의 저자 정보는 바꾸지 않습니다.
해결 방안
- 고칠 커밋을 지정해 커밋합니다.
git add -p
git commit --fixup=a1b2c3d # 대상 커밋 해시- 정리할 때 자동 배치시킵니다.
git rebase -i --autosquash main편집기에는 fixup 커밋이 이미 대상 바로 뒤로 옮겨지고 fixup으로 표시된 상태로 열립니다. 확인만 하고 저장하면 됩니다.
- 매번 플래그를 붙이기 싫으면 설정합니다.
git config --global rebase.autoSquash true-
메시지만 고칠 때는
reword:를 씁니다. 오탈자 하나 때문에 대화형 리베이스를 열 필요가 없습니다. -
--fixup과--squash의 차이를 알아둡니다.--squash=<commit>은 문서 설명대로 제목에 "squash! "를 붙이며, 합쳐질 때 두 메시지를 함께 편집하게 합니다. 메시지를 남기고 싶으면 squash, 흡수시키고 싶으면 fixup입니다. -
공유된 브랜치에서는 하지 않습니다. 어차피 이력을 다시 쓰는 작업입니다 — 리뷰 중인 자기 브랜치에서, 머지 전에 정리하는 용도로 씁니다.
댓글0
댓글을 남기려면 로그인이 필요해요. 로그인
아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.