Part 2 0 / 9 챕터 완료
Chapter 07

실수 되돌리기

Git의 가장 강력한 기능 — 잘못된 변경사항을 자신있게 되돌리는 다양한 방법을 배웁니다.

🎯 이 챕터를 마치면
  • 상황에 따라 적절한 되돌리기 명령어를 선택할 수 있다
  • git restore로 워킹 디렉토리 변경사항을 취소할 수 있다
  • git reset의 세 가지 모드를 이해하고 사용할 수 있다
  • git revert로 안전하게 이전 커밋을 취소할 수 있다
  • git stash로 작업을 임시 저장할 수 있다

🗺️ 1. 상황별 되돌리기 선택 가이드

어떤 명령어를 써야 할까?
파일 수정취소
(add 전)
git restore 파일명
add 취소
(staged 해제)
git restore --staged 파일명
커밋 지우기
(로컬만)
git reset (hard / soft / mixed)
커밋 안전 취소
(이미 push)
git revert (새 커밋으로 취소)
임시 저장
(브랜치 이동)
git stash

↩️ 2. git restore — 파일 수정 취소

Git Bash
# Working Directory 수정 취소 (마지막 커밋 상태로)
$ git restore index.html

# Staging Area에서 되돌리기 (unstage)
$ git restore --staged index.html

# 모든 파일 수정 취소
$ git restore .
🚨

git restore로 Working Directory 변경사항을 취소하면 복구 불가능합니다. 신중하게 사용하세요!

3. git reset — 커밋 되돌리기

git reset은 HEAD 포인터를 특정 커밋으로 이동시킵니다. 3가지 모드가 있습니다.

reset 세 가지 모드 비교
💥
--hard
× 커밋 삭제
× 스테이징 초기화
× 파일 변경사항 삭제
⚠️ 가장 위험
🔧
--mixed (기본)
× 커밋 삭제
× 스테이징 초기화
✅ 파일은 유지
👍 적당히 안전
💚
--soft
× 커밋 삭제
✅ 스테이징 유지
✅ 파일 유지
✨ 가장 안전
Git Bash
# 1단계 이전으로 되돌리기 (파일은 유지)
$ git reset HEAD~1
# 또는 --mixed 명시
$ git reset --mixed HEAD~1

# 커밋 + 스테이징 + 파일 모두 되돌리기 (주의!)
$ git reset --hard HEAD~1

# 커밋만 취소, 스테이징은 유지 (재커밋 목적)
$ git reset --soft HEAD~1

🔄 4. git revert — 안전한 취소

이미 GitHub에 push한 커밋은 절대 reset하지 마세요! 대신 git revert를 사용합니다.

reset vs revert 차이
⚠️ reset — 히스토리 삭제
● c1
● c2
✕ c3 ← 삭제됨!
역사 자체를 지워버림
이미 push 했다면 위험
✅ revert — 새 커밋으로 취소
● c1
● c2
● c3
● c4 "revert c3" ← 새로 추가
히스토리 보존
push 후에도 안전
Git Bash
# 특정 커밋 취소 (새 commit 생성)
$ git revert abc1234
Revert "feat: 로그인 기능 추가"
This reverts commit abc1234...

# 가장 최근 커밋 취소
$ git revert HEAD

🗄️ 5. git stash — 임시 저장

작업 중인데 급하게 다른 브랜치로 이동해야 할 때, 커밋하기는 애매하고 변경사항을 잃고 싶지 않을 때 사용합니다.

stash 동작 방식
📁
Working Dir
수정 중인 파일
git stash
📦
Stash Stack
임시 보관함
git stash pop
📁
Working Dir
복원됨!
Git Bash
# 현재 변경사항 임시 저장
$ git stash
Saved working directory and index state WIP on main: abc1234

# 저장된 stash 목록 확인
$ git stash list
stash@{0}: WIP on main: abc1234 feat: 기능A 개발 중
stash@{1}: WIP on main: 9bc3d2a 이전 작업

# 가장 최근 stash 복원 + 목록에서 제거
$ git stash pop

# stash 내용 확인 (삭제 없이)
$ git stash apply stash@{0}
✅ 이해도 체크
파일을 수정했지만 커밋 전이라면 어떤 명령어로 되돌리나?
reset --hard, --mixed, --soft의 차이를 설명할 수 있다
push 후에는 reset 대신 revert를 써야 하는 이유를 안다
stash로 작업을 임시 저장하고 복원하는 방법을 안다
📌 이 챕터 명령어
git restore 파일명
파일 수정 취소 (add 전)
git restore --staged 파일명
Staging Area에서 되돌리기
git reset --soft HEAD~N
N개 커밋 취소 (파일/스테이징 유지)
git reset --hard HEAD~N
N개 커밋 + 파일 모두 취소 (위험)
git revert HEAD
최근 커밋을 새 커밋으로 취소
git stash / git stash pop
변경사항 임시 저장 / 복원
🔨 실습 해보기
실수 되돌리기 5가지 실제로 써보기

