Head
a, b, c라고 하는 각각의 commit id를 가지고 있는 3개의 버전이 있고 현재 마지막 버전은 c 입니다.
Head는 현재 우리가 작업하고 있는 working directory가 어떤 버전을 기반으로해서 수정 되었는지를 보여줍니다.
현재 head는 master를 가리키고 있고 이 master는 c를 가리키고 있기 때문에 우리가 작업하고 있는 그 코드는 바로 master가 가리키고 있는 c 버전이 만들어진 시점에 working directory에 스냅샷을 기반으로 수정되고 있는 것이다.
Head를 옮긴다는것은 어떤 의미인가요?
Head가 b를 가리키게했다. 그럼 git은 b 버전이 만들어진 시점의 스냅샷을 현재 working copy에 쏟아 부어서 b 버전이 만들어진 시점으로 우리의 working copy를 바꿔 버려요. 그럼 거기서 작업을해서 commit하고 작업을 할 수 있겠죠.
Head를 옮긴다는것은 우리의 working directory를 그 버전의 상태로 바꾸겠다.
head가 어떤 버전을 가리키고 있다는것은 우리의 working directory는 저 버전으로 수정되고 있다는 의미에요.
Git checkout b
Checkout은 head를 바꾸는 것이다.
우리의 working copy는 b 버전을 기반으로 하게 된다.
Git reset b
Reset은 head가 branch를 가리키고 있을때 branch가 가리키고있는 버전을 바꿉니다.
우리의 working copy는 b 버전을 기반으로 하게 된다.
-공통점
Reset을 하건 checkout을 하건 우리의 working copy는 똑같은 상태가 된다.
-차이점
Reset | Checkout |
master가 가리키고 있는 버전을 바꿨어요. | head를 바꿨을뿐 master는 안바꿨다. |
Git log를 통해 확인한 결과, reset을하면 아무도 c 를 바라보고있지 않기 때문에 c는 눈에 보이지 않습니다. | Checkout을 했을때 c는 여전히 master 브랜치가 가리키고 있기 때문에 git log --all 옵션을 줘서 확인을 하게되면 c를 볼수가 있다. |
Delete 효과. (C는 지워지지 않았고 눈에 보이지 않을 뿐이다.) |
Delete 느낌이 없음. |
Git reset master
현재 head가 가리키고있는 master가 가리키고있는 버전으로 바꿔라. 변동사항 없음.
Git checkout master
Git reset (c의 commit id)
C의 commit id를 알고 있으면 reset을 통해 복원을 할 수 있다.
Master는 c 버전을 가리키게될 것이고 working copy는 c의 상태로 변경 된다.
Git log를 하면, c가 보이게 됨.
Git checkout c
Head가 master -> c를 가리키는 것으로 변경될 것이고 working copy는 c의 상태로 되고 head는 어떠한 branch도 가리키지 않는 상태가 된다. => Detached head
Git reset --hard 옵션에 대해 살펴 보자.
Git init git4-reset-revert-1
저장소 초기화
Work.txt 생성
Git add work.txt
Work.txt를 staging area에 add
Git commit -am "work 1"
"work 1" 버전 생성
위와 같은 방식으로 work.txt에 2, 3 추가 및 work 2, work 3 버전생성
Work.txt
Git commit -am "work 2"
work.txt
Git commit -am "work 3"
Git --no-pager log --oneline
Git reset --hard 81b96b8
"work 2" 버전으로 reset
Head가 가리키는 master는 "work 2" 버전을 가리키게 되면서 "work 3"가 삭제된 효과가 난다.
Git reset --hard 6cbb59c
"work 3" 버전으로 복원
Git reset --soft 81b96b8
"work 2" 버전으로 reset
work.txt 파일이 staging area에 올라가있는 상태이며, head는 "work 2" 버전을 가리키고 있는데 내용은 "work 3" 버전임.
work.txt에 1 작성, stage area에 add, commit -m "A"후 repository에 저장.
work.txt를 2로 수정, stage area에 add, commit -m "B"후 repository에 저장. Master는 B를 가리키고 head는 기본 branch인 master를 가리킴.
Work.txt를 3으로 변경, stage area에 add, commit -m "C"후 repository에 저장. Master는 C를 가리킨다.
Git reset -- (B의 commit id)
옵션이 soft, mixed, hard 일때는 어떻게 되는가?
옵션이 soft, mixed, hard건 master 브랜치는 무조건 B를 가리키게 됩니다.
Repository 상에서 head가 가리키고 있는 work.txt 파일의 내용은 soft, mixed, hard 전부 2가 된다.
--soft를 하게되면,
1. working dir의 파일을 전혀 건드리지 않습니다. 현재 working dir의 파일 내용은 3이니까 그대로 3이 되구요.
2. Staging area도 건드리지 않아요. 그대로 3이 됩니다.
3. Repository는 2로 변경
-- mixed
Working dir는 손대지 않아 그대로 3.
Staging area, repository는 2가 됩니다.
-- hard
Working dir, stage area, repository 모두 똑같은 2가 됩니다.
심플 하지만 우리가 작업하고 있었던 내용이 날라 간다라고하는 굉장히 위험한 요소를 가지고 있음.
'Git' 카테고리의 다른 글
Git Collaboration(3) (0) | 2024.02.21 |
---|---|
Git Collaboration(2) (0) | 2024.02.21 |
Git Collaboration(1) (0) | 2024.02.20 |
Git branch & conflict(7) (0) | 2024.02.19 |
Git branch & conflict(6) (0) | 2024.02.19 |