본문 바로가기
Management/GIT

[GIT] 깃(Git) 브랜치(Branch) 사용하기 (ft. 조회/생성/이동/삭제/병합)

by 썸머워즈 2022. 10. 15.
반응형

git branch

git을 사용하게 되면 가장 많이 듣는 게 브랜치라고 생각된다.

 

쉽게 설명하자면 코드를 통째로 복사하고 나서 원래 코드와는 상관없이,

독립적으로 개발을 진행할 수 있게 도와주는게 브랜치의 기능이다.

 

브랜치를 그냥 단순하게 새로 만들어서 사용해도 좋지만,

만약 혼자 작업하는게 아니라 협업을 한다고 하면 브랜치 전략을 사용하는것이 좋다.

브랜치 전략에 대해 설명하자면 또 길어지니 브랜치 전략에 링크를 걸어두었으니 가서 확인해 보도록 하자.

브랜치 조회하기

git branch라는 명령어를 통해 간단하게 현재 존재하는 브랜치를 조회할 수 있다.

$ git branch
* master

아래 화면을 보면 현재 존재하는 브랜치가 master 브랜치뿐이라는 것을 알 수 있다.

 

여기서 재미난 점은 브랜치가 여러개 있을 때 더 확연하게 보이겠지만 git branch 목록 중 현재 자신이 사용하고 있는 branch의 경우 저렇게 * 표시와 색깔로 강조 표시를 해준다.

 

그리고 만약 원격저장소가 따로 존재한다면,

로컬 브랜치와 원격저장소의 브랜치를 전부 확인할 수 있는 옵션이 존재한다.

git branch -a 이라는 옵션을 사용하면 된다.

$ git branch -a
$ git branch -all

이건 뭐 git branch -h를 통해 설명을 보면 알겠지만 list both remote-traching and local branches라고 쓰여있어 확인하기도 쉽다.

브랜치 생성하기

브랜치 생성 역시 매우 간단하다.

git branch <브랜치 이름> 형식으로 생성하면 된다.

# git branch <브랜치이름>
$ git branch record

자 생성을 했으면 당연하게도 확인을 하는 게 인지상정 아니겠는가?

 

하지만 하나 알아둬야 할 점이 있는데, 브랜치를 생성하게 되면 현재 HEAD에 생성된다는 점이다.

 

현재 HEAD에서 작업을 분기하고자 하는 목적으로 브랜치를 생성한 것이면 상관은 없겠지만 만약 다른 지점에서 브랜치를 생성해서 사용하고자 한다면 브랜치를 생성할 때 head를 입력해 주면 된다.(tag처럼 hash를 입력해주면 된다.)

# git branch <브랜치이름> <HASH>
$ git branch it b7ee023

그런 다음 log를 확인하면 아래와 같이 브랜치 위치가 지정된 것을 확인할 수 있다.

브랜치 이동하기

브랜치를 생성했으면 해당 브랜치로 이동해서 작업을 해줘야 한다.

브랜치 이동하는 방법에는 크게 두가지가 존재한다.

# git checkout <브랜치이름>
$ git checkout record

# git switch <브랜치이름>
$ git switch record

뭐 둘다 동일한 기능을 해서 아무거나 사용해도 상관은 없겠지만,

사실 예전에는 checkout이라는 명령어를 통해 거의 모든 작업을 했다고 한다.

 

그렇지만 너무 하나의 명령어에 모든 기능이 집약되어 있다면 많은 문제를 야기할 수 있어 이동 전용 명령어인 switch가 생겨나게 되었다.

그렇기 때문에 되도록 그냥 switch라는 명령어를 통해 브랜치 이동을 해주는 것이 좋다고 생각된다.

 

그리고 git의 좋은 점은 현재 사용하고 있는 브랜치를 보여준다는 점이다.

 

경로 우측을 보면 현재 브랜치명이 명시되어있다.

 

브랜치 이동을 그냥 저런식으로 해도 되겠지만 브랜치를 미리 생성해두기만 하는 게 아니라 만약 생성과 동시에 해당 브랜치에서 바로 작업을 진행하고자 한다면, 간편하게 생성과 동시에 바로 이동할 수 있는 옵션이 존재한다.

# git checkout -b <브랜치이름>
$ git checkout -b mine

# git switch -c <브랜치이름>
$ git switch -c mine

브랜치 삭제하기

브랜치 삭제는 보통 분기점에서 한번 사용했던 브랜치를 삭제해주거나, 뭐 같은 말이지만 더 이상 사용하지 않는 브랜치는 작업하면서 헷갈릴 수 있으니 제거해주는 편이 좋다.

 

삭제 명령어는 매우 간단한데, 특이한 점은 소문자와 대문자에 따라 다르다는 점이다.

# git branch -d <브랜치이름>
$ git branch -d it

# git branch -D <브랜치이름>
$ git branch -D it

왜 이렇게 소문자와 대문자를 굳이 나눠놨을까?

 

간단한 설명은 역시 git branch -h를 입력해서 확인해보면 설명이 나오는데,

git branch -d 옵션을 사용해서 branch를 지울 경우 해당 브랜치가 만약 문제가 있는 브랜치다(정상적인 머지 상태가 아니거나 충돌이 해결되지 않은 브랜치) 라고 판단될 경우 git에서 에러를 발생하며 명령어가 실행되지 않는다.

git branch -D 옵션의 경우에는 대문자로 만들어놓은 것처럼 그냥 다 무시하고 삭제하라 라는 의미이다.

 

그래서 뭐 혹시 놓친게 있을 수 있으니 안전하게 git branch -d 옵션을 사용해서 지워주도록 하자.

브랜치 병합하기