이론의 상황별 선택 가이드를 따라, restore / --staged / reset / revert / stash를 직접 만들어보는 실수 상황에 해보세요.

0 / 6 완료
A
파일 잡못 수정 후 원래대로 되돌리기 (add 전)

이론의 "파일 수정취소(add 전)" 위치. 수정한 파일을 마지막 커밋 상태로 되돌립니다.

Git Bash
# 설정: 파일 하나 수정
$ echo "잠못수정" >> index.html
$ git status
modified: index.html

# git restore로 되돌리기
$ git restore index.html
$ git status
nothing to commit, working tree clean  ← 원래대로!
🚨

git restore는 Working Directory 변경사항을 삭제하며 복구가 불가능합니다. 실습할 때 쿄내지 않은 파일에 민하세요.

B
git add 했다가 되돌리기 (--staged)

이론의 "add 취소(staged 해제)" 위치. Staging Area에서만 꺼낼 수 있습니다. 파일 내용은 그대로입니다.

Git Bash
$ echo "수정" >> index.html
$ git add index.html
$ git status
Changes to be committed: index.html  ← Staging에 있음

$ git restore --staged index.html
$ git status
Changes not staged for commit: index.html  ← 파일은 유지, 비스페이지만
--staged 후 상태
Working Dir
🟠 index.html (Modified)
restore --staged
Staging Area
(비어있음)
git commit
Repository
◆ 이전 커밋
C
커밋 취소 — reset --soft (가장 안전)

이론의 "--soft: 커밋만 취소, 스테이징 유지". 커밋을 하나 쨨다가 스테이징에 넣어둘 때 쌤니다.

Git Bash
# 커밋 하나 만들고
$ git add . && git commit -m "fix: 잡못된 커밋"

# --soft로 취소 (파일 + 스테이징 모두 유지)
$ git reset --soft HEAD~1
$ git status
Changes to be committed:  ← 스테이징에 네워짐!
D
push 후 취소 — revert (git 히스토리 보존)

이론의 "push 후에는 reset 금지, revert 사용". 새 커밋으로 취소합니다 (히스토리 보존).

Git Bash
# 취소할 커밋을 만들고
$ git add . && git commit -m "feat: 잘못된 기능 추가"

# revert로 한 단계 앞 커밋 취소 (새 커밋 생성)
$ git revert HEAD
[main 3e8d1f0] Revert "feat: 잘못된 기능 추가"
1 file changed, 1 deletion(-)

$ git log --oneline
3e8d1f0 Revert "feat: 잘못된 기능 추가"  ← 취소 커밋 추가됨!
b7d9e1f feat: 잘못된 기능 추가
a3f82bc feat: 최신 커밋
E
작업 중 급한 브랜치 이동 시나리오 — stash

이론의 "stash 동작 방식 다이어그램". 작업 중인데 다른 브랜치로 이동해야 하는 상황입니다.

Git Bash
# 작업 중인 상태
$ echo "미완성 작업" >> index.html
$ git status
modified: index.html  ← 커밋하기 애매한 중간 상태

# stash로 임시 보관
$ git stash
Saved working directory and index state WIP on main

# 다른 브랜치로 이동 (WD 간당)
$ git switch feature/urgent-fix

# 작업 후 main으로 돌아와서 복원
$ git switch main
$ git stash pop
On branch main
Changes not staged for commit:
        modified:   index.html  ← 복원됨!
F
reflog으로 --hard reset 후 복구

이론 외 팔맍 팅! --hard reset 후 "삭제했는데"라면 reflog로 해시를 찾아 복구할 수 있습니다.

Git Bash
# reflog: Git의 모든 작업 이력
$ git reflog
a3f82bc HEAD@{0}: reset: moving to HEAD~1
b7d9e1f HEAD@{1}: commit: feat: 업데이트   ← 여기로 돌아가요!

# 해시를 직접 지정해 이동
$ git reset --hard b7d9e1f
🧪 이런 상황, 어떻게 할까요?
😰git reset --hard 후 "안 되는데!"라면?

--hard는 WD 변경사항도 지우지만, reflog에 커밋이 남아있습니다.

git reflog으로 해시를 찾고 git reset --hard 해시로 복구하세요.

😕push 후 reset했더니 팁원이 오류가 나요

팀원 저장소와 히스토리가 달라지면 push가 거부됩니다.

push 후에는 reset 대신 git revert를 사용하세요.

😱stash한 걸 잊고 다른 브랜치에서 pop했어요

stash는 브랜치에 얽매이지 않아 어떤 브랜치에서든 pop할 수 있습니다.

git stash list로 목록을 확인하고, 필요한 것만 git stash apply stash@{N}으로 적용하세요.

🎉 모든 Step 완료! 실수 되돌리기 5가지를 직접 해보았습니다.