Git reset이란 무엇인가?

git reset은 Git 저장소의 상태를 특정 커밋으로 되돌리는 데 사용되는 강력하고 다재다능한 명령어입니다. 이 명령은 주로 브랜치의 포인터(HEAD)를 과거의 특정 커밋으로 이동시키는 역할을 합니다. 하지만 reset은 어떤 옵션을 사용하느냐에 따라 인덱스(Staging Area)와 워킹 디렉터리(Working Directory)에 미치는 영향이 크게 달라지기 때문에, 각 옵션의 차이를 명확히 이해하고 사용해야 합니다.

Git의 세 가지 상태 영역을 먼저 이해해야 합니다:

  1. 워킹 디렉터리 (Working Directory): 현재 작업 중인 실제 파일들.
  2. 인덱스 (Index / Staging Area): 다음 커밋에 포함될 변경 사항들의 목록.
  3. 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> (기본 옵션)

--mixedgit 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 statusgit log로 현재 상태를 다시 한번 확인하는 것이 좋습니다.

Leave a comment