쓰기 권한이 없는 외부 repo 에 코드를 작성하고 싶다면 해당 repo 를 fork 해서 본인의 remote repo 로 가져오는 것은 개발자라면 알고 있을 것이라고 생각한다. 이번 포스팅에서 중점적으로 다룰 내용은 권한이 없는 외부 repo 와 remote repo, local 관리에 대해 다룰 것이다.
외부 repo 에 접근 권한이 없다면 당연히 branch 생성 권한도 없을 것이다. 그렇기 때문에 본인의 github 아이디와 동일한 이름 (어떤 이름이든 상관없긴하다.) branch 생성 요청을 한다. (branch 생성 요청에 대해서는 여기서 다루지 않겠다.)
branch 가 생성된 것을 확인했으면 외부 repo 를 본인의 remote repo 로 fork 한다.
이제 코드를 작성하면 되는데 remote repo 에 직접 코드를 작성할 순 없다. 코드 작성을 위해선 local 에 clne 명령을 해주면 되는데 이때 fork 한 repo 에는 모든 branch 가 전부 fork 되기 때문에 아래 명령어를 참고하여 single branch 만 clone 이 되도록 하자.
git clone {https remote repo 주소} -b {branch name} --single-branch
여기까지 왔으면 코드 작성을 위한 모든 준비가 거의 다 끝났다. 한 가지 더 해주어야 할 점이 있는데 정말 중요하니 꼭 꼭 명심하도록 하자.
보통 개인 프로젝트를 진행하는 개발자나 개발에 입문한지 얼마 안된 개발자들은 main(master) branch 에서 작업을 진행하는데 이번 포스팅은 앞서 언급했듯이 외부 repo 를 fork 해서 remote repo, local 을 관리하는 것이다. 우리의 목표를 local 에서 코드 작성을 하고 commit, push 를 진행해 remote repo 에 올려주고 해당 작업들을 외부 repo 에 pull request 를 보내면 외부 repo 관리자는 pull request 확인해서 해당 repo (외부 repo) 에 merge 를 하게 되고, merge 된 내용을 다시 본인의 remote repo 로 가져와서 local 에 pull 한 뒤 지속적으로 contribute 를 하는 것이다.
이 과정에서 main(master) branch 하나로 진행한다면 외부 repo 의 commit hash 값과 본인의 remote repo 의 commit hash 값이 달라져 또 다른 작업들을 pull request 후 merge 하게 되면 merge conflict 가 발생해난관을 겪게 될 것이다. 좀 더 자세한 내용은 필자의 블로그에 포스팅 해놨으니 참고하면 좋겠다.
결국 필자가 하고 싶은 말은 작업은 항상 branch 를 생성하여 새로운 commit 을 쌓도록 진행하고, pull request 후 merge 가 되면 main(master) 에 fetch, rebase 명령어를 통해 동기화를 시키고 다시 branch 를 생성해 반복적으로 contribute 를 하면 되겠다.
앞서 branch 를 생성해야 하는 이유에 대해 언급하다보니 전반적인 process 에 대해 간략히 설명을 드렸는데 그래도 각 단계에 대해 이어서 작성해보고자 한다.
remote repo 코드 작성을 위해 clone 을 하고 branch 를 생성하게 되면 본격적인 코드 작성을 하면 된다. 원하는 작업을 진행하면 해당 내용들을 remote repo 에 올려주어야 하는데 commit & push 명령어 이다. git 을 써봤더라면 해당 명령어는 이해하고 있을테니 넘어가도록 하겠다.
하루 또는 몇 일 단위로 작업을 완료했다면 외부 repo 에 pull request 를 보내 contribute 를 해야한다. 이때 주의할 점은 외부 repo 의 branch 와 remote repo 의 branch 가 동일한 상태에서 pull request 보내는게 일반적이다.
외부 repo 관리자가 본인의 pull request 를 승인했다면 (repo 설정에 따라 자동 merge 가 되는 경우도 있다.) 외부 repo 의 본인의 branch 에 pull request 내용이 merge 가 되고 이제 merge 된 내용을 local 의 main(master) branch 에 가져와야 한다. 이 과정은 fetch 를 통해 upstream (외부 repo) branch 를 참조하고 rebase 를 통해 local 에 동기화 시킬 수 있다.
이후에는 다시 새로운 branch 를 생성해서 반복적으로 작업을 진행하면 된다.
fetch, rebase 명령어에 익숙하지 않아 좀 더 공부를 해봐야겠지만 fetch, rebase 말고도 pull 가 fetch + merge 의 기능을 함축하고 있어 pull 명령어로도 fork 저장소 관리를 할 수 있다고 한다. 정말 repo 관리에는 정답이 없다고 생각한다. 개발자 본인이 잘 판단해야 하는 부분이 크기에 꾸준히 공부해야겠다.
fork 저장소 관리 과정에 대해 이해를 했으니 오늘도 필자는 성장했다.