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 # 특정 파일 스테이징 취소
| 모드 | HEAD | Staging | Working 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 reflog → reset --hard | 🟢 |
📋 체크리스트
- restore로 파일/스테이징 되돌리기
- reset 3모드 영향 범위 구분
- revert vs reset 판단(공유 여부)
-
--amend사용 시점 - reflog로 잃은 커밋 복구
-
git clean -n으로 먼저 확인
🔗 관련 노트
- 01-04-원격-저장소와-협업 — 이전: 원격
- 02-01-브랜치-전략 — 다음(중급): 브랜치 전략
- 03-05-트러블슈팅과-재해-복구 — 심화 복구
- Git-상세-가이드 — 옵션 백과
마지막 업데이트: 2026-06-02