git commit --amend — 마지막 커밋 수정
git commit --amend의 내부 동작 원리, 메시지 수정·파일 추가·작성자 변경 패턴, push된 커밋에 대한 주의사항을 다룬다.
지난 글에서 SemVer와 Git 태그를 연동하는 방법을 살펴봤다. 이번에는 방금 만든 커밋을 수정하는 가장 간단한 도구, **git commit --amend**를 다룬다. 메시지 오타, 빠뜨린 파일, 잘못된 작성자 정보를 로컬에서 빠르게 수정할 수 있다.
amend의 내부 동작
--amend는 기존 커밋을 “수정”하는 것처럼 보이지만, 실제로는 새 커밋 객체를 생성하고 HEAD를 그 커밋으로 이동시킨다. 기존 커밋 객체는 참조가 끊어진 고아 상태가 되어 나중에 garbage collect된다.
# 현재 HEAD 확인
git log --oneline -1
# def5678 feat: add loginn ← 오타
# amend
git commit --amend -m "feat: add login"
# 새 SHA 확인
git log --oneline -1
# ghi9012 feat: add login ← SHA가 바뀜!
SHA가 바뀐다는 점이 핵심이다. 이미 원격에 push된 커밋을 amend하면 원격과 SHA가 달라져 일반 push가 거부된다.
기본 사용 패턴
# 커밋 메시지만 수정 (에디터 열림)
git commit --amend
# 메시지 직접 지정
git commit --amend -m "fix: correct login endpoint"
# 메시지 유지, 내용(파일)만 변경
git add forgotten-file.js
git commit --amend --no-edit
# 작성자 정보 수정
git commit --amend --author="Correct Name <correct@email.com>" --no-edit
--no-edit은 커밋 메시지를 그대로 유지하면서 파일 변경만 적용할 때 쓴다.
빠뜨린 파일 추가하기
커밋 직후 빠뜨린 파일을 발견했을 때 가장 흔하게 사용하는 패턴이다.
# 커밋 이후 파일이 빠졌다는 걸 발견
git status
# Changes not staged: src/config.js
# 스테이징 후 amend
git add src/config.js
git commit --amend --no-edit
# 결과: 이전 커밋에 config.js가 포함됨
git show --stat HEAD
새 커밋을 추가하는 대신 기존 커밋에 포함시키므로 히스토리가 깔끔하게 유지된다.
타임스탬프 처리
amend하면 committer date는 현재 시간으로 갱신되지만, author date는 유지된다. 둘 다 현재 시간으로 바꾸려면 --reset-author 옵션을 쓴다.
# author date도 현재 시간으로 갱신
git commit --amend --reset-author --no-edit
push된 커밋을 amend할 때
이미 원격에 push된 커밋을 amend하면 SHA가 달라져서 일반 push가 거부된다.
# amend 후 push 시도
git push origin main
# ! [rejected] main -> main (non-fast-forward)
# 강제 push가 필요 (위험!)
git push origin main --force-with-lease
--force보다 --force-with-lease가 안전하다. 다른 사람이 그 사이에 push한 것이 있으면 자동으로 거부한다.
원칙: 혼자만 사용하는 feature 브랜치라면 amend + force push가 허용되는 경우도 있다. 하지만 main, develop 등 공유 브랜치에서는 절대 사용하지 않는다.
amend vs 새 커밋
amend가 적합한 상황과 새 커밋이 적합한 상황을 구분하는 것이 중요하다.
| 상황 | amend | 새 커밋 |
|---|---|---|
| 아직 push 안 함 | ✓ 권장 | 가능 |
| 로컬 feature 브랜치 (혼자) | ✓ 가능 | 가능 |
| 공유 브랜치에 이미 push | ✗ 금지 | ✓ 권장 |
| 팀원이 해당 커밋 기반으로 작업 중 | ✗ 금지 | ✓ 권장 |
지난 글: Semantic Versioning과 Git 태깅
다음 글: git commit —amend 주의사항과 실수 복구
읽어주셔서 감사합니다. 😊