01-05 되돌리기와 복구

실수를 되돌리는 법 — 무엇을 되돌릴지에 따라 명령이 다르다. 그리고 잃은 것 같은 커밋도 거의 복구된다.


실수를 되돌리는 법 — 무엇을 되돌릴지에 따라 명령이 다르다. 그리고 잃은 것 같은 커밋도 거의 복구된다.

목표: 어떤 사고든 당황하지 않고 올바른 되돌리기 명령을 고르기

[!danger] 가장 중요한 분기점 이미 push 해 공유한 커밋revert(새 커밋으로 안전하게). 내 로컬에만 있는 커밋reset로 다시 써도 됨.


🧭 상황별 판단

graph TB
    Q1{"이미 push 했나?"} -->|"예"| REVERT["git revert<br/>(되돌리는 새 커밋)"]
    Q1 -->|"아니오"| Q2{"무엇을 되돌리나?"}
    Q2 -->|"파일 편집 내용"| RESTORE["git restore"]
    Q2 -->|"스테이징만"| UNSTAGE["git restore --staged"]
    Q2 -->|"커밋(변경 유지)"| SOFT["git reset --soft"]
    Q2 -->|"커밋+변경 전부"| HARD["git reset --hard 🔴"]

📄 git restore — 파일 단위 복원

git restore file.txt                  # 작업 디렉토리 변경 버리기(마지막 커밋으로) 🟡
git restore --staged file.txt         # 스테이징만 취소(변경은 유지) 🟢
git restore --source=HEAD~2 file.txt  # 2커밋 전 버전으로
git restore .                         # 전체 변경 버리기 🟡

git reset — 브랜치 포인터 이동

세 가지 모드가 영향 범위가 다르다.

git reset --soft HEAD~1     # 커밋만 취소, 변경은 스테이징에 유지
git reset HEAD~1            # (mixed,기본) 커밋+스테이징 취소, 변경은 유지
git reset --hard HEAD~1     # 커밋·스테이징·작업 전부 삭제 🔴
git reset HEAD file.txt     # 특정 파일 스테이징 취소
모드HEADStagingWorking Dir
--soft이동유지유지
--mixed(기본)이동초기화유지
--hard이동초기화초기화(손실)

[!tip] 커밋을 합치거나 다시 만들 때 git reset --soft HEAD~3 후 한 번에 다시 커밋하면 최근 3커밋을 하나로 합칠 수 있다.


🔄 git revert — 되돌리는 새 커밋

git revert <commit>     # 해당 커밋을 무효화하는 새 커밋 생성(안전)
git revert HEAD         # 마지막 커밋 되돌리기
git revert -n <commit>  # 커밋은 보류, 변경만 적용

히스토리를 지우지 않고 “되돌림”을 새 커밋으로 기록한다. 공유 브랜치에서 유일하게 안전한 되돌리기.

graph LR
    C1["C1"] --> C2["C2(버그)"] --> C3["C3"] --> R["C4: revert C2"]

✏️ git commit --amend — 마지막 커밋 수정

git commit --amend                # 메시지·내용 수정(에디터)
git commit --amend -m "새 메시지"  # 메시지만
git commit --amend --no-edit      # 빠뜨린 파일 추가(메시지 유지)

push 전에만 사용(해시가 바뀜).


🦸 git reflog — 잃은 커밋 복구 (구원투수)

Git은 거의 아무것도 진짜로 지우지 않는다. HEAD가 거쳐온 모든 위치가 reflog에 남는다.

git reflog                      # HEAD 이동 기록
git reset --hard HEAD@{3}       # 3단계 전 상태로 복구
git switch -c recovered <hash>  # 잃은 커밋에서 새 브랜치

예시 출력:

9f3a1c2 HEAD@{0}: reset: moving to HEAD~2
a1b2c3d HEAD@{1}: commit: 중요한 작업   ← 이걸 복구하면 됨
4d5e6f7 HEAD@{2}: commit: ...

[!tip] reset --hard로 날렸어도 git reflog에서 직전 해시를 찾아 git reset --hard <hash>면 돌아온다. reflog 기록은 보통 90일 보관.


🧹 git clean — untracked 파일 제거

git clean -n      # 삭제될 파일 미리보기(dry-run) ⭐ 항상 먼저
git clean -f      # untracked 파일 삭제
git clean -fd     # 디렉토리까지
git clean -fdx    # .gitignore 대상까지 전부 🔴

📊 되돌리기 요약

상황명령위험도
스테이징 취소git restore --staged file🟢
파일 편집 버리기git restore file🟡
마지막 커밋 메시지 수정git commit --amend🟡
공개 커밋 되돌리기git revert <commit>🟢
커밋만 취소(변경 유지)git reset --soft HEAD~1🟢
전부 버리기git reset --hard HEAD~1🔴
잃은 커밋 복구git reflogreset --hard🟢

📋 체크리스트

  • restore로 파일/스테이징 되돌리기
  • reset 3모드 영향 범위 구분
  • revert vs reset 판단(공유 여부)
  • --amend 사용 시점
  • reflog로 잃은 커밋 복구
  • git clean -n으로 먼저 확인

🔗 관련 노트

  • 01-04-원격-저장소와-협업 — 이전: 원격
  • 02-01-브랜치-전략 — 다음(중급): 브랜치 전략
  • 03-05-트러블슈팅과-재해-복구 — 심화 복구
  • Git-상세-가이드 — 옵션 백과

마지막 업데이트: 2026-06-02