자 대망의 브랜치 병합하기에 대해 알아보자.

보통 브랜치를 병합하는데, git merge 명령어를 사용하지만 상황에 따라 git rebase라는 명령어를 사용하기도 한다.

git merge

그림을 보고 이해하는게 간편하겠지만 이는 본문 하단에 참고 사이트를 들어가 보면 좀 더 직관적으로 이해할 수 있을 것이다.

우선 위에서 만든 record라는 브랜치와 master라는 브랜치에서 각각 작업을 하고 commit을 하게 되면 아래와 같은 로그가 출력된다.

 

좌측을 보면 분기가 나뉘어 로그가 출력되고 있다.

이 상황에서 mater 브랜치와 record 브랜치를 병합을 해보자.

# 현재 본인이 있는 브랜치에 다른 브랜치를 병합 하겠다는 의미이다.
# git merge <브랜치이름>
git merge record

자 그럼 병합을 하게 되면 어떻게 될까?

(* 이전에 사용했던 명령어를 가져오다 보니 mlog라는 이상한 형식으로 캡처가 되었으니 mlog가 아니라 log이다.)

병합용 커밋이 따로 생성되는 것을 확인할 수 있을 것이다.

이 같은 병합을 "3-way-merge"라고 한다.

 

자 이제 다른 경우를 한번 살펴보자.

이번에는 master브랜치는 아무 작업도 안 하고 새로운 브랜치를 하나 만들고 해당 브랜치에서만 작업을 했을 때 병합하면 어떤 현상이 발생하는지 확인할 것이다.

 

우선 상황을 보면 master 브랜치가 위치한 곳에서 mine 브랜치가 새롭게 생성되었고,

mine 브랜치에서 작업을 하고 commit을 한 상태를 로그가 출력하고 있다.

 

이 상태에서 master 브랜치에 mine 브랜치를 병합하면 어떻게 될까?

 

신기하게도 여기서는 병합용 커밋이 새롭게 생성이 안된 것을 볼 수 있다.

이는 master 브랜치에서 아무 작업도 하지 않았으며, mine 브랜치에서만 작업을 했기 때문에 master 브랜치만 mine 브랜치가 있는 위치로 이동만 된다면 병합이랑 마찬가지 이기 때문에 이런 현상이 발생하는 것이다.

 

이 같은 병합을 "fast-forward(빨리 감기) 병합"이라고 한다.

 

깔끔해서 보기 좋지만 만약 병합의 이력을 남기고 싶다면 병합 옵션을 하나 추가해 주면 된다.

# git merge --no-ff <브랜치이름>
git merge --no-ff mine

fast-forward를 하지 않겠다 라는 옵션을 줌으로써 공통 commit을 추가하게 된다.

 

merge 이력을 남기기 위해서 주로 사용되며, 실제로 출력되는 것을 보면 아래와 같이 출력된다.

 

fast-forward와 달리 병합용 커밋이 생겨난 것을 볼 수 있다.

git rebase

위에서 git merge에 대해 알아봤는데, 그렇다면 git rebase라는 녀석은 뭘까?

rebase 역시 그림을 통해 배우는 게 가장 이해하기도 쉬울 것이다.

(이 역시 본문 하단 참고 글을 확인하거나 따로 찾아보는 것을 추천한다.)

# 내 브랜치의 commit들을 대상 branch에 재배치
$ git rebase <브랜치이름>

git rebase는 git merge에서 설명한 것 중에 3-way-merge라고 있을 것이다.

이 녀석을 fast-forward 하기 위해 사용한다고 생각하면 된다.

 

그렇다면 3-way-merge를 fast-forward를 하기 위해서 어떻게 해야 할까?

가장 쉬운 방법은 역시 커밋을 한 줄로 만드는 것이다.

 

여기서 또 어떻게 커밋을 한줄로 만들까?

이게 git reabse의 역할이다.

 

자 설명을 대충 했다면 간단하게 그림과 함께 알아보자.

아래와 같이 3-way-merge 상태의 로그가 있다고 해보자.

 

자 여기서 record 브랜치에서 커밋한 것을 git rebase 명령어를 통해 한줄로 되기 위해 옮길 것이다.

 

git rebase를 사용하면 이렇게 된다. 한줄로 만들기 위해 커밋을 재배치했기 때문에 앞에 HASH를 보면 코드 자체가 달라진 것을 볼 수 있다.

 

여기서 한 가지 문제점이 생기는데,

만약 본인 로컬에서만 작업했던 녀석이면 상관없는데 원격 저장소에 영향을 줄만한 녀석을 git rebase 명령어를 통해 재배치를 하게 되면 commit 이 변경되기 때문에 문제가 생긴다.

그렇게 때문에 원격 저장소에서는 사용하지 않는 것을 권장한다.

 

이런 식으로 git rebase를 사용하고 git merge를 하게 되면 fast-forward를 통해 그래프가 깔끔하게 나오는 것을 볼 수 있다.

 

병합할때 사용하는 git merge나 git rebase의 경우에는 현재 소속된 팀 상황에 맞게 사용해주면 될 것이다.


참고: https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

Git - 브랜치란 무엇인가

3.1 Git 브랜치 - 브랜치란 무엇인가 모든 버전 관리 시스템은 브랜치를 지원한다. 개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와

git-scm.com

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

 

누구나 쉽게 이해할 수 있는 Git 입문~버전 관리를 완벽하게 이용해보자~ | Backlog

누구나 쉽게 알 수 있는 Git에 입문하신 것을 환영합니다. Git을 사용해 버전 관리를 할 수 있도록 함께 공부해봅시다!

backlog.com

반응형


댓글

TOP