ETC/Git

[git] merge, rebase

seokhyun2 2021. 3. 6. 17:42

0. branch

깃에서 merge와 rebase를 알아보기 위해서는 브랜치부터 알고 넘어가야 합니다.

브랜치는 가지라는 뜻으로 소스코드를 여러 버전으로 관리할 수 있게 해줍니다.

여러 버전으로 관리함으로써, 현재 배포되어 있는 브랜치를 따로 관리하고, 기능을 개발하고 있는 버전의 브랜치 또는 급하게 수정해야되는 핫픽스 브랜치 등으로 나눠서 관리하여 코드 관리를 편하게 할 수 있습니다.

 

깃헙에서 레포지토리를 처음 생성하면 main이라는 기본 브랜치를 생성해줍니다.

main에서 출발하는 브랜치를 생성하면, 처음에는 현재 main 브랜치와 똑같은 상태가 복사되어 새로운 브랜치가 생성이 됩니다.

브랜치 생성은 아래의 명령어로 수행할 수 있습니다.

git branch new_branch

생성된 브랜치로 전환하려면 아래의 명령어를 사용하면 됩니다.

git checkout new_branch

git checkout은 브랜치를 전환해주는 명령어인데, -b 옵션을 주면 생성하면서 브랜치를 전환할 수 있습니다.

아래와 같이 실행하면 위의 2줄을 한번에 실행하는 것과 같습니다.

git checkout -b new_branch

 

1. merge

브랜치를 만들었으면 합칠수도 있어야겠죠?

브랜치를 합치는 명령어가 바로 merge입니다.

아까 생성한 new_branch에서 뭔가 작업을 하고 main 브랜치로 합쳐보도록 하겠습니다.

new_branch에서 작업을 한 후에 커밋까지 하면 main 브랜치와 new_branch에 다른 점이 있게됩니다.

new_branch에서 작업한걸 main 브랜치로 명령어로 머지를 하는 방법은 아래와 같습니다.

git checkout main
git merge new_branch

main 브랜치로 변경해주고 new_branch를 main 브랜치에 머지해주었습니다.

 

아래의 명령어를 입력하면 머지가 된 것을 그래프로도 확인할 수 있습니다.

git log --graph --oneline

 

여러 사람과 작업할 때는, 저렇게 바로 머지하지 않고, 그 전에 코드 리뷰 과정을 거치게 됩니다.

그래서, new_branch에서 작업한 후에 push를 해서 pull request를 날리고 코드 리뷰를 받은 후에 머지를 많이 하고 있습니다.

 

2. rebase

rebase는 말 그대로 베이스를 바꾸는 작업입니다.

 

다음과 같은 상황을 한번 가정해볼게요.

main 브랜치의 코드가 배포되어 있는 상황이고, develop 브랜치에 추가 기능을 개발하는 중이였는데 갑자기 배포되어 있는 코드에서 장애가 발생하여 main 브랜치에서 hotfix 브랜치를 따서 버그를 수정하고 main 브랜치에 머지를 했습니다.

해당 수정된 부분이 개발 중인 추가 기능에도 영향을 끼칠 것 같아서, 해당 부분을 develop에도 적용하고 기능 개발을 계속 하고 싶은 상황이 닥쳤습니다.

현재 브랜치 상황을 그림으로 표현해보면 아래와 같습니다.

맨 아래의 main 브랜치에서 develop 브랜치를 만들어서 작업 중이였고, main에서 급하게 hotfix를 만들어서 버그를 수정하고 main 브랜치에 머지를 해주었고 develop은 이미 개발되고 있던 기능들로 자라서 새로운 develop이 된 상황입니다.

 

hotfix가 머지되어 바뀐 main을 적용해주려면 아래 그림처럼 바뀌면 깔끔하겠죠?

아래와 같이 rebase 명령어를 활용하면 가능합니다.

git rebase --onto main develop

 

rebase는 위와 같이 활용하지만, 간단하게 merge만 하는 경우에도 활용할 수 있습니다.

merge 대신에 활용할 경우에는 merge를 사용하면 그래프가 가지가 나왔다가 합쳐지는 그림이 나오는데,

rebase를 merge 대신에 사용하면 그래프에서 가지가 분리되지 않고 1자로 올라가게 그릴 수 있습니다.

 

혼자 조그만 프로젝트를 진행할 때는, merge만 사용해도 충분하지만 많은 사람이 동시에 작업을 하고 협업을 진행할 때는

rebase를 사용하는 것도 commit log graph가 보기 쉽게 잘 정리된다는 장점이 있으니 차이를 알고 있으면 좋겠습니다.

'ETC > Git' 카테고리의 다른 글

모노 레포(Monolithic Repository)  (0) 2024.01.21
[git] 깃 브랜치 전략, git branching strategy - GitFlow  (0) 2021.01.24