개발일지 #5 (git merge)
오늘은 커밋한 깃을 합치는 여러 가지 방법에 대해 공부했다.
이전 일지에서는 깃 브랜치 사본을 만들고, 각 브랜치에서 스테이징과 커밋을 한 후에 병합을 하는 방법에 대해 기록했다.
오늘은 병합(merge)의 다양한 방법이자 종류에 대해서 공부했다.
일반적으로 지난 일지에서 사용했던 병합은 ‘3-way-merge’라고 불린다.
메인 브랜치에서 복사된 다른 브랜치들에서 커밋된 내용과 메인 브랜치에서 커밋된 내용을 합칠 때 일반적으로 쓰이는 방법이다.
두 번째 병합 방법은 ‘fast-forward-merge’ 다.
메인 브랜치에서는 커밋한 내용이 없고, 새로운 브랜치에서만 커밋한 내용이 있을 경우 자동적으로 ‘fast-forward-merge’가 작동한다.
이 병합 방법은 새로운 브랜치가 메인 브랜치로 옮겨오는 방식이다. 쉽게 설명하자면, 새로운 브랜치의 커밋들을 잘라내서 메인 브랜치 최근 커밋 뒤에 붙이는 것이라고 보면 된다.
만약 'fast-forward-merge' 방식이 싫고 '3-way-merge'로 꼭 병합하고 싶다면 아래의 코드를 입력하면 된다.
git merge --no --ff branchName
세 번째 병합 방법은 'rebase'다.
병합이라고 보기 힘들지만, 각각의 브랜치에서 커밋된 것들을 합치는 역할이기에 병합이라고 표현했다.
'rebase'는 메인 브랜치에서도 커밋이 한 상태이고 새로 만든 브랜치에서도 커밋이 된 상태일 때, 새로운 브랜치의 커밋 내용을 메인 브랜치의 가장 최근에 커밋 뒤에 이동시키는 것이다.
git switch newbranch
git rebase main
git switch main
git merge newbranch
위의 명령어를 입력하게 되면 'rebase' 방식으로 브랜치를 합칠 수 있다.
'rebase'를 쓰는 가장 큰 이유는 다량의 브랜치가 생성되었고, 다양한 커밋이 이루어졌을 때 '3-way-merge' 또는 'fast-forward-merge'를 통해 병합을 하게 된다면 'git log'를 통해 보았을 시, 복잡하고 깔끔하지 않기 때문이다.
그리고 main 브랜치의 로그만 확인하고 싶어도 그동안 병합했던, 다른 브랜치의 커밋 내용도 보이기 때문에 사용한다.
단점으로는 브랜치들끼리 커밋한 내용의 차이가 심할 경우, 충돌(conflict)이 많이 발생해서 해결하는데 시간이 다소 투자될 수 있다는 점이다.
'3-way-merge'로 인해 복잡해진 로그를 최대한 정리할 수 있는 또 다른 방법으로는 'squash'가 있다.
'rebase'와 비슷하지만 다른 점은 'squash'의 경우 다른 브랜치에서 커밋된 내용을 따로 병합시켜 메인 브랜치 뒤에 새롭게 커밋이 된다.
('rebase'의 경우는 다른 브랜치에서 커밋된 내용이 따로 병합되지 않고 커밋된 내용 그대로 메인 브랜치 뒤로 이동이 된다.)
git switch main
git merge --squash newbranch
git commit -m 'message'
위의 명령어를 입력하면 squash를 통한 병합이 가능하다.