git branch 명령어를 통하여 현재 작업 분기를 여러 갈래로 나눌 수 있습니다. 나누었던 브랜치에서 작업이 끝나면 메인 브랜치로 다시 합쳐야 합니다. 이것이 브랜치 병합(merge)입니다. 브랜치 병합 도중 "충돌"이 발생할 수도 있는데, 이번 포스팅에서는 브랜치를 합치는 방법과 충돌이 일어났을 경우 해결하는 방법들에 대해서 알아보도록 하겠습니다.
git merge
다음과 같이 새로운 브랜치를 생성하고 커밋까지 작성했다고 가정해봅시다.
# 브랜치 생성 (practice1)
git branch practice1
# 커밋 작성
git add .
git commit -m "Initial Commit"
새로운 브랜치 practice1에서 작업을 마무리한 후, 코드를 main(master) 브랜치로 합치고 싶다면 "git merge" 명령어를 사용하면 됩니다. git merge 명령어의 사용법은 다음과 같습니다.
# main 브랜치로 이동
git switch main
# practice1 브랜치를 현재 있는 main 브랜치와 병합
git merge practice1
이렇게 git merge 명령어를 사용하면 practice1 브랜치는 main 브랜치와 합쳐집니다. 다만 브랜치를 합쳐도 남아있는 브랜치가 자동으로 삭제되지 않기에 삭제 명령어(git branch -d)를 통하여 직접 필요없는 브랜치를 삭제하면 됩니다.
충돌 (Merge Conflict)
그러나 브랜치를 서로 합칠 때는 주의해야할 것이 있습니다. 바로 "충돌"입니다. 충돌(Merge Conflict)이란 서로 다른 브랜치에서 같은 파일이나, 같은 줄을 수정하고 병합할 때 부딪히는 현상을 말합니다.
아래의 사진이 바로 충돌이 일어난 상황입니다. 같은 파일에서 master 브랜치와 practcie1 브랜치의 코드가 다른데 병합을 시도하였기에 다음과 같이 충돌이 발생한 것입니다.
해결방법은 간단합니다. <<<<<< / >>>>>> / ===== 같은 쓸데없는 것들 지운 후, 자신이 남기고자 하는 코드를 남기고 git add 파일명, git commit -m "메세지" 를 입력하여 새로운 커밋을 생성하면 됩니다. 그러면 충돌이 해결되고 브랜치도 정상적으로 잘 합쳐지게 됩니다.
브랜치를 합치는 여러 방법
브랜치를 합치는 방법은 다양합니다. 대표적으로 3-Way Merge, Fast-Forward Merge 등이 있습니다.
3-Way Merge
각 브랜치에 커밋이 있는 경우, git merge 명령어를 사용하면 두 브랜치의 코드를 합쳐서 새로운 커밋을 만들어주는 방식이 바로 3-Way Merge 방식입니다. 이 경우 같은 파일에 대해 다른 변경사항이 있을 경우 "충돌"이 발생하게 됩니다. 위의 방법대로 해당 파일의 충돌을 해결한 후 커밋을 하면 됩니다.
Fast-Forward Merge
기준이 되는 브랜치(Main, Master, etc)에는 신규 커밋이 존재하지 않고 다른 브랜치에만 커밋이 존재할 때 브랜치 병합을 하는 경우, 자동으로 Fast-Forward Merge가 이루어집니다. 새로운 커밋이 생기지 않고 HEAD의 위치만 변하게 됩니다.
Rebase & Merge
rebase(재배치)는 브랜치가 뻗어나온 기준점을 변경하는 것을 말합니다. rebase를 이용하여 새로운 브랜치의 기준점을 최근 커밋으로 옮긴 후 Fast-Forward Merge를 하는 것입니다. 이러한 방식으로 병합을 하면 "병합 커밋을 보지 않는다"는 장점이 있습니다. 하나의 브랜치에서 작업한 것과 같은 효과를 얻을 수 있기에 커밋 로그가 깔끔해집니다. 다만, rebase는 브랜치끼리의 작업 내역 차이가 많은 경우 충돌이 많이 발생할 수 있습니다.
Rebase and Merge를 하는 방법은 다음과 같습니다.
# practice1 브랜치로 이동
git switch practice1
# practice1 브랜치를 main 브랜치로 재배치
git rebase main
# main 브랜치로 이동
git switch main
# main 브랜치에서 practice1 브랜치를 fast-forward merge하기
git merge practice1
Squash & Merge
3-Way Merge의 가장 큰 단점은 병합한 브랜치들의 커밋 내역까지 모두 보여지기에 커밋 로그가 매우 복잡하고 지저분해진다는 것입니다. Squash and Merge 방식은 병합할 브랜치에 있는 모든 커밋들을 하나의 커밋으로 만든 후, 기준이 되는 브랜치에 추가하는 방식으로 병합합니다. 커밋 로그가 매우 깔끔해진다는 장점이 있으나, 병합할 브랜치의 모든 커밋 이력이 사라져버린다는 단점이 있습니다.
Squash and Merge를 하는 방법은 다음과 같습니다.
# main 브랜치로 이동
git switch main
# --squash 옵션을 통한 병합
git merge --squash 브랜치명
# 기존의 커밋들을 하나로 합친 새로운 커밋
git commit -m "메세지"