세줄 요약

  • branch 는 단순히 commit을 가리키는 포인터이다.
  • commit 은 자신의 부모 commit에 대한 정보를 가진다.
  • branch 의 commit 목록은 branch 최신 commit 에서 공통 조상 commit 직전 까지이다.

branch

branch 의 개념

branch는 보통 “독립적으로 개발되는 일련의 커밋 목록” 이라고 많이 표현이 되며, 프로젝트에서 어떠한 작업의 한 갈래를 의미하는 것으로 많이 표현된다. 하지만 이렇게만 이해하고 있을 경우에는 이후 브랜치의 병합, HEAD 포인터와 branch의 관계 등에서 개념적으로 혼선을 빚을 수 있다. 때문에 이번 포스팅에서는 브랜치의 본질에 대해서 더 깊게 탐구해보도록 한다.

commit 의 개념과 구조

브랜치를 더 깊게 이해하기 위해서는 commit에 대해 알아야 한다. 관련해서 이전 포스팅에서 자세히 다뤘으므로 여기서는 간단한 설명만 진행한다.

커밋은 git 에서 (1) 파일 변경 사항을 저장소에 기록하는 작업 (2) 특정 시점에 저장소에 기록된 상태 를 의미하며, 이번 포스팅에서는 2번의 개념으로 접근을 할 것이다.

커밋은 자신의 고유한 ID 값을 가지고 있고, 특정 시점에 기록된 작업의 상태를 가지고 있다. 하나 더, 가장 중요한 것은 커밋은 자신의 부모 커밋에 대한 정보를 가지고 있다는 것인데, 이를 통해 버전 관리가 가능한 것이다.

branch 의 본질

branch 는 단순히 커밋에 대한 포인터이다. branch의 이름은 특정 커밋 해시를 가리키며, commit이 가지고 있는 부모 commit에 대한 정보를 통해 “독립된 작업 흐름”이 생기는 것 처럼 보이고, 실제로 그렇게 작업할 수 있는 것이다.

따라서 branch 는 매우 경량이고, branch를 생성하는 데 필요한 것은 단순히 commit 해시를 가리키는 참조(ref)파일을 생성하는 것 뿐이다. 정확한 비유는 아니지만, branch 는 특정 위치를 가리킨다는 점에서 책갈피와 같은 존재라고 볼 수도 있다.

commit 과 branch 의 관계

-branch는 특정 시점의 커밋을 가리키는 포인터일 뿐이다.
-현재 branch에서 새로운 커밋이 생성되면, branch 포인터는 해당 커밋을 가리키도록 이동한다.
-따라서 branch는 commit 과의 연결 관계를 유지하면서 다른 branch(commit)과 합쳐질 수 있다.

branch에 포함된 커밋 목록을 계산하는 방법

그렇다면 git 에서는 어떻게 각 branch 가 독립적인 개발의 흐름으로 유지되게끔 할 수 있을까?

첫 번째. 조상 커밋 탐색

git은 특정 branch가 가리키는 commit에서 시작해서, 부모 commit을 따라가면서 조상 commit들을 추적한다.

두 번째. 공통 조상 계산

그리고 다른 branch 들의 부모 commit 또한 탐색하면서, 두 branch 간의 공통 조상(merge base)를 찾아낸다. 이들이 각 브랜치의 커밋 목록인 것이다.

세 번째. 브랜치의 간의 차이를 찾아냄

앞서 찾은 두 단계에서 특정 branch 에 속하는 커밋의 목록은 해당 branch의 최신 커밋 ~ 조상 커밋들의 집합 이며, 병합 시 기준점을 찾기 위해 공통 조상을 사용한다.

예시

-release1 branch 의 commit 은 E -> C -> B -> A 의 조상 commit 목록을 가진다.
-mian branch 의 commit 은 G -> F -> D -> B -> A 의 조상 commit 목록을 가진다.
-공통 조상은 B 이다.

DAG

DAG 란

Directed Acyclic Graph, 방향성을 가진 비순환 그래프는 데이터 구조의 일종으로, (1)그래프의 간선이 방향성을 가져 특정한 방향으로만 이동하고 (2)그래프 안에서 순환이 일어나지 않으며 (3)정점과 간선으로 구성된 그래프 구조라는 특징을 가지고 있다.

git 의 내부 구조가 바로 이 DAG 구조를 따르며, 이를 통해 작업간의 충돌 없이 독립된 작업의 흐름을 가져갈 수 있고, 순환 구조가 없으므로 작업이나 데이터의 상태를 빠르게 추적할 수 있는 장점을 가진다.

DAG의 활용 예

-git
-Jenkins, Makefile 의 작업 간 의존성 표현
-Apache Spark 의 작업 흐름
-일부 블록체인 시스템의 트랜잭션 구조

Reference

UNIX시스템 - 김희천,김진욱 저