git reset
1. Git Reset 이란?
git reset
은 Git에서 브랜치의 현재 위치(HEAD)를 다른 커밋으로 되돌리거나, 스테이징 상태를 해제하거나, 작업 디렉토리까지 초기화하는 명령어이다.
"방금 했던 커밋/추가/수정... 지우고 다시 하고 싶어!" 할 때 사용한다.
2. reset 동작 범위 비교
옵션 | HEAD 이동 | Staging Area 변경 | 작업 디렉토리 변경 |
---|---|---|---|
| ✅ O | ❌ 그대로 | ❌ 그대로 |
| ✅ O | ✅ 초기화 | ❌ 그대로 |
| ✅ O | ✅ 초기화 | ✅ 완전 초기화 |
3. 시각화 예시
현재 상태:
A---B---C---D (HEAD)
↑
현재 브랜치
git reset --soft B
결과:
A---B (HEAD)
↑
스테이징 영역에는 C, D의 변경사항이 유지됨
git reset --hard B
결과:
A---B (HEAD)
↑
C, D 커밋은 완전히 제거됨 (작업 디렉토리도 초기화)
4. 옵션별 설명
🔹 --soft
git reset --soft <커밋해시>
- 커밋만 되돌림
- 변경사항은 스테이징 상태로 유지됨
📌 사용 예:
커밋 메시지를 실수했을 때, 커밋만 취소하고 다시 커밋하고 싶을 때
🔹 --mixed
(기본 옵션)
git reset --mixed <커밋해시>
- 커밋 & 스테이징만 초기화
- 작업 디렉토리는 그대로 남음
📌 사용 예:
add만 하고 아직 커밋 안 했을 때,
git add
를 되돌리고 싶을 때
🔹 --hard
git reset --hard <커밋해시>
- 커밋, 스테이징, 작업 디렉토리 전부 초기화
📌 사용 예:
모든 변경사항을 완전히 삭제하고 과거 상태로 돌리고 싶을 때
⚠️ 복구 불가한 경우가 많으므로 주의!
5. 실습 예시
# 초기 커밋 3개 생성
echo "a" > a.txt && git add . && git commit -m "A"
echo "b" > b.txt && git add . && git commit -m "B"
echo "c" > c.txt && git add . && git commit -m "C"
git log --oneline
# 마지막 커밋을 취소하고 이전 상태로 복귀
git reset --soft HEAD~1 # C는 스테이징 상태로 돌아감
git reset --mixed HEAD~1 # C는 unstage됨
git reset --hard HEAD~1 # C는 완전히 삭제됨
6. git reset
vs git revert
비교
명령어 | 기존 커밋을 | 새로운 커밋? | 안전성 | 사용처 |
---|---|---|---|---|
| 삭제함 | ❌ X | 위험 | 혼자 쓰는 브랜치, 최근 실수 복구 |
| 보존함 | ✅ O | 안전 | 협업 브랜치, 히스토리 보존 필요 시 |
✅ 요약
옵션 | 설명 | 주의 사항 |
---|---|---|
| 커밋만 취소, staging은 그대로 | 메시지 실수 복구에 유용 |
| 커밋 + staging 취소, 작업물은 유지 | 기본값 |
| 커밋 + staging + 작업물 전부 취소 | 되돌릴 수 없음 *주의 |