코드 저장소

공부에는 끝이 없다!

Git

GIT - Branch 나누기

VarcharC2K 2023. 12. 29. 10:15

이전 GIT 정리글들을 보면 계속 Branch라는 말이 나올 것이다.

이번 시간에는 이 Branch에 대해서 정리해 보고자 한다.


Branch란?

이전 정리에서 Commit은 순차적으로 쌓아야 한다고 했을 것이다.

이는 충돌을 방지하기 위함으로 서로 다른 유저가 동시에 같은 파일을 수정한 후 Commit을 해버리면 무엇이 원본이고 어떤것이 변경 본인지 Git이 알수가 없게 되기 때문이다.

예를 들어서 로컬과 C0, C1라는 Commit이 존재하고 원격 저장소에 Push해서 올렸다고 생각해보자.

실선 테두리는 로컬, 점선은 원격 저장소라고 가정한다.

A라는 유저가 코드를 변경하여 C2라는 Commit을 만들었다.

그런데 A가 작업을 하는 동안 B라는 유저가 C1의 Commit 상태에서 다른 수정 작업을 진행하여 Commit 하여 C3라는 Commit이 만들어 졌다고 가정해보자.

자 그럼 여기서 A와 B 유저가 동시에 Push를 진행한다면 어떻게 될까?

당연히 동일한 코드가 수정되었으므로 충돌이 발생할 것이다.

Git에 입장에서 보자면 원격 저장소에는 C1 상태 이후에 C2와 C3가 동시에 생긴것인데 어느것이 진짜 진행하는 방향인지 Git이 알수가 없기 때문이다.

하지만 실제로는 둘다 올바른 진행이기 때문에 두 Commit이 모두 저장되어야 한다.

 

이런 상황을 해결하기 위하여 사용하는 것이 Branch라는 개념이다.

'나뭇가지'라는 뜻처럼 Branch는 Commit의 진행상황에 가지를 쳐서 진행 상태를 나누는 역할을 한다.

이전에 Commit을 분기점이라고 설명했는데 Branch는 멀티버스를 만든다고 생각하면 이해가 편할 것이다.

우리는 C1이라는 분기점에서 C2로 가는 하나의 선택과 C3로 가는 두번째 선택을 멀티버스로 만들어 두고 양 진행상황을 동시에 진행시키다고 Merge라는 작업을 통해 다시 하나의 가지로 합칠수 있다.

 

따라서 일반적으로, Branch는 새로운 기능을 만들고 테스트가 필요하거나, 메인 프로젝트가 2트랙으로 가게 되어 테스트가 동시에 진행되어야 할때 많이 사용한다.


Branch 만들기 - 멀티버스를 만들자!

사실 우리는 이미 Branch를 사용하고 있다.

CLI에서 Push 명령어를 다시 한번 살펴보자

git push origin master

 

origin은 원격 저장소를, master는 Branch 명을 말한다.

즉, 우리는 이미 master라는 Branch를 Default로 만들고 사용하고 있는 것이다.

(최근에는 main을 쓰기도 한다.)

 

*추가적으로, 앞서 본 이미지에서 Head라는 태그가 있을텐데 이 태그는 내가 작업하고 있는 로컬 브랜치를 말한다.

 

그러면 Branch를 새로 만들려면 어떻게 해야할까?

Branch 생성 명령어는 다음과 같다.

git branch [Branch명]

 

해당 명령을 입력하면 현재 위치한 Commit 상태에서 해당 Branch를 생성한다.

Branch가 생성되면 앞으로 작업할 Branch로 Head(앞서 설명한 로컬 branch)를 옮겨 주어야 한다.

(만약 이 작업을 수행 하지 않으면 우리는 Branch를 만들기만 하고 계속 master에서 작업을 하고 있는것이 된다)

Branch 이동 명령은 다음과 같다.

git checkout [이동할 Branch명]

 

이렇게 원하는 Branch명을 입력하면 로컬 저장소를 옮길 수 있게 된다.

이 상태에서 Push를 하게 되면 해당 Branch 명으로 Push가 되면서 충돌 없이 동시에 진행을 할 수 있다.

이전에 작업했던 c2에 m1이라는 Branch를 만들고 Commit하여 C6를 만들고, c1에서 m2라는 Branch를 만들어 C3, C5라는 Commit을 만든 후, Push한다고 가정하자.

그러면 다음과 같이 원격 저장소에 올라가게 된다.

실선은 로컬, 점선은 원격 저장소이다.

자세히 보면 main은 C2에 위치해 있고, m1은 c2를 포함한 c6, m2는 c3, c5를 포함하는 것을 알 수 있다.

m1 branch는 c2 시점에서 생성했기 때문에 만약, main에서 다시 commit을 진행한다면 다음과 같이 또 갈라지게 될 것이다.

 

 

원격 저장소에 Push를 해보면 다음과 같다.

어느정도 개념이 잡히는가?

그럼 소스트리를 이용해서 직접 Branch를 만들어 보자.


소스트리를 이용하여 Branch 만들기

설명이 복잡했지만 사실 소스트리를 이용하면 엄청 간단한 작업이다.

소스트리 상단 리본탭을 보면 브랜치라는 버튼이 있다.

 

해당 버튼을 누르면 새로운 Branch를 설정하는 페이지가 나온다.

새 브랜치 명을 입력하고 브랜치 생성 버튼을 클릭하면 간단하게 생성이 가능하다.

옵션쪽을 보면 작업 사본 부모는 현재 Commit에 바로 생성하는 것이고, 명시된 커밋을 이용하여 특정 Commit 위치에서 만들수도 있다.

새 브랜치 체크아웃을 체크하고 만들게 되면 생성된 브랜치로 바로 Checkout하여 로컬 저장소를 새로 만든 브랜치에 위치하게 해준다.

나는 NewFunc이란 이름으로 Branch를 생성하였다.

 

 

정상적으로 생성이 되었다면 왼쪽에 브랜치에 우리가 생성한 Branch명이 보일 것이다.

저 브랜치를 선택하는 것만으로도 소스트리에서 간단하게 Checkout이 이루어 지며 해당 위치에서 Commit을 하게 되면 해당 브랜치에서 Commit을 하는것과 동일하다.

그럼 수정사항을 만들고 새로 만든 Branch에서 Commit을 진행해 보겠다.

 

 

보이는 것 처럼 태그 명이 NewFunc으로 올라간 것을 확인 할 수 있다.

해당 Commit을 Push 해보면 

 

다음과 같이 원래 없었던 NewFunc이라는 우리가 생성한 브랜치가 보이는 것을 확인 할 수 있다.

우리는 새로 생긴 Branch에만 Push를 진행할 것이므로 NewFunc에만 체크를 하고 Push를 진행해보자.

히스토리를 확인해 보면 origin/NewFunc 이란 태그를 통해 원격 저장소에도 NewFunc이란 Branch가 생성되고 우리가 생성한 Commit이 올라간 것을 확인 할 수 있다.

 

'Git' 카테고리의 다른 글

Git - 충돌과 충돌 해결 실습해보기  (1) 2023.12.30
Git - Merge와 Conflict  (0) 2023.12.29
GIT - 소스트리 이용하기  (1) 2023.12.28
Git - GUI 이용하기  (0) 2023.12.27
GIT 사용하기 - CLI를 이용한 Push  (1) 2023.12.26