GitHub에 이미 올린 커밋 메시지 변경하기
GitHub에 이미 올린 커밋 메시지 변경하기
GitHub에 커밋을 올린 뒤에 커밋 메시지를 잘못 작성했다는 것을 발견할 때가 있습니다.
이번에는 최신 커밋 메시지가 msg01로 되어 있었는데, 실제로는 msg02이 맞아서 커밋 메시지를 수정했습니다.
- 상황 확인
먼저 현재 브랜치 상태를 확인합니다.
git status --short --branch
결과가 다음처럼 나오면 로컬 브랜치와 원격 브랜치가 동기화된 상태입니다.
## main...origin/main
그다음 최근 커밋 로그를 확인합니다.
git log --oneline --decorate -n 3
수정 전 상태는 다음과 같았습니다.
3249a1a (HEAD -> main, origin/main, origin/HEAD) msg01
여기서 msg01는 태그가 아니라 최신 커밋의 메시지였습니다.
- 태그인지 커밋 메시지인지 확인하기
버전 이름처럼 보이는 값은 Git 태그일 수도 있습니다. 그래서 태그 목록도 확인했습니다.
git tag --list "msg*" --sort=-creatordate
결과는 다음과 같았습니다.
msg01
msg01라는 태그는 없었기 때문에, 이번 작업은 태그 변경이 아니라 커밋 메시지 변경이었습니다.
- 최신 커밋 메시지 수정하기
최신 커밋 메시지를 수정할 때는 git commit --amend를 사용합니다.
git commit --amend -m "msg02"
이 명령은 최신 커밋을 다시 작성합니다.
파일 내용은 그대로 두고 커밋 메시지만 바꾸더라도 Git 커밋 해시는 변경됩니다.
수정 전: 3249a1a msg01
수정 후: 1a36242 msg02
- GitHub에 다시 반영하기
이미 GitHub에 올라간 커밋을 수정했기 때문에 일반적인 git push는 실패합니다.
원격 브랜치의 기록을 새 커밋으로 교체해야 합니다.
이때는 다음 명령을 사용합니다.
git push --force-with-lease origin main
--force-with-lease는 --force보다 안전한 방식입니다.
내가 마지막으로 알고 있던 원격 브랜치 상태와 현재 GitHub의 상태가 같을 때만 강제 푸시를 허용합니다.
즉, 그 사이 다른 사람이 원격 브랜치에 새 커밋을 올렸다면 푸시가 실패합니다.
푸시가 성공하면 다음과 비슷한 결과가 나옵니다.
+ 3249a1a ...1a36242 main -> main (forced update)
- 최종 확인
마지막으로 다시 로그를 확인합니다.
git log --oneline --decorate -n 3
최종 결과는 다음과 같습니다.
1a36242 (HEAD -> main, origin/main, origin/HEAD) msg02
이제 로컬 main과 GitHub의 origin/main 모두 최신 커밋 메시지가 msg02로 변경되었습니다.
- 정리
GitHub에 이미 올린 최신 커밋 메시지를 바꾸는 과정은 다음과 같습니다.
git status --short --branch
git log --oneline --decorate -n 3
git commit --amend -m "새 커밋 메시지"
git push --force-with-lease origin main
이번 작업에서는 다음처럼 변경했습니다.
msg01 -> msg02
주의할 점은, 이미 원격 저장소에 올라간 커밋을 수정하면 커밋 해시가 바뀐다는 것입니다.
혼자 관리하는 저장소라면 큰 문제가 없지만, 협업 중인 저장소라면 강제 푸시 전에 팀원과 반드시 공유하는 것이 좋습니다.
댓글
댓글 쓰기