Git공부 [11. GIT 원리 정리]
시작 원리를 정리하기 앞서 지금까지 branch, merge등을 학습하며 어렴풋이 원리를 이해하고 있었지만 좀더 확실히 정리하기 위해 이 글을 포스팅한다.
🔐 0. Checkout 원리
git의 기본원리를 이해하기 전에 가장 중요한 부분은 checkout이다 이 명령어는 단순하게 해당 버전으로 전환한다고 이해하고 있었는데 내가 공부하며 느낀점은 약간 C언어의 포인터나 다른언어들의 참조느낌이 많이 난다. git의 개발부분까지 뜯어볼 수 없으니..
처음 git init으로 git을 초기화 하면 .git파일이 만들어지게 되는데 이때 많이 봤던 head라는 것이 만들어 진다. 해당 폴더로 가면 실제로 HEAD라는 파일이 존재(안에 master라고 적혀 있음)
또한, head만 생기는 것이 아닌 기본적인 master branch가 생기게 된다. 맨 처음 master branch위에서 다양한 버전을 만들어 나가게 되는 것
위 처럼 처음 git init을 하게 되면 head가 생기고 head가 기본 branch인 master를 가리키게 된다.
이는 다르게 master branch에 checkout되어 있다고도 해석 가능하다.
- (master) 는 HEAD -> master의 상태인것.
이 상태에서 새로운 버전하나(예를 들어 1버전)를 생성하면 master branch가 1 버전을 가리키게 된다.
이 사진으로 설명하자면 HEAD -> MS라는 branch -> ms work 4라는 버전을 순차적으로 읽어들이는 것
- 여기서 새로운 버전 하나를 다시 생성한다면 master branch(위의 사진X)가 1 버전을 가리키지 않고 새로운 버전 2를 가리키게 되는 것
- 우리가 접하게 되는 2버전을 알기 위해선 git에서는 맨 처음 HEAD를 따라서 master branch를 지나 버전 2를 읽어 들이는 것이다.
만약 다른 branch를 생성한다면
- git branch google(브랜치 생성)
- git checkout google(HEAD가 google을 가리키게 되는 것!)
여기서 당연하게 생각하겠지만 주의깊게 봐야 하는 점은 git branch google를 실행 했을 때 google branch의 버전이 2인 이유는 똑같이 HEAD -> master branch -> 버전 2를 확인하고 google의 부모 버전이 2로 만들어 지는 것이다.
head가 google을 가리키고 있을 때 새로운 버전을 하나 더 생성하면(버전 3) master에서 시작한 google은 마스터와 다른 버전을 가리키게 되는 것이다.
다시한번 강조하게 되는 checkout은 처음 생기는 HEAD의 값을 포인터처럼 바꾸는 것이다.
++ 만약 checkout ‘branch명’이 아닌 ‘버전 명’을 실행한다면 HEAD가 branch를 가리키는게 아닌 버전자체를 가리키게 된다..! - 이것을 detached상태라고 한다.
🔐 1. reset 원리
checkout과 굉장히 비슷한 느낌의 reset은
checkout은 언제나 Head를 제어한다면 reset은 head가 branch를 가리키는 동안 branch를 제어한다고 보면 된다.
현재 head가 google를 가르킨다는 전제하에 각각 checkout master와 reset master의 차이점을 본다.
-
checkout의 경우
google을 가리키고 있던 head가 master를 가리키게 된다.
따라서 현재 버전은 master가 가르키고 있던 2번버전으로 바뀌게 된다. -
reset의 경우 branch를 바꾸는 느낌이기 때문에 reset master를 실행하게 되면 master가 가리키는 버전 2를 google이 가리키게 되는데 이때, google이 가리키고 있던 3번 버전은 유실되게 된다.
여기서 reset은 일반적으로 branch명을 가르키지 않는데(비교하며 설명하기 위해서)
git reset ‘1번 버전명’을 사용한다면 google branch가 1번버전을 가리키게 되면서 2,3번 버전이 삭제된다.
따라서 checkout은 change느낌, reset은 delete느낌으로 사용하면 된다.
✍️ GIT & 터미널 & 리눅스 용어 정리
- git checkout ‘버전 명’: 지금까지 알고 있던 브랜치전환이 아닌 head가 버전을 직접 가리킬 수 있다. 이 상태를 detached상태라고 한다.
- git reset ‘브랜치 명’: 지금까지 알고 있던 버전간의 전환이 아닌 브랜치간의 reset도 사용가능하다.
https://opentutorials.org/course/3837 많은 도움을 받은 생활코딩입니다.
공부 정리내용은 생활코딩 및 구글링을 통한 내용을 정리하였습니다.
댓글남기기