우리는 프로젝트를 진행하면서 반드시 Github의 로그를 보게된다.
이상적인 Github 협업 flow는 다음과 같지만
우리의 Github 협업 flow는 엉망이었다.
어떻게 하면 이상적인 Github 협업 flow를 만들 수 있을까?
Github에는 다양한 브랜치 병합 방법이 있다.
Merge
,Squash & Merge
,Rebase & Merge
의 방법을 알아보도록 하자
일반적으로 많이 사용되는 병합이며, 커밋 이력을 모두 남길 때 사용한다.
이 방식은 다시 Fast-Forward 방식과 Recursive 방식으로 나뉜다.
새로운 브랜치my-branch
가main
브랜치로부터 분기된 이후,
main
브랜치에 새로운 커밋이 올라오지 않았다면,
my-branch
가main
와 비교하여 최신의 브랜치라고 할 수 있다.
이런 경우my-branch
의 변경 이력을 그대로 main 으로 가져올 수 있는데,
이를Fast-Forward Merge
라고 한다.
my-branch
가main
브랜치에서 분기되고,main
브랜치에 새로운 커밋이 생겼다면,
my-branch
를 최신이라고 간주할 수 없다.
따라서my-branch
와main
을 공통 부모로 한 새로운Merge Commit
을 생성하게된다.
이런 방법을Recursive Merge
라고 한다.
Fast-Forward Merge
가 가능한 상태에서 git merge 명령에 --no-ff 옵션을 주면 강제로Merge Commit
을 생성하게 할 수 있다.
Squash
는 여러개의 커밋을 하나의 커밋으로 합치는 것을 의미한다.
Squash Merge
는 병합할 브랜치의 모든 커밋을 하나의 커밋으로 Squash한 새로운 커밋을
Base
브랜치에 추가하는 방식으로 병합하는 것을 의미한다.
Squash를 하게 되면 모든 커밋 이력이 하나의 커밋으로 합쳐지며 사라진다는 점을 주의해야한다.
Rebase
를 알아보기 전에Base
가 무엇인지 알아보자.
my-branch
가main
브랜치의A
커밋에서 분기되었다고 하자.
이때,my-branch
의Base
는A
커밋이다.
그렇다면,Rebase
는 무엇일까? 말 그대로Base
를 다시 설정한다는 의미이다.
그럼Base
를 어디로 다시 설정할까?my-branch
가 분기된main
브랜치의 최신 커밋이다.
Rebase
를 하면 커밋들의Base
가 변경되므로 Commit Hash 또한 변경 될 수 있다.
이로 인해 Force Push를 해야할 경우도 있으니 주의하자.
참고한 글 : https://hudi.blog/git-merge-squash-rebase/
알아본 내용을 팀원들과 이해하고 익히기 위해 연습용 Github 저장소를 만들어 열심히 실험을 해보았다.
마침내 각 merge 방법들의 특징과 언제 사용하면 좋을지에 대한 결론에 도달하였다.
기능별 브랜치
->dev 브랜치
Squash & Merge
(하나의 기능에 대한 커밋을 묶어서 볼 수 있다)dev 브랜치
->master 브랜치
Rebase & Merge
(병합시 병합된 내용을 한눈에 볼 수 있다)
대학교에서 4년동안 사용해온 Github였지만, 4년내내 Squash&Merge만 사용해온지라
다른 병합 방법에 대한 지식과 방법들끼리 어떻게 다른지 전혀 모르는 상태였는데,
이번 기회를 통해 이상적인 협업에 한발자국 더 다가간 느낌이라 만족스럽다.