Search
Duplicate

Git branch 입문하기 - 머지할게요

간단소개
git branch 알고가자!
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
git
태그
Scrap
8 more properties

branch의 뿌리는 대체 어디...?

혼자 개발할 때에는 branch의 필요성을 느끼지 않고 작업하였다.
하지만 팀 프로젝트를 진행해보니... 하나의 프로젝트를 여러명이 작업하게 되고...
서로의 코드가 충돌이 날 수 있다는 것을 인지한 후, 코딩 작업보단 branch에 대한 이해가 필요하다고 느꼈다.
첫 테스트는 처참했다.. 갈 길을 잃은 나뭇가지들이 아련하게 나를 보고 있었다
처음부터 여러개의 branch를 테스트 하지 않고 하나의 branch로 테스트를 해보기로 하였다.

branch 생성하기

branch를 생성하는 것은 간단하다. 아래 명렁어에 원하는 branch이름을 넣어주기만 하면 끝!
git branch "branch name" # ex) # git branch b1
Shell
이렇게 생긴 branch를 지우려면 아래 옵션을 사용하면 된다.
git branch -d "branch name" # ex) # git branch -d b1
Shell
현재 로컬의 branch 목록을 보려면 뒤에 오는 이름을 빼면 된다. 오른쪽의 사진을 보면 현재 b1과 main branch가 있는 것을 알 수 있다.
git branch
Shell
*표시와 초록색으로 highlight 되어 있는 부분이 현재 위치한 branch이다. 이제 우리가 생성한 b1이라는 branch로 이동해보자
git checkout "branch name" # ex) # git checkout b1
Shell
oh my zsh을 사용하거나 쉘 세팅이 되어있다면, 현재 branch가 표시되는 것을 볼 수 있다.
checkout 명령을 사용한 후, main에서 b1으로 이동한 것을 알 수 있다.

로컬 branch를 원격 서버로 올리기

위에서 만든 branch는 현재 로컬 repository에 존재한다. git을 사용하다보면 가끔 많은 사람들이 헷갈려하는 부분이 바로 git과 github이 같다고 생각하는 것이다.
github은 git을 바탕으로하는 코드 호스팅 플랫폼이다. 이렇게 github와 같은 네트워크상의 저장소를 remote repository라고 한다. 이렇게 원격 저장소 상의 repository를 clone해서 생성해 local에서 존재하는 repository가 local repository이다.
결국 우리가 작업한 branch도 local상의 branch이기 때문에 remote repository에 내가 branch를 만들었다는 것을 알려주어야 한다.
git push --set-upstream origin "branch name" # ex) # git push --set-upstream origin b1
Shell
upstream을 한 번 설정하고 나면 다음부터는 git push 또는 git pull이라고 명령어만 입력해도 자동으로 origin의 main 브랜치로부터 push와 pull을 진행한다. 이유가 upstream 옵션을 통해 해당 브랜치에서 upstream과 downstream 관계가 설정됐기 때문이다.
하지만 우리는 지금 첫 branch를 설정하는 것이기 때문에 꼭 upstream관계를 지정해 주어야 한다. 이제 remote repository에 우리가 branch를 만들었다는 사실을 알려주도록 하자.
이 작업을 완료하고 나면 github에서도 방금 생성한 branch가 표시되는 것을 확인할 수 있다.
origin이란? clone했을 때는 origin이 자동으로 등록되어있고, init했을 때는 git remote add origin ...으로 origin을 직접 등록하라고 안내한다. 여기서 말하는 origin이 깃허브에 존재하는 repository 즉, remote를 뜻한다. 다만 remote에 origin이라는 이름을 붙인 것 뿐이다.

Git Graph extension을 통해 branch 상태를 시각적으로 확인해보기

VS code의 Git Graph extension을 활용하면, 현재 repository의 branch상태를 실시간으로 확인할 수 있다.
git branch 연습를 연습하면서 시각적으로 비교해 보는 것이 도움이 많이 되었다.

branch에서 코드를 수정하고 merge!

branch의 코드를 수정하고 main에서 merge할 때, 두가지 상황이 있을 수 있다.
첫 번째는 main의 코드가 수정되지 않은 상태에서 branch만 수정된 경우, 두 번째는 main의 코드와 branch의 코드가 각각 수정된 경우이다.

