깃허브 Github 에 공개되어 있는 코드를 개량할 때, 회사의 Git 에 등록된 과제의 기능을 개발할 때 우리는 포크 Fork 를 통해 원격 저장소의 코드를 내 저장소로 옮긴후 작업을 하게 됩니다.
내 저장소에 옮겨진 코드는 필요에 따라 여러개의 브랜치 Branch 로 나뉘어지고, 개별 브랜치들은 내 저장소의 마스터 Master 브랜치와 머지 Merge 후 원격 저장소에 병합 요청을 하거나, 개별적으로 머지 요청을 하게 됩니다.
보통은 이런 절차를 따르기만 하면 문제가 없습니다. 하지만, 내가 포크한 소스코드의 원본 소스코드가 다른 사람에 의해 변경이 진행되고 원격 저장소에 병합된 내용이 등록되었다면 변경된 코드를 내 저장소로 동기화 할 필요가 있습니다.
지금부터 아래의 4단계를 통해 동기화를 진행해 보도록 하겠습니다.
1단계 - 원본 저장소 등록하기 : 업데이트된 파일을 가져오기 위해서 원본 저장소를 로컬 환경에 원격 저장소로 등록합니다
2단계 - 원본 저장소 변경분 로컬로 가져오기 : 업데이트된 파일을 가져오는 방법을 설명합니다
3단계 - 로컬 환경에서 원본 저장소와 포크한 저장소 병합하기 : 두 브랜치를 하나로 합칩니다
4단계 - 포크한 저장소를 원격의 git 에 업데이트 : 변경된 내역을 Push 합니다
1단계 - 원본 저장소 등록하기
우선 작업중인 환경에 원본 저장소를 원격 저장소 Remote Repository 로 등록해야 합니다.
아래의 예는 SSH 로 저장소의 주소를 등재한 경우입니다만, https 로 시작하는 주소를 쓰는 경우도 방법은 다르지 않습니다.
// 등록된 저장소 확인 $ git remote -v origin git@git.mycompany.com:nopd/AwesomeApp.git (fetch) origin git@git.mycompany.com:nopd/AwesomeApp.git (push) // 원격 저장소를 Upstream 으로 등록 $ git remote add upstream git@git.mycompany.com:SAJANGNIM/King.git ... $ git remote -v origin git@git.mycompany.com:nopd/AwesomeApp.git (fetch) origin git@git.mycompany.com:nopd/AwesomeApp.git (push) upstream git@git.mycompany.com:SAJANGNIM/King.git (fetch) upstream git@git.mycompany.com:SAJANGNIM/King.git (push)
2단계 - 원본 저장소 변경분 로컬로 가져오기
원격 저장소를 등록했으면 이제 원본 저장소의 변경된 내용을 로컬로 가져올 차례입니다. 변경된 내용을 가져오기 위해서 우리는 git fetch 명령을 사용할 예정입니다.
아래 명령을 수행하면 원격 저장소, 즉 upstream 저장소의 파일이 로컬에 적재됩니다.
// 원본 저장소를 upstream 으로 저장했으니 아래와 같이 호출합니다. // 파일은 upstream 의 master 브랜치에 저장되었습니다. // $ git fetch upstream master Enter passphrase for key '/blahblah/.ssh/id_rsa': remote: Counting objects: 9, done. remote: Compressing objects: 100% (9/9), done. remote: Total 9 (delta 7), reused 0 (delta 0) Unpacking objects: 100% (9/9), done. From git.mycompany.com:SAJANGNIM/King.git * [new branch] master -> upstream/master
3단계 - 로컬 환경에서 원본 저장소와 포크한 저장소 병합하기
2단계 까지 마쳤으면 1) 포크한 저장소 (origin) 의 로컬 환경 파일들과 2) 원본 저장소의 파일들이 로컬 환경에 준비가 된 것입니다.
이제 로컬 환경에서 변경된 파일을 합쳐주면 되겠죠? 포크한 저장소로 브랜치를 변경하고 git merge 명령으로 로컬 환경의 두 저장소 파일을 합치겠습니다.
참고로 브랜치 단위로 머지가 되는 것이니 포크한 저장소의 master 브랜치가 아닌 다른 브랜치를 upstream 의 브랜치와 합쳐도 무방합니다. 필요에 따라 선택해 주면 되는 부분입니다.
// 포크한 저장소의 로컬 브랜치로 환경을 변경합니다 // 아래 명령에서 master 는 origin/master 브랜치입니다 // $ git checkout master Switched to branch 'master' // 현재 브랜치 (origin/master) 에 원본 브랜치 (upstream/master) 의 변경분을 합칩니다 // $ git merge upstream/master Merge made by the 'recursive' strategy. apps/modal/Request.vue | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
4단계 - 포크한 저장소를 원격의 git 에 업데이트
이제 로컬 환경은 원본 저장소의 최신 변경 내역이 반영된 따끈따끈한 저장소가 되었습니다.
로컬 환경이 원래의 집이 아니기 때문에 그 어디엔가에 있을 github 혹은 사내의 git 서버에 변경내용을 업데이트 해주어야 하겠죠?
git push 명령으로 소스코드를 원격 서버로 업데이트 해보겠습니다.
// 손에 너무나도 익은 명령어를 입력해 봅니다 // $ git push origin master
개발자가 아니고 git 보다는 SVN 이 더 익숙하다보니 여러가지로 시행착오를 많이 겪고 있습니다.
사실 개발자 직군도 아닌지라 필요한 순간에만 git 을 쓰다보니 분명 주요한 명령, 패턴에 대한 한계가 있는 것 같습니다.
비슷한 어려움을 겪는 분들에게 이 글이 도움이 되길 기원해 봅니다.