1. 브랜치란?
Branch는 가지라는 의미인데, 말 그래도 하나의 프로젝트를 여러 갈래로 나눠 관리할 수 있게 해주는 기능이다.
독립된 브랜치에서 자유롭게 개발하고 새로운 버전을 만들어내기도 한다.
소프트웨어를 개발할 때 개발자들은 깃과 같은 분산 버전 관리 시스템을 통해 협업 업무를 하게 된다. 만약 한 줄기로만 작업할 수 있다면 로그가 뒤죽박죽될 수 있기 때문에 버전 관리도 까다롭고, 수정도 굉장히 신중히 해야할 것이다.
하지만 브랜치를 사용하면 분기점으로 버전을 나누어 프로젝트를 개발하고 실험해볼 수 있다. 만약 브랜치에서 작업한 프로젝트가 마음에 들면 merge를 통해 본래 버전에 다시 합칠 수도 있다.
2. 브랜치의 합병
브랜치는 인덱스 영역에서 헤더 영역으로 저장할 때, 즉 commit할 때 생성된다.
브랜치 merge의 종류는 2가지인데 fast-forward merge 와 3-way merge 가 있다.
fast-forward merge 는 merge 작업을 할 때
main branch에는 따로 자식이 없지만 branch에만 자식이 존재할 때 사용하는 통합 방식이다.
아래 그림은 실제 깃의 실행원리는 아니지만 개념적으로 이해하기 쉬우려고 만든 branch 원리이다.
실제 깃의 브랜치 실행원리는 3번에서 알아보도록 하자.
반면 3-way merge 는 merge 작업을 할 때 main branch와 branch에 각각 자식이 존재할 때 합병하는 방식이다.
3. fast-forward merge 방식
이번에는 실제 깃의 branch가 어떻게 동작하는지 알아보자.
새로운 가지를 만들고 커밋한다고 해서 바로 branch가 만들어지지는 않는다. 사실 깃 헤더영역에서는 기본적으로 Branch 포인터에 의해 브랜치를 구분한다.
위 그림은 게시판까지는 main branch 포인터가 가리키고 있지만 댓글 기능부터는 My branch라는 새로운 브랜치 포인터가 생성되어 가리키고 있다.
이렇게 브랜치 포인터가 같은 곳을 가르키게되면 통합되는데 main에 다른 자식이 없었기 때문에 main branch 포인터를 직선적으로 움직여도 바로 합칠 수 있게 되는데, 다른 방식보다 속도가 빨라 이것을 fast-forward merge라고 부른다.
4. 3-way merge 방식
일단 전제는 위에서 보여준 예시와 같다. 게시판까지는 main branch 포인터, 댓글 기능부터는 My branch라는 새로운 브랜치 포인터가 만들어진 상태다.
이때 main branch에 기능이 추가됐을 때 실제로 가지가 생기게 된다!!
(실제 실행원리에서는 새로운 가지에 의해 가지가 생기는 것이 아니라 main에 의해서 가지가 생김...)
이제 my branch에서의 작업이 끝나고 main과 합병하기로 했다고 해보자.
이제 main branch쪽으로 합병할 것인지 my branch 쪽으로 합병할 것인지 정해서 가지를 합치면 된다.
(주로 main쪽으로 합치게 된다.)
main branch 포인터는 댓글 기능 완료로 옮기고, my branch 포인터는 원래 있던 지점에 그대로 둔다.
브랜치에 대한 자세한 설명 참고
Git - 브랜치란 무엇인가
3.1 Git 브랜치 - 브랜치란 무엇인가 모든 버전 관리 시스템은 브랜치를 지원한다. 개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와
git-scm.com