로컬 레포지토리를 원격 레포지토리와 연결하는 과정에서 잘 되지 않아 git reset
을 남발했더니 파일이 모두 날라간 경험을 했다. 다행히 다시 복구는 했지만...
이 기회에 git reset
명령어에 대해 잘 알아보고, 왜 파일이 없어지게 됐는지 알아보자.
Reset에 대해 알기 전 HEAD, Index, Working Direcotry에 대해 다시 짚고 넘어가면 좋겠다.
HEAD는 현재 브랜치를 가리키는 포인터이며, 브랜치는 브랜치에 담긴 커밋 중 가장 마지막 커밋을 가리킨다.
단순하게 생각하면 HEAD는 현재 브랜치 마지막 커밋의 스냅샷이다.
Index는 바로 다음에 커밋할 것들이다. 이미 앞에서 우리는 이런 개념을 Staging Area 라고 한다. Staging Area 는 사용자가 git commit
명령을 실행했을 때 Git이 처리할 것들이 있는 곳이다.
Index는 Working Directory에서 마지막으로 Checkout 한 브랜치의 파일 목록과 파일 내용으로 채워진다.
이후 파일 변경작업을 하고 변경한 내용으로 Index를 업데이트 할 수 있다. 이렇게 업데이트 하고 git commit
명령을 실행하면 Index는 새 커밋으로 변환된다.
위의 두 관리 트리는 내용을 효율적인 형태로 .git
디렉토리에 저장한다. 하지만 그 내용은 사람이 알아보기에 힘들기에 워킹 디렉토리는 실제 파일로 존재한다.
바로 눈에 보이기 때문에 편집하기 쉽고, 커밋하기 전에는 Index(Staging Area)에 올려놓고 얼마든지 변경이 가능하다.
실습을 위해 git-reset-test라는 폴더를 생성하고 그 폴더를 git init
했다.
아직 아무런 커밋도 하지 않았기 때문에 현재 HEAD는 아무것도 가리키지 않는다.
이제 test.txt
파일을 하나 만들고, git add
와 git commit
까지 해보자.
이제 test.txt
파일을 수정한 후 다시 위의 과정을 반복해보자.
이 과정을 한 번만 더 해보자.
현재까지 git log
reset
명령이 하는 첫 번째 일은 HEAD 브랜치를 이동시킨다. checkout
명령처럼 HEAD가 가리키는 브랜치를 바꾸지는 않는다. HEAD는 계속 현재 브랜치를 가리키고 있고, 현재 브랜치가 가리키는 커밋을 바꾼다.
git reset --soft HEAD~
git reset --soft
명령어는 딱 위의 다이어그램까지만 되돌린다. 가장 최근의 commit
명령어를 되돌린다.
git reset --[option] HEAD~
명령어에서 option을 주지 않으면 기본 값으로 mixed
가 들어간다.
mixed
명령어는 Index까지 이전 HEAD가 가리키는 스냅샷으로 이동한다.
git reset --mixed HEAD~
hard
옵션을 사용하면 Working Directory까지 변경을 한다. 즉, 파일까지 전부 이전 HEAD로 돌린다.
⚠️ 경고
hard
옵션은git reset
명령어를 위험하게 만드는 아주 조심해야 하는 녀석이다.
Git에는 실제 데이터까지 삭제하게 하는 방법이 별로 없는데 이 녀석이 그중 하나이다. (그래서 실수로 프로젝트 폴더가 날라가서 식겁한적이 있다..)
reset
명령어는 어떻게 사용하더라도 그 결과를 간단하게 다시 되돌릴 수 있지만.hard
옵션을 주면 되돌릴 수 없다.
이 예제는 version 3를 커밋으로 보관하고 있기 때문에reflog
명령어를 이용하요 복구할 수 있지만, 커밋한적이 없다면 복구할 방법이 없다.
🗒️ reset 전의 commit은 ‘ORIG_HEAD’ 라는 이름으로 참조할 수 있다.
실수로 reset을 한 경우$ git reset --hard ORIG_HEAD
명령어를 통해 reset 실행 전의 상태로 되돌릴 수 있다.
git reset
은 작업 내용을 이전 커밋으로 되돌린다.
git reset
명령어는 다음과 같은 순서를 통해 진행된다.
1. 브랜치의 HEAD 위치를 옮긴다. (--soft
옵션 적용시 여기까지)
2. Index(Staging Area)를 지정한 HEAD가 가리키는 상태로 만든다. (--mixed
옵션 적용시 여기까지, 기본 값)
3. 워킹 디렉토리를 Index의 상태로 덮어쓴다.
모드명 | HEAD 위치 | Index | Work Tree |
---|---|---|---|
soft | 변경 O | 변경 X | 변경 X |
mixed | 변경 O | 변경 O | 변경 X |
hard | 변경 O | 변경 O | 변경 O |
참조