Git에서 커밋을 수정하거나 되돌리는 다양한 방법을 정리한다.


마지막 커밋 수정 (amend)

메시지만 수정

# 에디터에서 수정
git commit --amend

# 직접 메시지 지정
git commit --amend -m "새로운 메시지"

파일 추가/수정 후 커밋에 포함

# 파일 수정 후
git add .
git commit --amend --no-edit  # 메시지 유지

작성자 정보 수정

git commit --amend --author="Name <email@example.com>"

amend는 새로운 커밋을 생성한다. 이미 push한 커밋을 amend하면 force push가 필요하다.


커밋 되돌리기 (reset)

reset 옵션 비교

옵션 작업 디렉토리 Staging Area 커밋
--soft 유지 유지 삭제
--mixed (기본) 유지 삭제 삭제
--hard 삭제 삭제 삭제

직전 커밋 취소

# 커밋만 취소 (변경사항은 staging에 유지)
git reset --soft HEAD^

# 커밋과 staging 취소 (변경사항은 작업 디렉토리에 유지)
git reset HEAD^

# 커밋과 변경사항 모두 삭제 (주의!)
git reset --hard HEAD^

여러 커밋 취소

# 최근 3개 커밋 취소
git reset --soft HEAD~3

# 특정 커밋으로 되돌리기
git reset --soft abc1234

실무 예시: 여러 커밋을 하나로 합치기

# 특정 커밋으로 soft reset
git reset --soft 1a51af93f0ba0abe235609cbb10510b2bc77a70e

# 새로운 메시지로 커밋
git commit -m "feat: 기능 구현"

# 원격에 강제 푸시 (협업 브랜치에서는 신중하게)
git push --force

단일 커밋만 있을 때 취소

저장소에 커밋이 하나뿐일 때는 reset HEAD^가 동작하지 않는다.

# 에러 발생
git reset HEAD^
# fatal: ambiguous argument 'HEAD^': unknown revision

# 해결 방법
git update-ref -d HEAD
git rm --cached -r .

이렇게 하면 첫 번째 커밋 이전 상태(초기 상태)로 되돌아간다.


커밋 취소 후 원격 반영

force push

# 현재 브랜치에 강제 푸시
git push --force

# 특정 브랜치에 강제 푸시
git push origin HEAD:dev --force

# 안전한 강제 푸시 (다른 사람이 push한 경우 실패)
git push --force-with-lease

주의사항

--force 사용 시 주의:
- 협업 브랜치(main, develop)에서는 사용 금지
- 다른 사람의 작업을 덮어쓸 수 있음
- 가능하면 --force-with-lease 사용

커밋 취소 vs 되돌리기 (revert)

reset vs revert

reset: 커밋 기록 자체를 삭제
       → 로컬 브랜치, 개인 작업에 적합

revert: 취소 커밋을 새로 생성
        → 공유된 브랜치, 협업에 적합

revert 사용

# 특정 커밋 되돌리기 (새 커밋 생성)
git revert abc1234

# 여러 커밋 되돌리기
git revert abc1234..def5678

# 커밋 없이 되돌리기 (staging만)
git revert --no-commit abc1234

원격 브랜치 삭제

# 단일 브랜치 삭제
git push origin --delete <branch-name>

# 여러 브랜치 동시 삭제
git push origin --delete branch1 branch2

# 예시
git push origin --delete feature/login hotfix/v1.0.1

정리

상황 명령어
마지막 커밋 메시지 수정 git commit --amend -m "msg"
마지막 커밋에 파일 추가 git add . && git commit --amend --no-edit
직전 커밋 취소 (변경 유지) git reset --soft HEAD^
직전 커밋 취소 (변경 삭제) git reset --hard HEAD^
특정 커밋으로 되돌리기 git reset --soft <hash>
첫 번째 커밋 취소 git update-ref -d HEAD
공유 브랜치에서 취소 git revert <hash>
원격 브랜치 삭제 git push origin --delete <branch>

reset은 기록을 수정하고, revert는 기록을 추가한다. 협업 환경에서는 revert를 우선 고려하자.