
깃에서의 브랜치란 나뭇가지라는 의미로 '하나의 코드 관리 흐름'이다.
실제로 깃을 상징하는 마크는 나뭇가지를 가진 나무이다. 가장 첫 번째 커밋을 뿌리에 비유한 root commit이라고 칭하고 이 뿌리에서부터 시작하여 여러 갈래로 나눠지는 나뭇가지들을 가진 나무의 모양으로 형상화한 것이 깃의 마크 모양이다.
프로그램을 개발하다 보면 일반적으로 무료 버전, 유료 버전, 베타 버전, 테스트 버전 등등 여러 개의 '코드 흐름'을 가져야 하는 경우가 많은데 이런 경우를 대비하여 비효율적으로 여러 프로젝트를 동시에 진행하기보다는 효율적으로 하나의 프로젝트에서 여러 코드 관리 흐름을 사용할 수 있게 해주는 것이 바로 브랜치이다.
해당 브랜치에서 작성하고 커밋한 코드들은 해당 브랜치에만 반영된다. 또한 이러한 커밋들은 다른 브랜치와는 아무런 상관이 없다.
예를 들어 A 브랜치에서는 무료 버전을 개발하고, B 버전에서는 유료 버전을 개발하고 C 버전에서는 테스트 버전을 개발하는 등 브랜치를 이용하여 하나의 프로젝트에서 서로 충돌하지 않고 각각의 버전을 개발할 수 있다.

실제로 둘 다 동일한 test1 파일이지만 브랜치 A와 B 각각의 브랜치에서 파일 내용을 수정하고 커밋한 후 각 브랜치에서의 내용을 확인해봤더니 내용이 브랜치 A에서는 AAA, 브랜치 B에서는 BBB로 서로 다른 것을 확인할 수 있다.
git branch~ 는 깃에서의 브랜치 관련 커맨드이다.
git branch # 존재하는 브랜치 목록 확인
git branch [브랜치명] # 브랜치 생성
git branch -d [브랜치명] # 해당 브랜치 삭제
git branch -M [브랜치명] # 현재 브랜치 이름 변경
git checkout [브랜치명] 커맨드를 입력하면 해당 브랜치로 이동한다.
만약 해당 브랜치가 존재하지 않는다면

다음 에러 문구가 출력되고 브랜치로 이동할 수 없다.

하지만 git checkout에 -b 옵션을 주어 git checkout -b [브랜치명] 커맨드를 실행하면 해당 브랜치를 생성함과 동시에 해당 브랜치로 이동하게 해준다.
예를 들어 현재 개발중인 프로그램에서 브랜치를 나누어 free 브랜치에는 무료 버전과 paid 브랜치에는 유료 버전을 따로 개발 중이었는데 회사에서 무료 버전에 존재하는 기능을 전부 유료 버전에도 존재하게 하라는 오퍼가 내려왔다고 가정해보자.
이런 경우 깃에서는 어던 브랜치에서 한 모든 커밋들을 다른 브랜치에 반영하여 병합하는 것이 가능하다.
우선 git checkout paid으로 paid 브랜치로 이동하여 현재 브랜치와 병합하고 싶은, 내용을 가져오고 싶은 브랜치를 대상으로 git merge [병합하고 싶은 브랜치명] 커맨드를 입력하면 된다.
여기서는 git merge free 커맨드를 입력하면 현재 있는 paid 브랜치의 코드와 free 브랜치의 코드가 합쳐지게 될 것이다.

브랜치끼리 merge할 경우 두 브랜치간 코드나 내용이 겹치는 경우가 있다면 깃에서 스스로 어떤 내용을 우선할지 판단할 수 없어 충돌이 일어난다. 이런 경우

충돌이 일어난 곳으로 이동하여

최종 반영하고 싶은 대로 쓸데없는 부분 다 지우고 내용을 수정해주면 충돌은 해결된다.만약 여러 파일, 여러 부분에서 충돌이 발생했다면 하나 하나 똑같은 방식으로 내용을 수정해주면 된다.
이후에는 add, commit, push를 이전처럼 진행할 수 있다.
하지만 만약 실수로 merge했거나 충돌되는 부분이 너무 커 감당이 안 되어 다른 방법을 찾고 싶다면 merge 자체를 취소하는 것도 하나의 방법이다.
git merge --abort
merge에 --abort 옵션을 주면 직전의 merge 자체를 취소할 수 있다.

앞선 포스팅에서 HEAD가 브랜치를 통해 간접적으로 커밋을 가리킨다고 말하였다. 이것을 풀어서 설명해보면 HEAD는 특정 브랜치를 가리키는 포인터이고, 브랜치는 특정 커밋을 가리키는 포인터이다.
즉 HEAD -> 브랜치 -> 커밋과 같은 삼단 논법 형식으로 결국 HEAD가 커밋을 간접적으로 가리킨다고 설명한 것이다.
커밋이 3개 있는 상태에서 새로운 커밋이 하나 더 생겨나면 브랜치가 새로운 커밋을 가리키게 되고 그 브랜치를 가리키는 헤드 역시 새로운 커밋을 간접적으로 가리키게 된다.
여기서 checkout으로 브랜치를 이동하면 헤드가 이동한 브랜치를 이동한다. 즉 checkout은 헤드가 가리키는 브랜치를 변경함으로써 브랜치를 이동하는 작업이었다.