프로젝트를 진행하면서 자연스레 협업을 위해 git을 사용했다. git을 단순히 저장소의 버전 관리 용도로 사용하긴 쉽지만, 팀원들과 함께 협업을 위한 툴로 사용하기엔 많은 룰을 정해야 했다.
완벽한 정답은 없고 완벽한 프로젝트도 없지만 프로젝트를 거치면서 git을 어떻게 하면 조금 더 잘 쓸지 고민해본 부분을 작성했다.
처음으로 시작한 프로젝트는 제대로 된 git 전략도 없이 시도했고, fork를 하면서 작성했던 커밋들은 툭하면 충돌이 발생했다. 명목뿐인 PR이 이뤄졌고, 말 그대로 저장소로 GitHub를 사용했다. 프로젝트를 진행하면서 점점 버전 관리가 힘들어지고 git을 사용함에 룰이 필요하다고 절실히 느꼈다.
다음 프로젝트에서 제일 처음 시작한 부분은 fork를 버리고, 하나의 공통 레포에서 브랜치를 사용했다. 동아리 활동을 하면서 작성한 레포였고, 선배들에게 우린 Git-flow를 사용하고 있어요를 추천 받아 읽고 적용하기 시작했다.
기능 단위로 팀원들이 개발을 담당하면서 개발하는 기능 단위로 브랜치 네이밍을 정했다. 개발 초기엔 잘 나뉘어 이뤄졌지만, 프로젝트의 기간이 길어지면서 단점이 생겼다.
프로젝트 내에서 fast-forward를 하지 않고, Pull Request와 3 way-merge를 최대한 활용했다.
3 way-merge는 merge 대상과 fast-forward 관계로 브랜치가 정리되더라도 강제로 merge 커밋을 생성하는 방식으로 실행하면 아래와 같은 그림이 된다.
$ git merge --no-ff <branch name>
merge에 대한 정보뿐만 아니라 브랜치에서 진행한 내용을 커밋 단위로 확인할 수 있다
문제가 발생한 커밋에 대해 되돌리기 쉽다
이전 프로젝트를 끝내고 현재 프로젝트를 진행하면서 이슈 관리 방식을 도입했다. GitHub Issue나 JIRA를 사용하여 이슈를 관리하고 그에 대해 이슈 번호를 붙여 진행하고 있다.
이슈를 도입하면서 브랜치명을 feature/3
과 같은 방식으로 이슈 번호를 사용하여 정했다. 이슈를 통해 주요 업무 내용과 담당자를 정했고 이를 확인하여 브랜치를 관리하는 방식을 사용했다.
이슈와 연계하여 브랜치를 정하면서 이전 프로젝트의 문제였던 동일 기능에 대한 브랜치 문제를 해결할 수 있었다. 이슈에서 업무 내용을 기술하고 있기 때문에 동일 기능이라도 다른 이슈 번호를 통해 네이밍을 다르게 설정하면서 문제를 해결했다.
뿐만 아니라 이름 중복이 삭제되고, 이전 브랜치를 다시 동기화하며 사용할 이유가 없어지면서 종료된 이슈에 대한 브랜치를 삭제함으로 브랜치의 개수를 관리할 수 있었다.
현재 프로젝트에선 Squash Merge를 활용하여 이력을 관리하고 있는데, Squash Merge를 활용하는 경우 아래의 그림처럼 브랜치의 커밋 내역이 하나의 커밋으로 압축되어 브랜치에 머지된다.
Merge 외에도 rebase interactive 모드를 사용하여 여러 개의 커밋을 하나의 커밋으로 압축하여 Squash Merge 시 생성되는 머지 커밋과 동일하게 생성할 수 있다.
$ git merge --squash <branch name>
커밋 히스토리가 깔끔하다
머지된 브랜치는 하나의 커밋만 진행되기 때문에 해당 브랜치에서 확인하면 다른 브랜치 없이 하나의 큰 줄기로 커밋 단계를 확인할 수 있다
이슈 단위 브랜치 사용 시 관리가 편해진다
종료된 브랜치는 재사용할 염려가 없고, 머지된 내역은 Squash 되어 관리되므로 종료된 이슈에 대한 브랜치를 삭제하기 쉬워진다
커밋 단위의 복구가 어렵다
커밋이 하나의 커밋으로 압축되기 때문에 커밋 단위로 빠른 복구를 진행하기 어렵다.
이름이 못생겨진다
커밋하면서 열심히 정한 메시지가 다 커밋의 Body로 들어가게 된다.
Rebase Merge도 있으므로 또 고민이 생기면 시도해보겠지만 현재 프로젝트에서 Squash Merge로 꽤 만족스러운 히스토리 관리가 이뤄지고 있다고 생각한다.
Squash Merge는 커밋 레벨의 확인이 어렵고, 복구가 어렵다고 많이 들었다. 하지만 사용하면서 커밋 단위를 기능으로 잘 나누었다면 Merge 커밋도 기능 단위로 관리되므로 확인이나 복구도 쉬울 것으로 생각된다.
하지만 완벽한 기술은 없고 프로젝트 초기에 내 눈에만 완벽해 보이기 때문에 전략을 설정함에서 프로젝트의 성격 및 팀 내 정책에 따라 잘 반영하는 것이 중요하다고 생각된다.