실수 복구 시나리오

한 줄 요약

다양한 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 --amend

push 전에만!

이미 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 9x8y7z6

reflog 보존 기간

기본 90일간 보존됩니다. 그 전에 복구하세요!


복구 불가능한 상황

다음 경우는 복구가 어렵거나 불가능합니다:

  1. 커밋하지 않은 변경git restoregit reset --hard로 삭제
  2. reflog 만료 후 (90일 이상)
  3. gc(가비지 컬렉션) 실행 후

예방 방법

  1. 자주 커밋: 작은 단위로 자주 커밋
  2. 브랜치 활용: 실험은 브랜치에서
  3. push 활용: 원격에 백업
  4. stash 활용: 임시 저장

복구 결정 흐름도

변경사항을 되돌리고 싶다
         │
         ├─ 아직 커밋 안 함?
         │       └─ git restore
         │
         ├─ 커밋했지만 push 안 함?
         │       └─ git reset
         │
         └─ 이미 push 함?
                 └─ git revert

관련 명령어

더 알아보기