실수 되돌리기
Git의 가장 강력한 기능 — 잘못된 변경사항을 자신있게 되돌리는 다양한 방법을 배웁니다.
- 상황에 따라 적절한 되돌리기 명령어를 선택할 수 있다
git restore로 워킹 디렉토리 변경사항을 취소할 수 있다git reset의 세 가지 모드를 이해하고 사용할 수 있다git revert로 안전하게 이전 커밋을 취소할 수 있다git stash로 작업을 임시 저장할 수 있다
1. 상황별 되돌리기 선택 가이드
(add 전)
git restore 파일명
(staged 해제)
git restore --staged 파일명
(로컬만)
git reset
(hard / soft / mixed)(이미 push)
git revert (새
커밋으로 취소)(브랜치 이동)
git stash
2. git restore — 파일 수정 취소
# 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가지 모드가 있습니다.
# 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를 사용합니다.
이미 push 했다면 위험
push 후에도 안전
# 특정 커밋 취소 (새 commit 생성)
$ git revert abc1234
Revert "feat: 로그인 기능 추가"
This reverts commit abc1234...
# 가장 최근 커밋 취소
$ git revert HEAD
5. git stash — 임시 저장
작업 중인데 급하게 다른 브랜치로 이동해야 할 때, 커밋하기는 애매하고 변경사항을 잃고 싶지 않을 때 사용합니다.
# 현재 변경사항 임시 저장
$ 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}
git restore 파일명
git restore --staged 파일명
git reset --soft HEAD~N
git reset --hard HEAD~N
git revert HEAD
git stash / git stash pop
이론의 상황별 선택 가이드를 따라, restore / --staged / reset / revert / stash를 직접 만들어보는 실수 상황에 해보세요.
이론의 "파일 수정취소(add 전)" 위치. 수정한 파일을 마지막 커밋 상태로 되돌립니다.
# 설정: 파일 하나 수정
$ 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 변경사항을 삭제하며 복구가
불가능합니다. 실습할 때 쿄내지 않은 파일에 민하세요.
이론의 "add 취소(staged 해제)" 위치. Staging Area에서만 꺼낼 수 있습니다. 파일 내용은 그대로입니다.
$ 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 ← 파일은 유지, 비스페이지만
이론의 "--soft: 커밋만 취소, 스테이징 유지". 커밋을 하나 쨨다가 스테이징에 넣어둘 때 쌤니다.
# 커밋 하나 만들고
$ git add . && git commit -m "fix: 잡못된 커밋"
# --soft로 취소 (파일 + 스테이징 모두 유지)
$ git reset --soft HEAD~1
$ git status
Changes to be committed: ← 스테이징에 네워짐!
이론의 "push 후에는 reset 금지, revert 사용". 새 커밋으로 취소합니다 (히스토리 보존).
# 취소할 커밋을 만들고
$ 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: 최신 커밋
이론의 "stash 동작 방식 다이어그램". 작업 중인데 다른 브랜치로 이동해야 하는 상황입니다.
# 작업 중인 상태
$ 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 ← 복원됨!
이론 외 팔맍 팅! --hard reset 후 "삭제했는데"라면 reflog로 해시를 찾아 복구할 수 있습니다.
# 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가 거부됩니다.
push 후에는 reset 대신 git revert를 사용하세요.
stash는 브랜치에 얽매이지 않아 어떤 브랜치에서든 pop할 수 있습니다.
git stash list로 목록을 확인하고, 필요한 것만
git stash apply stash@{N}으로 적용하세요.