이전 글에서 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 파일이 그대로 있다.
※ 만약에 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
'Git' 카테고리의 다른 글
(17) Git - branch (브랜치) (0) | 2024.09.06 |
---|---|
Git (12)~(16) 까지 커맨드 정리 (0) | 2024.09.06 |
(15) Git - HEAD 의 의미 / git reset (0) | 2024.09.05 |
(14) Git - 커밋 A 와 B의 사이의 커밋 확인하기 [git diff] (0) | 2024.09.05 |
[+α] Git 긴 커맨드 사용할때 alias 설정 (커맨드의 별명) (0) | 2024.09.04 |