HEAD가 main 브랜치를 가리키고 있다 (HEAD -> main)
HEAD는 어떤 커밋을 가리키는 존재 라고 배웠다.
브랜치는 프로젝트 코드를 관리하는 하나하나의 흐름이다.
무슨 관계가 있길래 화살표가 main 브랜치를 가리키고 있을까?
먼저 branch는 프로젝트에서 코드를 관리하는 하나의 흐름인데 약간 추상적인 느낌이 있다.
사실 branch도 HEAD처럼 어떤 커밋을 가리키는 존재인데, 앞으로 커밋을 가리키는 존재를 포인터라고 칭하겠다.
우리가 커밋을 처음하게 되면 main branch가 첫 번째 커밋부터 시작해서 매번 새롭게 생기는 커밋을 가리키게 된다.
깃에서 커밋은 이전 커밋에 대한 정보를 가지고있기에 그래서 main 포인터가 가장 최신의 커밋만 가리키고 있다해도
결국 그 이전 커밋으로 하나씩 거슬로 올라갈 수있기 때문에 이때까지 어떻게 프로젝트가 변해왔는지 추적 할 수있다.
그래서 branch라는 게 어떤 코드의 관리 흐름이라는 개념이 성립하는 것이다.
그렇다면 HEAD도 커밋을 가리키는 포인터라고 했었다.
그리고 HEAD가 가리키는 커밋의 내용대로 커밋의 워킹 디렉토리의 내용물이 바뀐다고 했었다.
하지만 정확하게 말하자면 보통 HEAD는 커밋을 직접 가리키지는 않는다. 보통 branch를 가리킬 뿐이다.
HEAD는 결국 main branch를 통해 간접적으로 커밋을 가리킨다.
4번째를 가리키고 있는 상태에서 새로운 커밋을 하면 main branch는 이제 다섯 번째 커밋을 가리키게 된다.
HEAD는 여전히 main branch를 가리키고 있기에 결국 다섯 번째 커밋을 가리키게 되는 것이다.
이것이 branch와 HEAD의 실제 모습이다.
만약 이 상태에서 premium 브랜치를 만들면?
premium branch를 만들면 HEAD가 가리키던 커밋을 premium branch가 가리키게 된다.
여기서 'checkout' 커멘드를 사용하여 premium branch로 이동한다면..
HEAD가 premium branch를 가리키는 것을 볼 수있다,
이전에 코드의 관리 흐름이 main 에서 premium branch로 바뀐다고 적었던적이 있었나(?) 했던거 같은데
아무튼 사실은 이렇게 HEAD가 가리키는 branch를 변경하는 작업일 뿐이었던 것이다.
또 커밋을 하게되면 여섯 번째 커밋이 생기고 HEAD가 가리키던 premium branch가
이제 새로운 커밋을 가리키게 된다.
했던거 또 하는 것이긴 하지만
이 상태에서 또 main branch로 checkout을 한다면? HEAD는 다시 main branch를 가리키게 될 것이다.
그럼 HEAD 입장에서는 결국 다시 다섯 번째 커밋을 가리키게 되고
다섯 번째 커밋의 내용대로 워킹 디렉토리도 바뀌게 된다.
여기서 커밋을 하면?
이렇게 커밋 히스토리의 흐름이 갈라진다. (=분기한다)
이 상태에서 main branch에서도 몇 번 커밋을 더하고
premium branch에서도 몇 번 커밋을 더하면
결국에는 이렇게 될 것이다.
자 이제 branch merge를 생각해보자
지금 HEAD는 main을 가리키고 있는데 이상태에서 marge를 한다면
main branch가 가리키던 커밋의 내용에 premium branch가 가리키던 커밋의 내용을 합쳐서
새로운 커밋을 만들어 주는 것이다.
이 때의 커밋을 merge 커밋이라고 했었다.
marge는 결국 HEAD가 가리키던 커밋에 다른 브렌치가 가리키던 커밋을 합쳐서 새로운 커밋을 만드는 작업인 것이다.
이 정도면 branch와 HEAD는 무엇이고 둘 사이 관계는 어떻게 되는지 이해 할 수있을 것이다.
'Git' 카테고리의 다른 글
(22) Git -merge [심화] (0) | 2024.09.10 |
---|---|
(21) Git -reset / checkout [심화] (0) | 2024.09.10 |
(19) Git - branch [origin] (0) | 2024.09.07 |
(18) Git - branch marge (0) | 2024.09.06 |
(17) Git - branch (브랜치) (0) | 2024.09.06 |