앞서, Branch를 파서 main으로 pull request를 날린다는 발언을 했다. 이게 무슨 뜻일까?
간단하다. 말 그대로, main 브랜치에 merge하고 싶다는 뜻이다. 아니 사실 말 그대로는 아니지. 왜 이름이 merge request가 아닌가? 이에 대한 공식적인 설명이 있는지는 모르겠으나, 필자는 내 브랜치 pull 땡겨서 되는지 봐주세요라는 의미로 해석했다.
앞서, Branch A 와 B가 둘 다 분기 이후에 똑같은 파일의 똑같은 줄을 서로 다르게 수정했을 때, 누구의 손을 들어 줘야 하는가에 대한 이야기를 했다. 이 역시 답은 간단하다.
git이 자동으로 merge conflict를 터트려 준다. 난 못하겠으니 merge 하고 싶으면 알아서 해결해오라는 소리다. 참으로 불친절해 보이지만 그렇지 않다. 당연히 프로그래머가 하는 게 맞지.. 사실 상당히 친절하다. merge conflict를 해결하라고 말하며, 코드를 다음과 같이 바꿔 준다.
<<<<<< A
어쩌구 저쩌구 A가 바꾼 내용
------
저쩌구 어쩌구 B가 바꾼 내용
>>>>>> B
이 부분이 이렇게 코드가 다르게 수정되었으니 알아서 해결하세요 ㅎㅎ 하는 것이다. 그러면 프로그래머는 다른 위치를 딱 보고, conflict를 해결한 다음 git이 추가해 준 친절한 친구들을 지우면, 이제서야 merge할 수 있게 된다.
그래서 이 브랜치들과 pull request들을 어떻게 잘 사용할 수 있느냐? 사실 혼자 할 거면 딱히 필요 없다. 이는 최소 2인 이상이 같은 repository 위에서 협업할 때 빛을 발하며, 이럴 때 쓰이는 일반적인 업무 진행 방식이 있다.
git에 최적화된 방식이다. 아주 큰 프로젝트에서 주로 사용하는데, 버그 픽스를 이리 날리고 저리 날리고 브랜치들끼리 이리 갔다 저리 갔다 하는 방식인데.. 너무 복잡해서 시간이 날 때 추가로 설명할 테니 우선은 구글링하길 바란다.
github를 사용하는 사람들이 많은데, 사실 git flow는 아주 복잡하지만 드럽게 엄밀하기 때문에 아주 큰 - 코드 리뷰에만 몇 주가 걸리는 - 프로젝트에 적합하다. 그 정도가 아니라, 적당한 수준의, 작은 규모의 그룹에서 사용하는 코드라면 github flow가 더 좋을 수 있다.
그러니, github flow의 경우 main이 아닌 branch에서 branch가 분기되어 나올 일이 그리 많진 않다. git flow는 분명 아주 좋은 협업 방식이고, 아주 엄밀한 방식이지만, 빛을 발하는 상황이 그리 많지는 않기 때문에 일반적인 수준의 작은 프로젝트의 경우에는 github flow를 사용하는 게 훨씬 좋을 수 있다.