Git

[Git] 여러가지 방법으로 branch 다루기

P1su 2024. 8. 3. 18:50

branch 란

branch는 일종의 코드 관리 흐름이라 할 수 있다. 

커밋을 가르키는 포인터의 역할을 하며 코드를 여러가지 방면으로 분기하여 관리할 수 있다.

 

처음 프로젝트를 생성하면 기본적으로 master 브랜치가 생성되고, 이를 기반으로 하여 새로운 브랜치들을 추가해가며 작업을 해갈 수 있다. 

 

branch 기본 커맨드

git branch

브랜치 생성

 

git checkout <이름>

브랜치 이동

 

git checkout -b <이름>

브랜치 생성 후 이동

 

git branch

브랜치 조회

 

git branch -d <이름>

브랜치 삭제

 

만약 새롭게 생성한 branch를 push 하려고 하면

위와 같은 오류가 발생한다.

 

git push --set-upstream origin <브랜치 이름>

위 커맨드를 통해 리모트 레포지토리와 연결을 진행하며 branch를 push 한다. 

--set-upstream 옵션을 설정해주어서 이후 push나 pull을 할 경우에는 리모트 레포지토리의 브랜치와 상호작용하게 된다. 

 

 

 

merge 하기

merge(병합) 를 통하여 다른 브랜치의 내용을 현재 브랜치로 가져올 수 있다. 

 

현재 merge_test 라는 브랜치에 있다. 

이때 main 의 내용을 가져오고 싶다면 

git merge main

해당 커맨드를 작성하면 된다. 

 

merge 도중 충돌이 발생한 경우

간혹 merge를 하다 충돌이 발생한다. 

이는 두 브랜치의 어느 한 부분에서 작업한 내용이 달라서 발생한다.

working directory로 돌아가 보면 충돌된 부분에서 다음과 같이 내용이 변경되어 있을 것이다. 

구분선을 기준으로 HEAD로 표시된 윗 부분이 현재 브랜치의 내용, 아랫 부분이 merge로 인해 변화가 생기는 부분이다. 

 

충돌을 해결하는 방법은 간단하다. 

충돌한 부분의 코드를 다시 작성해주고 커밋을 다시 진행해주면 된다. 

 

merge 취소하기

git merge --abort

 

abort 옵션을 통하여 merge를 취소하고 이전 상태로 돌아올 수 있다. 

 

HEAD 와 branch의 관계

HEAD에 대해서 작성하며 설명했듯이, branch는 커밋을 가리키는 포인터이다. 

그리고 HEAD는 이러한 branch를 가리키는 포인터이다. 

 

만약 현재 브랜치에서 다른 브랜치로 checkout을 통해 이동한다하면
먼저 브랜치가 이동한 후, HEAD가 branch를 가리키게 된다. 

 

HEAD만 특정 커밋으로 이동시키기

만약 checkout 커맨드 다음 커밋 아이디를 작성하면 HEAD 만 특정 커밋으로 이동시킬 수 있다. 

이렇게 브랜치를 통해 커밋을 가리키는 것이 아닌 HEAD가 직접 커밋을 가리키는 것을 
Detached HEAD 라 부른다.

 

이렇게 HEAD 가 직접 커밋을 가리키게함으로써 특정 커밋에서 새로운 브랜치를 만들 수 있다. 

 

이후 새롭게 만든 브랜치에서 다시 checkout 커맨드와 브랜치명을 통하여 브랜치가 커밋을, HEAD가 브랜치를 가리키는 구조로 변경할 수 있다. 

 

 

merge의 종류

fast-forward merge

branch간 병합 중 커밋이 생기지 않을 경우이다. 

HEAD 가 병합되는 브랜치로 이동하게 된다. 

분기가 되지 않고 같은 선상에 있을 때 진행된다. 

 

3-way merge

두 갈래선에서 나누어진 브랜치를 병합하는 과정이다. 

브랜치에 각각 새로운 커밋이 존재할 경우, 이를 합쳐 새로운 커밋까지 자동으로 생성해준다. 

 

3-way merge의 경우 변화가 생긴 부분을 우선으로 선택하여 코드에 반영한다. 

만약 두 브랜치 모두 base 커밋에 대하여 변화가 생겼을 경우에 충돌이 발생하게 된다. 

 

git rebase

git rebase <이동할 브랜치>

git rebase 커맨드를 통하여 브랜치의 시작점을 다른 브랜치의 끝으로 이동시킬 수 있다. 

 

rebase 이후 merge를 진행하게 되면 fast-forward merge가 진행되어 
새로운 커밋이 생성되지 않고, 커밋 히스토리도 보다 깔끔해진다. 

 

그러나 rebase를 할 경우 브랜치마다 충돌을 해결해주어야 하고, 커밋 히스토리를 건드리기 때문에 
위험할 수 있다.

 

728x90