[Git] 브랜치에 대하여

브랜치에 대하여 알아보자


소개

팀끼리 프로젝트를 할 때 main 브랜치 하나에서 동시에 각각 진행을 하게되면 서로 충돌이 발생할 수 있다. 이를 해결하기 위해 사용하는 것이 브랜치이다. 브랜치끼리는 서로 다른 작업을 어떻게 하든 서로 영향을 주지 않는다.

브랜치로 각각의 기능을 개발하다가 적정한 시기에 병합을 하여 메인 브랜치로 작업 내역을 옮겨줄 수 있게 된다.


기본 브랜치

처음에 깃을 초기화했을 때 자동으로 기본 생성되는 브랜치가 master 브랜치이다. git 자체는 기본 브랜치가 master이지만, GitHub에서는 포용적인 언어 사용을 장려하기 위해 기본 브랜치를 main으로 변경하였다. master이든 main이든 상관없이 그냥 기본 브랜치의 이름일 뿐 특별할 것 없고, 다른 브랜치와 다를 것이 없다. 기본 브랜치의 이름은 언제든지 바꿀 수 있다.


HEAD가 뭘까

HEAD는 레포지토리에서 보고 있는 작업 영역의 위치를 가리키는 포인터이다. 더 정확히 말하면, HEAD는 브랜치 포인터에 대한 레퍼런스 포인터이고, 브랜치 포인터는 현재 브랜치의 최신 커밋 위치를 가리킨다. 각 브랜치마다 브랜치 포인터를 가진다.

예를 들어 다음과 같은 git log 출력을 보면:

b8132c0 (HEAD -> main) c commit
01c781f b commit
b9e82ae a commit

이 예시에서 HEAD는 main 브랜치를 가리키고 있고, main 브랜치는 'c commit'이라는 커밋(b8132c0)을 가리키고 있다. 즉, 현재 작업 중인 브랜치가 main이고, 가장 최근 커밋이 'c commit'이라는 의미이다.

그래프로 표현하면 다음과 같다:

A---B---C  (HEAD -> main)

브랜치 보기

git branch 명령어를 실행하면 현재 레포지토리에 있는 브랜치들을 전부 볼 수 있다. 현재 체크아웃된 브랜치 앞에는 * 표시가 붙는다.

$ git branch
* main
  feature
  bugfix

위 예시에서는 main, feature, bugfix 세 개의 브랜치가 있으며, 현재 main 브랜치에 있음을 알 수 있다.


브랜치 생성 및 전환하기

git branch <branch-name> 을 통해 브랜치를 생성할 수 있다. 이것은 브랜치를 생성하기만 할 뿐 해당 브랜치로 이동하지는 않는다.

브랜치를 이동하기 위해서는 git switch <branch-name> 의 명령어를 통해 할 수 있다. 이는 Git 최신 버전부터 도입된 명령어이다.

git checkout <branch-name> 을 이용해서 브랜치를 이동할 수도 있다. 이는 오래된 방식이지만 여전히 많이 사용된다.

switch의 -c 옵션 혹은 checkout의 -b 옵션을 사용하면 브랜치를 생성하면서 바로 이동할 수 있다.

$ git branch feature    # feature 브랜치 생성
$ git switch feature    # feature 브랜치로 이동
 
# 또는 한 번에
$ git switch -c feature  # 브랜치 생성 및 이동

브랜치를 생성하고 이동한 후의 상태를 텍스트 그래프로 표현하면 다음과 같다:

A---B---C  (main)
         \
          D  (HEAD -> feature)

위 그래프는 main 브랜치에서 feature 브랜치를 생성한 후, feature 브랜치에 D 커밋을 추가한 상태를 보여준다. HEAD는 현재 feature 브랜치를 가리키고 있다.


브랜치 삭제 및 이름 바꾸기

브랜치 삭제

git branch -d <branch-name> 을 통해 브랜치를 삭제할 수 있다.

-d 옵션은 해당 브랜치의 변경 사항이 다른 브랜치에 병합되었을 때만 삭제할 수 있다. 만약 병합되지 않은 브랜치를 강제로 삭제하고 싶다면 대문자 D를 사용하여 git branch -D <branch-name> 명령어를 사용하면 된다.

$ git branch -d bird
error: the branch 'bird' is not fully merged
hint: If you are sure you want to delete it, run 'git branch -D bird'
hint: Disable this message with "git config advice.forceDeleteBranch false"

위 메시지는 bird 브랜치가 아직 병합되지 않았기 때문에 -d 옵션으로는 삭제할 수 없다는 것을 보여준다. 이 경우 -D 옵션을 사용하여 강제로 삭제할 수 있다:

$ git branch -D bird
bird 브랜치 삭제 (과거 26ef2c7).

브랜치 이름 변경

브랜치 이름을 변경하기 위해서는 변경할 브랜치로 이동 후 git branch -m <new-branch-name> 를 입력하면 된다.

$ git switch old-branch-name
$ git branch -m new-branch-name

또는 현재 브랜치가 아닌 다른 브랜치의 이름을 변경하려면:

$ git branch -m old-branch-name new-branch-name

결론

브랜치는 Git의 가장 강력한 기능 중 하나로, 여러 개발자가 동시에 작업할 수 있게 해주고, 코드의 안정성을 유지하면서 새로운 기능을 개발할 수 있게 해준다. 브랜치를 효과적으로 활용하면 개발 과정이 더욱 체계적이고 효율적으로 진행될 수 있다.