branch란 포인터라고 할 수 있다.
위는 sourcetree란 프로그램으로 commit된 내용을 그래프로 보여준다.
(Git Bash에서도 git log --graph 명령으로도 볼 수 있는데 보기 불편하다.)
master, feature/detail-page , feature/cat 이 branch이다.
feature/detail-page , feature/cat는 내가 생성한 branch로 commit을 가리키고 있다.
그리고 branch와 같이 알아둬야하는 키워드로 HEAD가 있다. HEAD는 커밋 혹은 브랜치를 가리킨다. HEAD는 현재 작업 중인 커밋이나, 브랜치를 가리키는 것이다.
'Git 기본 및 기본 구조' 글에서 checkout의 명령어가 바로 HEAD의 위치를 옮기는 것이다.
git checkout "커밋의 체크섬"
으로 checkout을 명령어로 알려줬는데 커밋의 체크섬이 아닌 다음과 같이 브랜치로 해야 HEAD가 브랜치를 정확하게 가리킨다.
git checkout "브랜치명"
실제 브랜치명으로 checkout 하는 것을 권장한다고 한다.
HEAD가 브랜치명과 동일하다면 커밋 시 HEAD와 브랜치 명은 다음 커밋 체크섬으로 이동한다.
브랜치를 사용하는 이유는 위 사진처럼 파란색과 빨간색으로 분기했다가 다시 합칠 수 있기 때문이다.
설명이 이상한데 Git Bash를 해석해보자.
1. Git으로 로컬 저장소를 만든다.
2. 폴더에 파일을 추가하고, 추적상태로 만든 뒤 커밋을 한다.
그럼 다음과 같이 브랜치와 HEAD가 최신 커밋으로 옮겨지는 것을 확인할 수 있다.
4. checkout으로 First Commit으로 돌아간다.
그러면 다음과 같이 HEAD와 master branch가 분리된 것을 볼 수 있다.
이를 detached HEAD라고 분리 HEAD라고 부른다고 한다.
5. git branch "브랜치명" "커밋 체크섬" 을 통해서 새 브랜치를 만든다.
-f 옵션을 주면 HEAD도 같이 이동한다.
1번 사진을 보면 HEAD가 아직 newBranch를 가리키지 않는 것을 볼 수 있다.
HEAD가 newBranch를 가리키도록 git checkout "브랜치명" 으로 가리키게끔 하여 2번째 사진처럼 HEAD가 newBranch를 가리키도록 한다.
그 후 파일을 추가 후 commit을 해보자.
나중에 이 브랜치들을 합칠 수 있다.
그래서 각자 팀원들이 각각의 브랜치를 만들고 기능을 추가 후에 최종적으로 master 브랜치에 합쳐서 하나의 Line으로 다시 만든다.
결국 HEAD란
1. HEAD는 현재 작업 중인 브랜치를 카리킨다.
2. 브랜치는 커밋을 가리키므로 HEAD도 커밋을 가리킨다.
3. 결국 HEAD는 현재 작업 중인 브랜치의 최근 커밋을 가리킨다.
새로운 커밋을 생성하면
1. 새로 커밋을 생성하면 그 커밋의 부모는 언제나 이전 HEAD 커밋입니다.
2. 커밋이 생성되면 HEAD는 새로운 커밋으로 갱신됩니다.
3. HEAD가 가리키는 브랜치도 HEAD와 함께 새로운 커밋을 가리킵니다.
브랜치가 사용할 때,
1.새로운 기능 추가
2. 버그 수정
3. 병합과 리베이스 테스트
4. 이전 코드 개선
5. 특정 커밋으로 돌아가고 싶을 때