[Git] 깃 브랜치(Git Branch)란? git branch, git checkout - Git 기초(4)

 

깃 브랜치(Git Branch)란 무엇인가

개발을 하다 보면 코드를 여러 방향으로 개발할 일이 생긴다. 예를 들어 A라는 코드를 B로 바꿔보기도 하고, C로 바꿔보기도 하며 가장 효율적인 코드를 찾아나갈 수도 있다. 이렇게 독립적으로 개발하는 것이 브랜치의 기본 개념이다.

 

브랜치는 말 그대로 가지이다. 하나의 나무에서 여러 갈래로 가지가 뻗어나가는 것처럼, 하나의 코드에서 여러 개의 코드로 갈라지며 다양한 개발 흐름을 만들어 낼 수 있다. 

 

혼자 개발할 때 뿐만 아니라, 여러 사람이 협업하여 개발할 때 브랜치는 더욱 빛을 발한다. 어떤 개발자는 A라는 코드에 B기능을 추가하고, 또 다른 개발자는 동시에 C라는 기능을 추가할 수 있다. 

 

 

커밋과 브랜치

커밋과 트리 데이터
[그림 1] 커밋과 트리 데이터 (출처 : 참고1)

 

깃은 데이터를 변경사항으로 기록하지 않고 일련의 스냅샷(snapshot)으로 기록한다. 깃은 커밋할 때 Staging Area에 있는 데이터의 스냅샷에 대한 포인터, 저자나 커밋 메시지와 같은 메타데이터(metadata), 이전 커밋에 대한 포인터 등을 포함하는 커밋 객체를 저장한다. 따라서 최초 커밋을 제외한 커밋들은 이전 커밋 포인터가 적어도 하나씩 있고, 브랜치를 합친 Merge 커밋 같은 경우에는 이전 커밋 포인터가 여러 개 있다.

 

깃의 브랜치는 커밋 사이를 가볍게 이동할 수 있는 어떤 포인터 같은 것이다. 기본적으로 깃은 master 브랜치를 만든다. 처음 커밋하면 이 master 브랜치가 생성된 커밋을 가리킨다. 이후 커밋을 만들면 master 브랜치는 자동으로 가장 마지막 커밋을 가리킨다.

 

예를 들어 다음 예제를 살펴보자.

 

브랜치와 커밋 히스토리
[그림 2] 브랜치와 커밋 히스토리 (출처 : 참고1)

 

위와 같은 상황에서 새로운 브랜치를 만들어 보자. git branch 명령으로 새 브랜치를 만들 수 있다.

 

$ git branch testing

 

 

브랜치 작업
[그림 3] 한 커밋 히스토리를 가리키는 두 브랜치 (출처 : 참고1)

 

새로 만든 testing 브랜치가 지금 작업하고 있던 마지막 커밋을 가리킨다.

 

 

그럼 깃은 지금 작업 중인 브랜치가 무엇인지 어떻게 파악할까? 깃은 HEAD 라는 특수한 포인터가 현재 작업하는 로컬 브랜치를 가리킨다. 

 

HEAD 포인터
[그림 4] HEAD 포인터 (출처 : 참고1)

 

 

git checkout 명령으로 다른 브랜치로 이동할 수도 있다. 

 

$ git checkout testing

 

git checkout
[그림 5] git checkout (출처 : 참고1)

 

HEAD가 testing 브랜치를 가리키게 된다.

 

 

이제 파일을 수정하고 다시 커밋을 해보자.

git checkout after commit
[그림 6] HEAD가 가리키는 testing 브랜치가 새 커밋을 가리킴 (출처 : 참고1)

master 브랜치는 그대로 있고, testing 브랜치는 새로 커밋한 곳으로 이동했다.

 

이때 다시 git checkout을 통해 master 브랜치로 되돌아가자.

 

$ git checkout master

 

back to master
[그림 7] master 되돌아가기 (출처 : 참고1)

 

HEAD가 master를 가리키게 된다. 이때 워킹 디렉토리의 파일도 그 시점으로 상태가 되돌려진다. 이 점이 중요하다. git checkout을 통해 브랜치를 이동하면 해당 브랜치의 시점으로 워킹 디렉토리의 파일이 변경된다는 것이다.

 

 

 

 


참고

 

1. https://git-scm.com/book/ko/v2

 

반응형

댓글

Designed by JB FACTORY