[git] reset 알아보기

상현·2023년 10월 23일
0

git

목록 보기
5/7
post-thumbnail

로컬 레포지토리를 원격 레포지토리와 연결하는 과정에서 잘 되지 않아 git reset을 남발했더니 파일이 모두 날라간 경험을 했다. 다행히 다시 복구는 했지만...

이 기회에 git reset명령어에 대해 잘 알아보고, 왜 파일이 없어지게 됐는지 알아보자.

HEAD, Index, Working Direcotry

Reset에 대해 알기 전 HEAD, Index, Working Direcotry에 대해 다시 짚고 넘어가면 좋겠다.

HEAD는 현재 브랜치를 가리키는 포인터이며, 브랜치는 브랜치에 담긴 커밋 중 가장 마지막 커밋을 가리킨다.
단순하게 생각하면 HEAD는 현재 브랜치 마지막 커밋의 스냅샷이다.

Index

Index는 바로 다음에 커밋할 것들이다. 이미 앞에서 우리는 이런 개념을 Staging Area 라고 한다. Staging Area 는 사용자가 git commit 명령을 실행했을 때 Git이 처리할 것들이 있는 곳이다.

Index는 Working Directory에서 마지막으로 Checkout 한 브랜치의 파일 목록과 파일 내용으로 채워진다.
이후 파일 변경작업을 하고 변경한 내용으로 Index를 업데이트 할 수 있다. 이렇게 업데이트 하고 git commit 명령을 실행하면 Index는 새 커밋으로 변환된다.

Working Direcotry

위의 두 관리 트리는 내용을 효율적인 형태로 .git 디렉토리에 저장한다. 하지만 그 내용은 사람이 알아보기에 힘들기에 워킹 디렉토리는 실제 파일로 존재한다.
바로 눈에 보이기 때문에 편집하기 쉽고, 커밋하기 전에는 Index(Staging Area)에 올려놓고 얼마든지 변경이 가능하다.

Work Flow

step 1

실습을 위해 git-reset-test라는 폴더를 생성하고 그 폴더를 git init 했다.

아직 아무런 커밋도 하지 않았기 때문에 현재 HEAD는 아무것도 가리키지 않는다.

이제 test.txt 파일을 하나 만들고, git addgit commit까지 해보자.

step 2

이제 test.txt 파일을 수정한 후 다시 위의 과정을 반복해보자.

이 과정을 한 번만 더 해보자.

현재까지 git log

HEAD 이동

reset 명령이 하는 첫 번째 일은 HEAD 브랜치를 이동시킨다. checkout 명령처럼 HEAD가 가리키는 브랜치를 바꾸지는 않는다. HEAD는 계속 현재 브랜치를 가리키고 있고, 현재 브랜치가 가리키는 커밋을 바꾼다.  

soft

git reset --soft HEAD~

git reset --soft명령어는 딱 위의 다이어그램까지만 되돌린다. 가장 최근의 commit 명령어를 되돌린다.

mixed

git reset --[option] HEAD~ 명령어에서 option을 주지 않으면 기본 값으로 mixed가 들어간다.
mixed명령어는 Index까지 이전 HEAD가 가리키는 스냅샷으로 이동한다.

git reset --mixed HEAD~

hard

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 위치IndexWork Tree
soft변경 O변경 X변경 X
mixed변경 O변경 O변경 X
hard변경 O변경 O변경 O

참조

profile
프론트엔드 개발자

0개의 댓글

관련 채용 정보