본문 바로가기
유용한기술

[GIT] Branch, Merge, Rebase 기본 개념

by DuncanKim 2022. 7. 20.
728x90

[GIT] Branch, Merge, Rebase 기본 개념

 

 

동일한 소스 코드를 활용해서 여러 개발자가 각자의 업무를 진행할 때가 있다.

어떤 개발자는 버그를 수정하고, 어떤 개발자는 새로운 기능을 만드는 역할을 하는 것처럼 말이다.

이 때 서로 다른 작업을 할 때는 서로 다른 버전의 코드가 생겨날 수 밖에 없다.

 

이럴 때 여러 개발자들이 동시에 다양한 작업을 할 수 있게 만들어주는 기능이 깃의 '브랜치(Branch)'이다.

각자 독립적인 저장소 안에서 마음대로 소스코드를 변경하고, 분리된 작업 영역에서 변경된 내용은 

원 버전과 비교해서 하나의 새로운 버전으로 만들어 낼 수 있다.

 

이번 포스팅에서는 세부 기술적인 부분이 아니라, 전반적인 깃의 브랜치와 머지, 충돌을 이해하기 위해 개괄적으로 개념을 살펴보도록 한다.

 

 

1. Branch란?

 

브랜치는 독립적으로 어떤 작업을 진행하기 위한 개념이다. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업들을 동시에 진행할 수 있다.

 

다르게 만들어진 브랜치는 다른 브랜치와 병합(Merge)함으로써, 작업한 내용을 다시 새로운 하나의 브랜치로 모을 수 있다.

 

초록색은 master 브랜치라고 보면된다. 처음 만들면 master라는 이름의 브랜치가 만들어 진다.

빨간색, 파란색은 각각 master 브랜치에서 떨어져나온 새로운 브랜치이며, 각각이 만들어지고 나서 다시 master 브랜치에 Merge 되는 것을 그림은 보여주고 있다. 빨간색, 파란색과 같은 것을 '토픽 브랜치'라고 한다.

 

현재 사용하고 있는 브랜치를 바꿔주려면 HEAD를 이동시키면 된다. 이는 checkout 명령어를 실행하여 원하는 브랜치로 전환할 수 있다. HEAD는 현재 사용 중인 브랜치의 선두 부분을 나타내는 이름이다. 기본적으로는 master의 선두 부분을 나타낸다. 

 

 

branch 관련 CLI 명령어

git branch : master (브랜치의 목록을 보여줌)
git branch … : 브랜치의 명칭을 붙여서 생성해줌

head : 현재 브랜치
head -> master : 마스터에 속해있는 상태

 

 

2. Merge, Rebase란?

 

작업이 완료된 토픽 브랜치는 최종적으로 통합 브랜치(master)에 병합된다. 브랜치 통합에는 merge를 사용하는 방법과 rebase를 사용하는 방법이 있다. 어느쪽을 사용하느냐에 따라 이력이 크게 달라진다.

 

1) Merge

 

Merge를 사용하면 여러 개의 브랜치를 하나로 모을 수 있다.

 

토픽 브랜치가 분할 되어 있을 때, 다음 두 가지의 시나리오가 존재한다.

 

a. 토픽 브랜치의 이력이 master 브랜치의 이력을 모두 포함하고 있는 경우

이 경우에는, master 브랜치만 단순히 이동해도 bugfix의 브랜치 내용을 적용할 수 있다.

이러한 종류의 병합을 'fast-forward 병합'이라고 부른다.

 

 

b. 토픽 브랜치가 완전히 분기된 경우

 

이 경우, master 브랜치 내의 변경 내용과 bugfix 브랜치 내의 변경 내용을 하나로 통합할 필요가 있다.

여기서 병합을 실시할 경우 merge commit(병합 커밋)을 실행하게 된다.

Merge 방식으로 병합을 할 경우 아래와 같이 새로운 master 브랜치가 생기며, x, y라는 커밋의 이력은 그대로 남게 된다.

 

 

 

2) rebase

 

rebase를 하게 되면, bugfix 브랜치의 이력이 master 브랜치 뒤로 이동하게 된다.

이 때, X, Y 커밋 내에서 master의 커밋 버전들과 충돌하는 부분이 생길 수도 있는데, 그 때는 각각의 커밋에서 발생한 충돌 내용을 수정해야 한다.

 

rebase를 하면 이와 같이 일직선 상의 브랜치 흐름이 나타나며, master를 제일 앞 y'에 두고 fast-forward 병합을 하면 된다.

 

 

3. merge와 rebase의 차이와 쓰임새

 

merge : 변경 내용의 이력이 모두 그대로 남아 있기 때문에 이력이 복잡해진다.

rebase : 이력은 단순해지지만, 원래의 커밋 이력이 변경된다. 정확한 이력을 남겨야 할 필요가 있을 경우에는 사용하면 안된다.

 

토픽 브랜치에 통합 브랜치의 최신 코드를 적용할 경우에는 rebase를 사용한다.

통합 브랜치에 토픽 브랜치를 불러올 경우에는 우선 rebase를 한 후 merge 한다.

 

 

 

 

 

 

 

<참고>

https://backlog.com/git-tutorial/kr/stepup/stepup1_4.html

728x90

댓글