몽땅뚝딱 개발자

[git] reset 본문

Development/Git

[git] reset

레오나르도 다빈츠 2023. 5. 21. 20:25

 

 

 

 


 

 

 

예를 들어 file.txt 하나를 수정하고 커밋하고 세번을 반복한다고 생각해보자.

 

 

◽️ 1단계: HEAD 이동

$ git reset --soft HEAD~

1. reset 명령은 HEAD를 이동시킨다.

checkout처럼 HEAD가 가리키는 브랜치를 바꾸지는 않는다.

HEAD는 계속 현재 브랜치를 가리키고 있고 현재 브랜치가 가리키는 커밋을 바꾼다.

 

2. reset 명령은 가장 최근의 git commit 명령을 되돌린다.

git commit 명령을 실행하면

1) Git은 새로운 커밋을 생성하고

2) HEAD가 가리키는 브랜치가 새로운 커밋을 가리키도록 업데이트한다.

 

reset 명령 뒤에 HEAD~ (HEAD의 부모 커밋)을 주면 Index나 워킹 디렉토리는 그대로 두고 브랜치가 가리키는 커밋만 이전으로 되돌린다.

 

 

 

 

◽️ 2단계: Index 업데이트

$ git reset [--mixed] HEAD~

 

reset은 Index를 현재 HEAD가 가리키는 스냅샷으로 업데이트 할 수 있다.

reset 명령을 실행할 떄 아무 옵션도 주지 않으면 기본적으로 --mixed 옵션으로 동작한다.

 

1) 가리키는 대상을 최근의 커밋으로 되돌리며 (1단계와 같다.)

2) Staging Area를 비운다. (=git commit도 되돌린다. git add 명령도 되돌린다.)

 

 

 

 

 

◽️ 3단계: 워킹 디렉토리 업데이트

$ git reset --hard HEAD~

1) 가리키는 대상을 최근의 커밋으로 되돌리며 (1단계와 같다.)

2) Staging Area를 비운다. (2단계와 같다.)

3) 워킹 디렉토리의 내용까지도 되돌린다.

 

--hard 옵션은 reset 명령을 위험하게 만드는 유일한 옵션이다.

Git에는 데이터를 실제로 삭제하는 방법이 별로 없는데 그 방법 중에 하나이다. reset 명령을 어떻게 사용하더라도 간단히 결과를 되돌릴 수 있지만 --hard 옵션은 되돌리는 것이 불가능하다. 이 옵션은 워킹 디렉토리의 파일까지 강제로 덮어쓴다.

 

 

 

 

◽️ 정리

1. HEAD가 가리키는 브랜치를 옮긴다. (--soft 옵션이 붙으면 여기까지)
2. Index를 HEAD가 가리키는 상태로 만든다. (--hard 옵션이 붙지 않았으면 여기까지)
3. 워킹 디렉토리를 Index의 상태로 만든다.

 

 

 


 

◽️ 경로를 주고 Reset 하기

$ git reset file.txt

 

파일을 unstaged 상태로 만든다. 이 명령은 git add와 정확히 반대로 동작한다.

 

 

 


 

 

 

출처 및 참고

프로 Git, Scott Chacon, 2014

 

 

 

 

Comments