개발을 하며 깃을 사용해 본 적이 있을 것이다. 그치만? 아무리 써도 가끔씩 깃이 꼬일 때가 있고 어려울 때가 있다. 그렇다면 깃을 효과적으로 사용하는 방법을 알고라도 있어야 되지 않을까??
gitflow란?
git-flow는 Vincent Driessen의 branching model을 적용해 고수준으로 저장소를 관리할 수 있게 해주는 확장 기능이다. branching model은 feature - develop(dev) - release - hotfix - master 단계로 브랜치를 나눠 코드를 관리하는 전략이며 사용자가 쉽게 접근하고 사용할 수 있도록 확장 기능(명령어)을 제공하는 것이다. git-flow에는 5가지 브랜치가 있다. 항상 유지되는 주요 브랜치들(master, develop)과 일정 기간 동안만 유지되는 보조 브랜치들(feature, release, hotfix)이 있다.
gitflow는 git을 사용한 개발 작업 절차다. 프로그램이 아닌 약속, 규칙 같은 개념이다. Vincent Driessen 또한 gitflow는 완벽한 방법론이 아닌 각자 팀에 맞는 개발 환경에 따라 변형해 사용하는 게 좋다.
gitflow는 원래 깃 브랜치 관리를 위한 전략이었던 git workflow다.
gitflow는 이제 최신 지속적인 소프트웨어 개발 및 Devops 사례를 위한 권장사항으로 간주되는 트렁크 기반 워크플로우를 선호하여 인기가 떨어졌다.
gitflow는 또한 CI/CD와 함께 사용하기 어려울 수 있다. gitflow는 feature 브랜치와 여러 기본(primary) 브랜치를 사용하는 대안적인 git 브랜치 모델이다.
nvie에서 Vincent Driessen에 의해 처음 대중화됐다. 트렁크 기반 개발과 비교할 때 gitflow에는 더 오래 지속되는 수많은 브랜치와 더 큰 커밋이 있다.
이 모델에서 개발자는 feature 브랜치를 만들고 기능이 완료될 때까지 이를 기본 트렁크 분기에 병합(merge)하는 것을 연기한다. 이러한 수명이 긴 feature 브랜치는 병합하기 위해 더 많은 협업이 필요하고 트렁크 분기에서 벗어날 위험이 더 높다.
충돌하는 업데이트를 도입할 수도 있다. gitflow는 예정된 출시 주기가 있는 프로젝트와 지속적 제공의 DevOps 모범 사례에 사용할 수 있다. 이 워크플로우는 feature 브랜치 워크플로우에 필요한 것 이상으로 새 개념이나 명령을 추가하지 않는다.
대신 매우 구체적인 역할을 다른 브랜치에 할당하고 상호 작용 방법과 시기를 정의한다.
feature 브랜치 외에도 release 준비, 유지관리 및 기록을 위해 개별 브랜치를 사용한다. 물론 풀 리퀘스트, 격리된 실험(isolated experiments), 더 효율적인 협업 등 feature 브랜치 워크플로우의 모든 이점을 활용할 수도 있다.
gitflow의 장점
병렬 개발 : 깃 플로우의 장점 중 하나는 완료된 작업에서 새 개발을 분리해 병렬 개발을 매우 쉽게 만든다는 것이다. 새 개발(기능 및 긴급하지 않은 버그 수정)은 feature 브랜치에서 수행되며 개발자가 코드를 릴리즈할 준비가 되었다고 생각할 때만 코드 본문에 다시 병합된다. 중단은 BadThing(tm)이지만 한 작업에서 다른 작업으로 전환하라는 메시지가 표시되면 변경사항을 커밋한 뒤에 새 작업에 대한 새 feature 브랜치를 만들기만 하면 된다. 해당 작업이 완료되면 원래의 feature 브랜치를 checkout하고 중단한 부분부터 계속할 수 있다.
협업 : feature 브랜치를 쓰면 둘 이상의 개발자가 같은 기능에 대해 더 쉽게 공동 작업을 할 수 있다. 각 feature 브랜치는 새 기능을 작동시키는 데 필요한 변경사항만 변경되는 샌드박스이기 때문이다. 따라서 각 공동 작업자가 수행하는 작업을 매우 쉽게 보고 따라할 수 있다.
릴리즈 스테이징 영역 : 새 개발이 끝나면 아직 출시되지 않은 완성된 기능들을 위한 준비영역인 develop 브랜치로 다시 병합된다. 따라서 다음 릴리스가 develop에서 분기되면 완료된 모든 새 항목이 자동 포함된다.
긴급 수정 지원 : 깃 플로우는 hotfix 브랜치(태그가 지정된 릴리스에서 만든 브랜치)를 지원한다. hotfix에선 긴급 수정 사항만 포함돼 있으므로 이를 사용해 긴급 변경을 수행할 수 있다. 동시에 새 개발에 실수로 병합할 위험이 없다.
확실히 협업을 할 때는 깃을 통해 좀 더 편리하게 협업을 할 수 있을 것 같다.
참고 : 깃 플로우