1) main의 코드가 수정되지 않은 상태에서의 merge

만약 branch를 만들고 코드를 수정한 후 main에서 merge를 하려고 하는 상황에서, main의 코드가 변경사항이 없다면 아주 간단한 merge가 일어날 것이다. 그림에 master라고 표기된 부분은 main, bugfix는 sub로 부르겠다.
실제로 새로 만든 branch는 main branch의 이력을 모두 가지고 있기 때문에 main branch는 sub branch의 위치로 이동하기만 해도 sub branch의 내용을 적용할 수 있다. 이러한 병합 방식을 fast-forward(빨리 감기) 병합이라고 부른다.
이제 실제로 위와 같은 상황을 적용해보자. b1에서 b1.txt파일만 추가하고 main의 코드는 아무것도 건드리지 않은 상태로 merge를 진행한다. merge를 하는 방법은 아래와 같다.
git merge "branch name" # ex) # main branch에서 b1을 merge하려면! # git checkout main # git merge b1
Shell
실제로 충돌나는 부분이 없기때문에 아무 문제없이 merge가 된 것을 알 수 있다. 오른쪽의 사진을 보면 두 branch가 완전히 합쳐진 모습을 볼 수 있다.
그렇다면 두 번째 경우는 어떨까?

2) main의 코드와 branch의 코드가 각각 수정된 경우

아래의 그림을 보면 sub branch가 X, Y의 수정사항을 가지고, main branch는 C, D의 수정사항을 가졌다.
이때 main에서 sub branch를 merge하면 어떻게 될까? 이때는 양쪽의 변경을 가져온 merge commit(병합 커밋)을 실행하게 된다. 병합 완료 후, main로 통합된 이력이 아래 그림과 같이 생기게 된다.
실제로 이러한 상황을 만들어보자! 우선 새로운 b2라는 branch를 만들고 main에서는 C, D file, b2에서는 X, Y file을 만든 후 merge를 진행할 것이다.
양쪽 branch에서 모두 commit, push를 진행한 후, main branch로 돌아와서 merge를 진행해보자
git checkout main git merge b2
Shell
merge를 진행하니 갑자기 이렇게 위협적인(?)메세지가 뜨면서 나를 상당히 초조하게 만들었다. 주석을 천천히 읽어보면 크게 위협적인 내용이 아니였다.
우선은 message는 남기지 않고 q를 눌러서 나가도록 하자.
그러면 아래와 같이 정상적으로 두 branch가 merge된 것을 볼 수 있다. 오른쪽의 git graph사진을 봐도 예시와 거의 동일한 형태를 보여준다.

추가) non fast-forward 병합

1번과 같은 경우에서도 non fast-forward 병합 옵션을 사용하면 2번과 같은 형태의 graph를 만들 수 있다.
—no-ff 옵션을 사용하면 된다.
git merge --no-ff "branch name" # ex) # git merge --no-ff b4
Shell
해당 옵션으로 merge하면 main에서 수정사항이 없음에도 아래와 같은 graph를 만들어 낼 수 있다.

branch를 병합하는 또 하나의 방법! Rebase!

merge 와 rebase 는 통합 브랜치에 토픽 브랜치를 통합하고자 하는 목적은 같으나, 그 특징은 약간 다르다.
merge변경 내용의 이력이 모두 그대로 남아 있기 때문에 이력이 복잡해진다. main에서의 커밋과 sub branch에서의 커밋이 겹치게 될 수 있다.
rebase이력은 단순해지지만, 원래의 커밋 이력이 변경됨. 정확한 이력을 남겨야 할 필요가 있을 경우에는 사용하면 안됨.
rebase를 하게 되면 main이 수정하지 않은 상태에서 branch를 수정한 형태와 동일하게 변경된다. 따라서 main은 현재 위치에 그대로 남아있고 main의 이력을 가지고 있는 sub branch가 메인의 앞쪽에 위치하게 된다.
결국 main도 최신버전으로 유지하려면 fast-forward 병합을 진행해 주어야 한다. main branch에서 merge sub branch만 해주면 된다.
이제 배운것을 활용해서 원하는 형태의 branch graph를 완성해보자! Git branch Workflow 보면서 연습하다보니 많은 도움이 되었다.

Reference