RCS -> CVS -> Subversion 순으로 버전관리 시스템을 사용해 왔었고 Subversion 을 잘 사용하고 있다고 생각했는데 git 과 github 를 사용해 보고 나니 subversion 이 얼마나 불편한 버전관리 시스템인지 알게 되었다. 하지만 git 이 좋은 걸 알지만 Subversion 을 오래 써온 익숙함이 git 을 배우는데 장애물로 작동하는거 같다.

CVS 에서 Subversion 으로 전환은 사실 크게 어렵지 않았다. 물론 저장소의 포맷이 달라서 예전 데이타를 migration 하는데 약간의 노력이 들긴 했지만 두 시스템은 개념이 흡사하고 (subversion 은 CVS 의 단점을 해결하는데 주안점을 두고 설계해서 그런듯 하다) 명령어나  사용법도 거의 동일해서 사용자 입장에서 크게 변화되는 건 없었던 것 같다.

하지만 git 의 근간인 DVCS 는 개념은 겨우 이해하겠지만 clone, checkout, fetch, pull, push 등은 생소하고 또 subversion 명령어와 자꾸 비교하는 습관때문에 익숙해 지기가 더 어려운 것 같다.

그중에 최근에야 제대로 이해한 github 에서 기존 프로젝트를 fork 후에 작업 및 Contribution 하는 절차에 대해서 정리해 본다.

문서는 github 의 매뉴얼(https://help.github.com/articles/fork-a-repo)  를 참고했다. 명령어는 편의를 위해 command 에서 하는 것과 개인적으로 최고의 git GUI client 라 생각하는 SourceTree 를 사용하는것 두 가지 다 정리해 본다.

 

Fork 하기

  1. 먼저 fork 할 프로젝트를 선택한다. github 는 Fork 테스트를 위해 Spoon-Knife 라는 repository 를 제공하고 있으니 이 프로젝트를 포크하도록 하겠다/
  2. Spoon-Knife 프로젝트로 들어간후에 우측 상단의 Fork 를 누른다
     
  3. 성공적으로 Fork 되면 내 repository 에 Spoon-Knife 프로젝트가 생성된다. 이제 clone 해서 local에서 작업 환경을 만들어 보자. URL중 username 은 자기의 github Id 로 변경해야 한다.

    $ git clone https://github.com/username/Spoon-Knife.git
    # Clones your fork of the repository into the current directory in terminal
    CODE

    SourceTree는 좌측 상단의 Clone/New 를 누른다.
     
    URL 에 https://github.com/username/Spoon-Knife.git 를 입력하고 Clone을 클릭한다.

     

  4. Remote 설정 - clone 후에는 origin 이라는 remote 가 생성되는데 이건 내가 Fork 한 프로젝트이다. pull 로 변경 내역을 받으면 원본 프로젝트에서 받는게 아니라 Fork 된 내 프로젝트의 변경내역을 받게 된다. 원본의 변경 내역을 파악하고 내 저장소에 반영해서 원 저자와 중복 작업을 하거나 원 저자의 예전 소스를 수정하는 일이 없도록 원본 저장소의 정보를 추가하자. (이걸 몰라서 예전 소스를 수정하고 pull request 를 하는 실수를 직접 저질렀다. ㅠ.ㅠ)
    remote add 명령어로 원본 저장소를 등록하자. 관례는 upstream 이라는 이름으로 등록하는것 같다.

    $ cd Spoon-Knife
    # Changes the active directory in the prompt to the newly cloned "Spoon-Knife" directory
    git remote add upstream https://github.com/octocat/Spoon-Knife.git
    CODE

    SourceTree는 왼쪽의 저장소를 선택후에 우측의 Settings 를 클릭한다.

    좌측 하단의 Add 를 누른다.

    Remote name 과 URL 을 입력하고 Ok 를 누른다.
     

  5. 이제 원본 저장소의 변경 내용을 가져와 보자. pull 과 fetch 의 차이점은 fetch 는 merge 를 수행하지 않는다는 것이다. merge 하면 내가 수정한 것이 변경될 수 있으므로 원본을 가져올 때는 fetch가 더 적당하다.

    git fetch upstream
    CODE

    SourceTree 에서는 상단의 Fetch 를 클릭한다.
    체크 박스중 Fetch from all remotes 가 기본적으로 선택되어 있다. 체크를 해제하면 remote 를 선택할 수 있다. 목록에서 upstream 을 선택하고 Ok 를 누르면 fetch 해 온다
     

 

그 외 할 수 있는 것들

  1. fork 한 프로젝트에서 수정한 게 있다면 push 를 통해 github repository 에 반영할 수 있다. 다음 명령어는 origin repository 의 master 브랜치에 push 한다.

    git push origin master
    CODE
  2. Pull in upstream changes

    git fetch upstream
    # Fetches any new changes from the original repository
    git merge upstream/master
    # Merges any changes fetched into your working files
    CODE
  3. 33

 

 

Ref