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