Git reset
이란 무엇인가?
git reset
은 Git 저장소의 상태를 특정 커밋으로 되돌리는 데 사용되는 강력하고 다재다능한 명령어입니다. 이 명령은 주로 브랜치의 포인터(HEAD
)를 과거의 특정 커밋으로 이동시키는 역할을 합니다. 하지만 reset
은 어떤 옵션을 사용하느냐에 따라 인덱스(Staging Area)와 워킹 디렉터리(Working Directory)에 미치는 영향이 크게 달라지기 때문에, 각 옵션의 차이를 명확히 이해하고 사용해야 합니다.
Git의 세 가지 상태 영역을 먼저 이해해야 합니다:
- 워킹 디렉터리 (Working Directory): 현재 작업 중인 실제 파일들.
- 인덱스 (Index / Staging Area): 다음 커밋에 포함될 변경 사항들의 목록.
- HEAD: 현재 브랜치가 가리키는 마지막 커밋.
git reset
의 세 가지 옵션
git reset
의 핵심은 이 세 가지 영역 중 어디까지를 되돌릴 것인지를 결정하는 것입니다.
1. git reset --soft <commit>
--soft
옵션은 가장 소극적인 리셋입니다. 이 명령은 오직 HEAD
포인터만 지정된 커밋으로 이동시킵니다. 인덱스와 워킹 디렉터리는 전혀 건드리지 않습니다.
- 동작:
HEAD
를<commit>
으로 이동시킨다. - 결과:
HEAD
가 가리키는 커밋이 변경됩니다.- 인덱스(Staging Area)는 그대로 유지됩니다. 즉,
reset
이전의HEAD
와<commit>
사이의 모든 변경 사항이 스테이징된 상태로 남아있습니다. - 워킹 디렉터리의 파일들은 전혀 변경되지 않습니다.
- 주요 사용 사례: 여러 개의 커밋을 하나로 합치고 싶을 때 유용합니다. 예를 들어, 최근 3개의 커밋을 취소하고 하나의 커밋으로 다시 만들고 싶을 때
git reset --soft HEAD~3
을 실행하면, 지난 3개 커밋의 모든 변경 사항이 스테이징된 상태로 준비됩니다.
명령어 예시:
# 마지막 커밋을 취소하고, 해당 변경 사항은 스테이징된 상태로 둔다.
git reset --soft HEAD~
2. git reset --mixed <commit>
(기본 옵션)
--mixed
는 git reset
의 기본 옵션입니다. reset
명령을 옵션 없이 실행하면 --mixed
로 동작합니다. 이 옵션은 HEAD
와 인덱스를 지정된 커밋의 상태로 되돌립니다.
- 동작:
HEAD
와 인덱스를<commit>
의 상태로 되돌린다. - 결과:
HEAD
가 가리키는 커밋이 변경됩니다.- 인덱스가
<commit>
시점의 상태로 초기화됩니다. 즉, 스테이징되었던 모든 변경 사항이 취소되고 워킹 디렉터리로 내려옵니다. - 워킹 디렉터리의 파일들은 변경되지 않습니다.
- 주요 사용 사례: 커밋은 취소하고 싶지만, 파일의 변경 내용은 보존하고 싶을 때 사용합니다. 스테이징된 내용을 수정하거나 일부만 다시 스테이징하고 싶을 때 유용합니다.
명령어 예시:
# 마지막 커밋을 취소하고, 해당 변경 사항은 워킹 디렉터리에만 남겨둔다 (스테이징 해제).
git reset --mixed HEAD~ # `git reset HEAD~`와 동일
3. git reset --hard <commit>
--hard
는 가장 강력하고 파괴적인 옵션입니다. 이 명령은 HEAD
, 인덱스, 그리고 워킹 디렉터리까지 모두 지정된 커밋의 상태로 되돌립니다.
- 동작:
HEAD
, 인덱스, 워킹 디렉터리를 모두<commit>
의 상태로 되돌린다. - 결과:
HEAD
가 가리키는 커밋이 변경됩니다.- 인덱스가
<commit>
시점의 상태로 초기화됩니다. - 워킹 디렉터리의 모든 변경 사항이 영구적으로 삭제됩니다.
<commit>
이후의 모든 작업 내용이 사라지므로 사용에 극도의 주의가 필요합니다.
- 주요 사용 사례: 최근의 모든 변경 사항(커밋, 스테이징, 워킹 디렉터리 작업 내용)을 완전히 버리고 특정 시점으로 깨끗하게 돌아가고 싶을 때 사용합니다.
명령어 예시:
# 마지막 커밋과 관련된 모든 변경 사항(스테이징, 워킹 디렉터리 내용 포함)을 완전히 삭제한다.
git reset --hard HEAD~
요약
옵션 | HEAD (브랜치 포인터) |
인덱스 (Staging Area) | 워킹 디렉터리 (파일) | 주요 용도 |
---|---|---|---|---|
--soft |
이동 (O) | 변경 없음 (X) | 변경 없음 (X) | 커밋 합치기 (모든 변경 사항을 스테이징) |
--mixed |
이동 (O) | 리셋 (O) | 변경 없음 (X) | 커밋 취소 및 스테이징 수정 (변경 사항 보존) |
--hard |
이동 (O) | 리셋 (O) | 리셋 (O) | 모든 변경 사항 완전 폐기 |
주의사항
git reset
은 로컬 저장소의 커밋 히스토리를 변경하는 작업입니다. 이미 원격 저장소에 푸시(push)한 커밋을reset
으로 되돌린 후 다시 푸시하려면--force
옵션이 필요합니다. 이는 팀원들의 히스토리와 충돌을 일으킬 수 있으므로, 공유된 브랜치에서는git reset
대신git revert
를 사용하는 것이 더 안전합니다.git reset --hard
는 되돌릴 수 없는 작업이므로, 실행하기 전에git status
나git log
로 현재 상태를 다시 한번 확인하는 것이 좋습니다.
Leave a comment