[Git] Merge 전략

Happy_Nerd·2021년 4월 7일
0

Git

목록 보기
5/5
post-thumbnail

어떤 방식으로 merge를 하는가에 따라 commit history가 달라진다.
commit history가 어떻게 남는지가 중요한 이유는 commit은 의미있는 하나의 변경사항이기 때문이다.

commit 메세지를 보고 어떤 사항이 어떤 이유로 변경되었는지 파악할 수 있는 것이 좋다.
의미있게 기록을 남겨두면

  1. 언제 이슈가 발생했는지 찾기 쉽고,
  2. 다른 사람이 작성한 코드를 수정해야할 상황이 생겼을 때 좀 더 수월하게 파악해서 수정할 수 있다.

따라서 상황에 맞게 적절한 merge 전략을 사용하여 commit history를 남기는 것이 중요한데,
git의 merge 전략에는 대표적으로 3가지가 존재한다.

Merge Commit

일반적인 merge 전략

위의 그림처럼 합쳐지는 것이 일반적인 merge이다.

// dev 브랜치를 master에 병합하는 경우
git checkout master
git merge dev

장점
merge된 브랜치가 삭제되어 사라져도 history에는 그대로 남아있어서
어떤 브랜치에서 어떻게 merge가 되었는지 파악이 가능하다는 것이고,

그로 인한 단점
자잘한 commit들이 있을 때 그런 commit들의 기록조차 남아서 가독성이 떨어질 수 있고,
브랜치가 여러개로 나눠진 경우도 마찬가지로 가독성을 떨어뜨린다.


(으악..)

Squash and Merge

여러 개의 commit을 하나로 합친 후 merge

merge에 대해 작성한 글에서 merge 명령어 중 --squash 옵션을 준 명령어가 있었다.
squash 옵션을 주면 병합시킬 때 commit 이력을 하나로 만들어준다.

Squash and Merge 전략이 squash 옵션을 사용해서 병합시키는 전략이라고 생각하면 될 것 같다.
merge할 브랜치의 commit을 전부 하나의 commit으로 합친 후 타겟 브랜치에 병합시키는 것이다.
Squash and Merge에서 발생하는 merge commit은 병합으로 인해 생성된 commit이라기보다는
다른 브랜치의 변경사항을 하나로 합친 commit과 같다.

// dev브랜치를 master에 Squash and Merge 전략을 사용해 merge
git checkout master
git merge --squash dev
git commit -m "squash merge"

Squash and Merge 전략의 장점
merge commit이 남아서 merge된 브랜치가 있었다는 것을 히스토리에서 알아볼 수 있고,
버전 별로 어떤 것이 변경되었는지 한 눈에 알 수 있다.
또한 merge된 브랜치의 변경 내역을 하나의 commit으로 합쳐서 병합시켰기 때문에 해당 브랜치에 있었던
자잘한 commit 내용이 가독성을 떨어뜨리는 일이 없다.

단점
merge된 브랜치의 변경 내역이 하나의 commit으로만 남기 때문에 어떠한 과정으로 변경되었는지에 대한
정보를 알 수 없다.


(Squash and Merge 전)


(Squash and Merge 후)

Rebase and Merge

Rebase 기능을 사용해 브랜치를 merge

Rebase는 브랜치의 베이스를 새로 설정하는 명령어다.
merge할 브랜치가 타겟 브랜치에서 변경된 것처럼 브랜치 히스토리의 베이스를 변경해 merge시키는 것이
Rebase and Merge 전략이다.

git checkout dev
git rebse master
git checkout master
git merge dev

장점
commit 히스토리를 단순하게 만들어준다.
rebase의 경우 브랜치를 병합할 때 merge commit의 기록이 남지 않아서 마치 하나의 브랜치에서 작업한 것처럼 보여진다.
작업 내역을 그대로 살려서 타겟 브랜치에 병합시키기 때문에 commit에 대한 정보를 알 수 있다.

단점
merge commit이 남지 않기 때문에 병합시킨 브랜치가 언제 병합되었는지의 시점을 알 수 없다.
그래서 태깅에 더 신경써야한다고 한다. (tag)
그리고 Merge Confilct이 발생했을 경우 각각의 commit에 충돌이 발생해서..
merge할 브랜치의 commit 내용이 많다면 조심해야한다..!


(Rebase and Merge 전)


(Rebase and Merge 후)



참고
- 팀장님 발표 자료
- https://evan-moon.github.io/2019/08/30/commit-history-merge-strategy/
- https://im-developer.tistory.com/182

0개의 댓글