git restore, git reset, git revert, git stash를 각각 언제 써야 하는지 명확히 구분한다.
되돌리기
"방금 한 작업을 취소하고 싶다"는 상황은 자주 옵니다. Git에는 되돌리기 명령이 여러 개 있고, 각각 쓰는 시점이 다릅니다. 헷갈리기 쉬우니 언제 무엇을 쓰는지를 분명히 정리합니다.
학습 목표
git restore로 작업 변경과 스테이징을 취소한다.git reset의 soft·mixed·hard 차이를 이해한다.git revert로 안전하게 커밋을 되돌린다.git stash로 변경을 잠시 치워 둔다.
한눈에 보는 선택 기준
| 상황 | 명령 |
|---|---|
| 아직 커밋 안 한 파일 변경을 버리고 싶다 | git restore <file> |
| 스테이징(add)만 취소하고 싶다 | git restore --staged <file> |
| 커밋을 취소하고 싶다(아직 push 전) | git reset |
| 이미 push한 커밋을 되돌리고 싶다 | git revert |
| 작업을 잠시 치워 두고 싶다 | git stash |
git restore — 미커밋 변경 취소
아직 커밋하지 않은 변경을 되돌립니다.
git restore index.html # 파일 수정을 마지막 커밋 상태로 되돌림 (변경 버림)
git restore --staged index.html # 스테이징만 취소 (수정 내용은 유지)
git restore . # 작업 디렉터리의 모든 변경 되돌리기
git restore <file>은 변경을 영구히 버리므로 신중히 사용합니다.
git reset — 커밋 되돌리기 (push 전)
reset은 현재 브랜치의 끝(HEAD)을 과거 커밋으로 옮깁니다. 세 가지 모드가 핵심입니다.
git reset --soft HEAD~1 # 커밋만 취소, 변경은 스테이징 상태로 남김
git reset --mixed HEAD~1 # (기본값) 커밋 취소, 변경은 작업 디렉터리로 남김
git reset --hard HEAD~1 # 커밋과 변경을 모두 버림 ⚠️ 위험
비교하면 이렇습니다.
| 모드 | 커밋 | 스테이징 | 작업 파일 |
|---|---|---|---|
--soft | 취소 | 유지(스테이징됨) | 유지 |
--mixed | 취소 | 취소 | 유지 |
--hard | 취소 | 취소 | 삭제 |
예를 들어 "마지막 커밋 메시지만 다시 쓰고 싶다"면 --soft로 되돌린 뒤 다시 커밋하거나, 더 간단히는 --amend를 씁니다.
git commit --amend -m "고친 메시지" # 마지막 커밋을 새로 다시 만듦
⚠️
reset --hard는 커밋하지 않은 변경을 영구 삭제합니다. 또reset은 이력을 바꾸므로, 이미 원격에 push한 커밋에는 쓰지 마세요. 협업자와 이력이 어긋납니다.
git revert — 안전하게 되돌리기 (push 후)
이미 공유(push)된 커밋을 되돌릴 때는 revert를 씁니다. 기존 커밋을 지우지 않고, 그 변경을 상쇄하는 새 커밋을 추가합니다. 이력이 보존되므로 협업에 안전합니다.
git revert a1b2c3d # a1b2c3d 의 변경을 되돌리는 새 커밋 생성
git stash — 변경을 잠시 치워 두기
작업 중인데 급히 다른 브랜치로 가야 할 때, 아직 커밋하기는 이른 변경을 임시로 보관합니다.
git stash # 현재 변경을 치워 두고 깨끗한 상태로
git stash list # 치워 둔 목록 보기
git stash pop # 가장 최근 stash 를 다시 꺼내며 목록에서 제거
git stash apply # 꺼내되 목록에는 남겨 둠
git stash drop # 특정 stash 버리기
# 예: 작업 중 급한 버그를 main 에서 고쳐야 할 때
git stash # 작업 임시 저장
git switch main # 버그 수정 브랜치로 이동
# ... 수정 후 ...
git switch feature/x # 원래 브랜치로 복귀
git stash pop # 하던 작업 복원
요약
미커밋 변경은 git restore, 아직 push 전 커밋은 git reset(soft/mixed/hard), 이미 push한 커밋은 git revert, 잠깐 치워 둘 땐 git stash를 씁니다. 특히 공유된 이력에는 reset 대신 revert를 쓰는 것이 핵심 원칙입니다. 다음 강좌에서는 머지 충돌 해결과 리베이스를 배웁니다.
댓글 0
“Git & GitHub” 강좌에 대한 댓글입니다.