(16) Git reset 3가지 옵션 및 실행 결과 보기

반응형

이전 글에서 reset으로 HEAD가 과거의 커밋을 가리키게 했다.

이때 --hard 옵션을 사용했었는데 reset에서는 --soft, --mixed 이 두 개 더 있다.

이 soft, mixed, hard 옵션을 이해하기 위해선 우리가 처음에 배웠던 작업영역을 이해하고있어야한다.

작업영역이 총 3가지 working directory, staging area, repository 였던 걸 기억할 것이다.

 

작업 영역 3가지가 reset 옵션 3가지의 옵션과 연관이 있다.

어떤 옵션을 쓰냐에 따라 어떤 작업 영역들이 리셋되는지가 달라지기 때문이다. 

 

이 표는 git reset 뒤에 옵션을 쓴 다음 커밋 아이디 앞 4자리를 작성한 상황 (48d8)을 나타낸다.

 

 

▼ --hard 옵션 사용

 

--hard 옵션을 사용한다면 레포지토리는 아이디 48d8을 가지고있는 ver_2의 커밋을 가리키고

스테이징 에어리어와 워킹 디렉토리도 ver_2의 커밋에 있는 모습으로 바뀐다.

그말은 커밋을 한 이후로 워킹 디렉토리에서 했던 작업들은 모두 사라져버린다는 뜻이다.

 

▼ --mixed 옵션 사용

 

--mixed 옵션은 워킹 디렉토리의 모습은 바뀌지 않으며 레포지토리에서 HEAD가 ver_2의 커밋을 가리키고 있더라도

워킹 디렉토리는 가장 최근에 작업했던 모습 그대로라는 뜻이다.

 

▼ --soft 옵션 사용

 

--soft 옵션을 사용하면 스테이징,워킹디렉토리는 아무런 변화 없이 최근에 작업했던 모습 그대로 남아있다.

 

 

여기까지 정리하자면

 

hard,mixed, soft옵션은 git의 세 가지 작업 영역 중 몇개의 영역까지 리셋을 하느냐 이걸로 구분 할 수있다

hard는 표현 그대로 hard하게 모든 영역을 리셋 해버리고

mixed는 중간 정도로 두 개 영역 정도만 리셋 해버리고

soft는 한 개의 영역만 리셋 한다.

 

이 세가지 옵션중에서 원하는 결과에 맞게 옵션을 선택해서 사용하면 된다.

 

만약 헤드가 과거의 커밋을 가리키게 할 뿐만 아니라 커밋 이후로 워킹 디렉토리에서 했던 내용을 모두 없애고 싶을 때  hard 옵션을 쓰면된다.

 

그게아닌 헤드의 위치만 과거의 커밋으로 바꾸고 워킹 디렉토리는 건드리고 싶지 않을 때 mixed,soft 옵션을 쓰면된다.

 

사실 hard 옵션은 별로 권장하지 않는다.

왜냐하면 커밋 이후로 워킹 디렉토리에서 했던 내용들이 다 사라지고 복구를 할 수없기 때문이다.

커밋 이후로 했던 작업들이 전부 사라져도 상관 없을때만 hard 옵션을 쓰고  보통은 soft나 mixed를 쓴다.

 

한번 직접 해보자

 

▼ README.md 파일에 내용 추가 - ###현재까지 Day3완료

 

작성 후 터미널에서 git add READMD.md 실행

 

지금 상태를 워킹 디랙토리와 스테이징 에어리어의 관점에서 생각해보자

 

▼일단 README 파일은 워킹 디렉토리에서 내용이 수정되어있는 상태이고 스테이징 에어리어에도 추가되었다.

 

▼ 이 상태로 커밋 히스토리를 살펴보면 지금 bc92가 최신 커밋인 것을 확인할 수있다.

 

▷--soft 실행하기

soft 옵션을 사용해서 커밋아이디 앞 4자리 bd92 커밋을 9241로 reset을 해보자

 

실행해보면 9241 커밋에 HEAD가 잘 가리키고있는 것을 볼 수있다.

 

워킹 디렉토리는 cat 함수를 써서 확인해보면 방금 작성했던 ###현재까지 Day3 완료가 추가가 되어있다.

즉! 이말은 워킹 디렉토리는 soft 옵션의 특징에 따라 reset에 영향을 받지 않았다는 것을 알 수있다.

마찬가지로 스테이징 에어리어도 (git status) 영향을 받지 않았기에 README 파일이 그대로 있다.

왼쪽은 워킹디렉토리(cat) / 오른쪽은 스테이징 에어리어 (status)

 

※ 만약에 READMD.md 파일 뿐만 아니라 다른 파일이 있다고 해도 그대로 존재 할 것이다.

reset을 했다고 초기화가 되어 사라지는것이아닌 add를 할 때마다 스테이징 에어리어에는 새로운 파일이 추가되는것이기 때문에 원래있던 파일이 더 새로운 버전의 것으로 교체되거나 할뿐이다.

즉 스테이징 에어리어에 있던 것들은 커밋을 하더라도 그것과 상관없이 남아있다는 점을 기억하자.

 

★ --soft : working directory, stage area 그대로!

 

▷ --mixed 실행하기

이번에는 9241 에서 3ea7로 reset을 해보자

 

3ea7로 헤드가 잘 가리키고 있는 것을 볼 수있으며

 

워킹 디렉토리도 여전히 문구가 추가되어있는 최신 상태로 있다.

 

하지만 스테이징 에어리어를 보면 변화가 생겼는데 

스테이징 에어리어에 있던 최신 파일들이 reset 때문에 스테이징 에어리어에서 내려왔다는 것을 확인 할 수있다.

 

▷ --hard 실행하기

3ea7에서 3a4c로 reset을 해보자

 

 

헤드가 3a4c로 잘 가리키고 있는 것을 볼 수있다.

 

실행 전에 헤드 3ea7에서 메시지를 보면 day3 html 파일을 업로드 했었는데

hard 실행함에 따라 헤드 사라지고 3a4c로 바뀌면서 html 파일이 사라진 것을 볼 수있다

 

스테이징 에어리어에서도 html 파일이 사라진 것으로 변화가 보인다

 

hard 주의사항이 뭐였는지 기억해보자

사실 hard 옵션은 별로 권장하지 않는다.
왜냐하면 커밋 이후로 워킹 디렉토리에서 했던 내용들이 다 사라지고 복구를 할 수없기 때문이다.
커밋 이후로 했던 작업들이 전부 사라져도 상관 없을때만 hard 옵션을 쓰고  보통은 soft나 mixed를 쓴다.

 

이렇듯 hard는 정말 다 버리겠단 마인드가 아닌이상 사용하지말자!!

 

 

그런데 이렇게 reset을 해버리면서 과거의 커밋으로 되돌아 가버렸다.

그렇기 때문에 작업내용을 복구하려면 깃허브에 리모트 레포지토리르 사용하면된다. (git pull)

 

 

● 만약 리모트 레포지토리 파일을 불러오지 못한 경우가 있을 경우 

이런 에러 메시지가 뜨는데 

The following untracked working tree files would be overwritten by merge: 내 파일들

Please move or remove them before you merge

 

git pull하면서 충돌이 난 것이라고 하니 일단 untracked 되는 파일이 git이 관리해주고 있지 않은 상태이므로

tracked 상태가 되도록 하자.

 

git add -A

git stash

git pull 

순으로 실행해주면

말끔하게 해결했다.

사실 필자가 저런 에러가 떠서 구글링으로 찾은결과다 

고마워요 지나공님!! https://eocoding.tistory.com

반응형