브랜칭을 알아보기 전에, 깃이 어떻게 작동하는지 이야기 해보겠다. 우선 커밋을 하면 각 커밋은 숫자와 문자가 연속적으로 조합된 해쉬를 갖는다. 987fac676ac7dd765e 와 같은 해쉬가 있는데 이는 커밋과 1대1로 대응한다. 그리고 커밋은 부모 커밋을 참조하고 있어야 한다. 아래의 그림을 보면 이해가 된다.

위의 그림을 보면 순차적으로 커밋이 되어있는 것을 확인할 수 있다.
그라나 실제로 프로젝트에서 작업할 때 가끔, 여러 상황에서 동시에 작업하는 경우가 있다. 예를 들어 회사에서 웹 응용프로그램 개발을 하고 있는데, 웹 사이트에 2개의 색상 조합을 만드는 작업을 하는데, 이때 어떤 것이 좋은지 결정을 못하는 상황에서 작업을 한다고 생각해보자. 그리고 동시에 버그를 수정하는 작업도 하고 있는데, 이 버그는 코드를 썼다 지웠다를 반복해가면서 버그를 해결해야한다고 하자. 그리고 동료 중 한명이 아래 코너에 작은 챗봇 기능을 추가하는 작업을 하고 있다고 하고 여러 다른 부서들이 다른 작업을 하고 있다고 하자. 만약에 이러한 작업을 순차적으로 한다고 하면 이는 불가능할 것이다. 예를 덜어 누군가가 아주 괴상한 디자인으로 응용 프로그램의 화면을 바꿔버린다면, 작은 챗봇 기능을 추가하려고 하는 사람은 혼란을 겪을 것이다. 이런 것을 해결하기 위해서 브랜치가 필요하다.
브랜치 생성에 대해 알아보기 전에 알아야할 개념이 한 가지 더 있다. 그것은 HEAD이다.

가장 최근 커밋에서 HEAD-> master를 확인할 수 있다. 이것은 무엇을 의미할까? HEAD는 저장소에서 현재 위치를 가리키는 포인터이다. 만약에 아무것도 하지 않았다면 HEAD는 Master branch의 tip 즉, 마지막 커밋을 가르킨다. 그러나 다른 branch로 전환을 했다면, HEAD는 그 branch의 tip을 가르킨다.
즉 정리하자면 HEAD는 branch pointer(각 브랜치의 tip을 가르키는 pointer)를 가르키는 pointer라고 할 수 있다. 말이 어렵지만 아래의 그림을 보면 이해할 수 있다.

git branch
현재 존재하는 브랜치 목록을 보여준다. 이 때 *가 달려있는 것은 현재 우리가 위치하고 있는 브랜치를 의미한다.
git branch <branch-name>
단순히 브랜치를 만드는 것이고 만든 브랜치로 이동하는 것은 아니다. 이때는 현재 커밋을 가리키는 HEAD 기준으로 생성된다(HEAD가 가리키고 있는 브랜치에 새 브랜치를 생성).
** git commit -a -m 한 줄 명령으로 스테이지에 모든 변경사항을 올리고 commit 하는 방법
git switch <branch-name>
브랜치를 이동하는 명령어이다.
git checkout <branch-name>
마찬가지로 브랜치를 이동하는 명령이나 옛날 것이며, 다양한 명령을 할 수 있기 때문에 혼란을 주어 이 때문에, git switch라는 명령어가 만들어졌다. git checkout은 공식문서에 나와있기를 restore working tree files을 할 수 있다고 나와있다.
** Creating & Switcing
앞서 본 git branch <branch-name> 명령어와 git switch <branch-name> 명령어를 한번에 할 수 있는 방법이 있다. 아래와 같은 명령어를 사용한다.
git switch -c <branch-name>
git checkout -b <branch-name>
git branch -d <branch-name>
그런데 브랜치를 만들고 나서 git branch -d delteMe를 사용하면 다음과 같은 오류가 뜬다.

그 이유는 내가 현재 지금 deleteMe 브랜치에 있으면서 deleteMe 브랜치를 삭제할 수 없기 때문이다.
그러면 master 에 가서 deleteMe를 지우려고 하면 어떤일이 발생할까? master에 가서 deleteMe를 지우려고 하면 다음과 같은 오류가 발생한다.

이것은 master 브랜치에 아직 병합이 안되었는데 지우려고 한다는 의미로 생각된다(추측?) 그러나 다음과 같은 명령어를 이용하면 브랜치를 지울 수 있다.
git branch -D
git branch -m(move)
여기서 중요한 점은 브랜치의 이름을 변경하기 위해서는 해당 브랜치에 위치하고 있어야한다.
Master branch란 새 저장소를 만들었을 때 생성되는 기본 브랜치 이름이다. Master branch는 처음 저장소를 만들었을 때 자동적으로 생성되었다는 점을 제외하고는 여타 branch들과 같은 기능을 가진다.
깃과 깃허브의 기본 브랜치 이름은 오랫동안 master였다. 그러나 2020년에 깃허브에서만 기본 브랜치의 이름을 master 에서 main으로 바꾸었다. 많은 회사에서 Master, main branch를 항상 작동해야하는 코드 베이스(main copy)로 여긴다. 예를 들어 main branch 말고 다른 experimental branch를 만든 후 마음에 들면 master branch와 통합하거나 포기할 수 있다.
깃의 뒷면에서 어떤 일이 일어나는지, .git 디렉토리를 살펴보자. 그리고 HEAD가 어떻게 작동하는지, 그것이 참조하는 브랜치 레퍼런스가 커밋을 참조 하는 것의 간략한 원리를 살펴보고자 한다.
예를 들어 oldies 라는 branch로 switch해서 수정을 했지만 아직 add 하지 않은 상태이다. 이 상태에서 emptyplaylist로 가보자. 그러면 아래와 같은 오류가 발생한다.

이 말은 지금 이 브랜치에서 했던 작업들은 아직 커밋되지 않았기 때문에, 다른 브랜치로 이동하려고 하면 사라질 것이라는 뜻이다. 그리고 Please commit your changes or stash them before your switch branches라고 씌여있다. 이처럼 다른 브랜치에 있는 파일을 수정한 뒤 커밋하지 않고 브랜치를 이동하려고 하면 이러한 오류가 발생한다. 그러나 다른 브랜치에 없는 파일을 만들고 수정하면 이러한 conflict가 발생하지 않는다. 그리고 chicken 에서 만들었는데, oldies에도 chicken.txt라는 파일이 존재한다.
따라서 이러한 혼란을 피하기 위해서 브랜치 이동 전에 add & commit을 할 것을 권장한다.