Git 커밋 수정과 되돌리기
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를 우선 고려하자.
댓글