실수 복구 시나리오
한 줄 요약
다양한 Git 실수 상황과 복구 방법 모음
상황별 빠른 참조
| 상황 | 해결 명령어 |
|---|---|
| 파일 수정 취소 | git restore 파일 |
| Stage 취소 | git restore --staged 파일 |
| 커밋 메시지 수정 | git commit --amend |
| 직전 커밋 취소 (로컬) | git reset HEAD~1 |
| push한 커밋 되돌리기 | git revert HEAD |
| 잘못된 브랜치 커밋 | reset → switch → commit |
| 삭제한 브랜치 복구 | git reflog + git branch |
| 잃어버린 커밋 찾기 | git reflog |
파일 관련 실수
파일 수정을 취소하고 싶어요
# 특정 파일
git restore app.js
# 모든 파일 (⚠️ 주의!)
git restore .복구 불가
restore로 취소한 변경은 되돌릴 수 없습니다.
실수로 파일을 삭제했어요
# 삭제한 파일 복구
git restore 삭제한파일.js
# 모든 삭제 파일 복구
git restore .잘못된 파일을 add 했어요
# 특정 파일 Stage에서 내리기
git restore --staged secret.env
# 모든 파일
git restore --staged .커밋 관련 실수
커밋 메시지를 잘못 썼어요
# 직전 커밋 메시지 수정
git commit --amend -m "올바른 메시지"
# 에디터로 수정
git commit --amendpush 전에만!
이미 push했다면 force push가 필요하고, 협업 시 문제가 됩니다.
파일을 빠뜨리고 커밋했어요
# 빠뜨린 파일 추가
git add 빠뜨린파일.js
# 직전 커밋에 포함
git commit --amend --no-edit커밋을 취소하고 싶어요 (push 전)
# 변경사항은 Working Dir에 유지
git reset HEAD~1
# 변경사항도 Stage에 유지
git reset --soft HEAD~1
# 완전히 삭제 (⚠️ 주의!)
git reset --hard HEAD~1커밋을 되돌리고 싶어요 (push 후)
# 새 커밋으로 되돌리기 (안전)
git revert HEAD
git push→ git revert 참고
브랜치 관련 실수
잘못된 브랜치에서 커밋했어요
상황: main에서 커밋해야 하는데 develop에서 커밋함
# 1. 커밋 ID 기억
git log -1 --oneline
# a1b2c3d feat: 새 기능
# 2. 커밋 취소 (변경사항 유지)
git reset HEAD~1
# 3. 올바른 브랜치로 이동
git switch main
# 4. 다시 커밋
git add .
git commit -m "feat: 새 기능"또는 cherry-pick 사용:
# 1. 올바른 브랜치로 이동
git switch main
# 2. 커밋 가져오기
git cherry-pick a1b2c3d
# 3. 잘못된 브랜치에서 커밋 삭제
git switch develop
git reset --hard HEAD~1→ 잘못된 브랜치에서 작업했을 때 참고
브랜치를 실수로 삭제했어요
# 1. reflog에서 브랜치의 마지막 커밋 찾기
git reflog
# a1b2c3d HEAD@{5}: commit: feat: 중요한 기능
# 2. 해당 커밋으로 브랜치 복구
git branch 복구브랜치 a1b2c3d잘못된 브랜치를 merge 했어요
# merge 커밋 전으로 reset (push 전)
git reset --hard HEAD~1
# 이미 push 했다면
git revert -m 1 <merge-commit>Push 관련 실수
push를 취소하고 싶어요
개인 브랜치라면:
git reset --hard HEAD~1
git push -f origin 브랜치명협업 브랜치라면:
git revert HEAD
git push origin 브랜치명→ push를 취소하고 싶을 때 참고
잘못된 원격 저장소에 push 했어요
# 원격 저장소 확인
git remote -v
# 잘못된 원격에서 브랜치 삭제
git push wrong-remote --delete 브랜치명최후의 수단: git reflog
모든 HEAD 이동 기록이 저장되어 있습니다:
$ git reflog
a1b2c3d (HEAD -> main) HEAD@{0}: reset: moving to HEAD~1
9x8y7z6 HEAD@{1}: commit: feat: 잃어버린 커밋
5w4v3u2 HEAD@{2}: commit: fix: 수정
...
# 잃어버린 커밋으로 복구
git reset --hard 9x8y7z6reflog 보존 기간
기본 90일간 보존됩니다. 그 전에 복구하세요!
복구 불가능한 상황
다음 경우는 복구가 어렵거나 불가능합니다:
- 커밋하지 않은 변경을
git restore나git reset --hard로 삭제 - reflog 만료 후 (90일 이상)
- gc(가비지 컬렉션) 실행 후
예방 방법
- 자주 커밋: 작은 단위로 자주 커밋
- 브랜치 활용: 실험은 브랜치에서
- push 활용: 원격에 백업
- stash 활용: 임시 저장
복구 결정 흐름도
변경사항을 되돌리고 싶다
│
├─ 아직 커밋 안 함?
│ └─ git restore
│
├─ 커밋했지만 push 안 함?
│ └─ git reset
│
└─ 이미 push 함?
└─ git revert
관련 명령어
- git restore - 파일 복원
- git reset - 커밋 취소
- git revert - 안전한 되돌리기
- git reflog - 모든 이력 보기
더 알아보기
- 이전 버전으로 돌아가기 - 상황별 가이드
- push를 취소하고 싶을 때 - push 관련 복구
- 잘못된 브랜치에서 작업했을 때 - 브랜치 실수 복구