Using Github

git 사용해보기

sudo apt-get install git-core

git config —global user.name "My Name"
git config —global user.email somebody@example.com

cd project
git init
touch README
git add README
git commit -m 'first commit to git'
git remote add origin git@github.com:account/project.git
git push origin master

github 사용하기

남의 프로젝트에 끼어들기

다음과 같은 방식으로, 마음에 드는 남의 프로젝트에 참여할 수 있다. 여기서 참여의 방식은 "forking"+"pull request" 이다. 먼저, 프로젝트 페이지의 "fork" 버튼을 이용하여 자신의 버전을 만든다. 이렇게 되면 본 프로젝트의 커밋 권한과 상관없이 내 마음대로 commit할 수 있는 공간이 마련된다. 그리고 다음 명령으로 작업 컴퓨터에 작업본을 "복제"한다. (Reality을 위하여 실제 프로젝트의 예를… :-)

$ git clone git@github.com:sio4/redmine-todos-scrum-plugin.git redmine_todos_plugin
Initialized empty Git repository in /opt/redmine/vendor/plugins/redmine_todos_plugin/.git/
remote: Counting objects: 388, done.
remote: Compressing objects: 100% (346/346), done.
remote: Total 388 (delta 182), reused 0 (delta 0)
Receiving objects: 100% (388/388), 279.35 KiB | 109 KiB/s, done.
Resolving deltas: 100% (182/182), done.
$

이렇게 만들어진 clone에는 자신의 기원에 대한 정보가 들어있다. 확인해보면,

$ git remote -v
origin    git@github.com:sio4/redmine-todos-scrum-plugin.git
$

이렇게, "origin"이라는 이름의 "remote"가 등록되어 있으며 이것을 이용하여 작업본과 원본의 동기화를 진행하게 된다. 다시 말해서 내 컴퓨터에 위치한 clone에서는 실질적인 변경 작업이 이루어지고 그 결과는 origin이라고 부르는 github의 저장소에 주기적으로 동기화/업로드/밀어넣기(push)를 하게 된다.

그런데, 이 fork가 원본과 완전히 결별하기 위한 것이라면 이 정도의 설정으로 개발을 진행하는데 문제가 없다. 그러나 우리가 fork를 한 이유는 그것이 아니다. 분산 버전 관리를 위한 것이지 궁극적으로 모든 작업의 결과는 본 프로젝트에 집어넣기를 바란다. 그래서, 다음과 같이 또 하나의 remote 사본을 관리하게 된다.

$ git remote add upstream git://github.com/dalyons/redmine-todos-scrum-plugin.git
$ git remote -v
origin    git@github.com:sio4/redmine-todos-scrum-plugin.git
upstream    git://github.com/dalyons/redmine-todos-scrum-plugin.git
$

이제, origin 이외에 upstream이라는 이름의 원격 저장소가 등록되었다. 이렇게 해서, 남의 프로젝트에 끼어들 준비는 끝났다.

작업하기 - 나의 변경 내용을 반영하기

다음과 같은 방식으로 내가 변경한 내용을 fork한 저장소에 commit할 수 있다. (다음 내용은 파일 두 개를 새로 추가한 상태에서 변경 내용을 확인하고, 로컬 clone에 commit하고, 그 결과를 다시 fork한 저장소에 밀어 넣는 과정이다.)

sio4@km:/.../redmine_todos_plugin$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#    config/locales/ko.yml
#    lang/ko.yml
nothing added to commit but untracked files present (use "git add" to track)
sio4@km:/.../redmine_todos_plugin$ git add config/locales/ko.yml lang/ko.yml 
sio4@km:/.../redmine_todos_plugin$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    new file:   config/locales/ko.yml
#    new file:   lang/ko.yml
#
sio4@km:/.../redmine_todos_plugin$ git commit -m "add korean translation"
Created commit 67c1324: add korean translation
 2 files changed, 99 insertions(+), 0 deletions(-)
 create mode 100644 config/locales/ko.yml
 create mode 100644 lang/ko.yml
sio4@km:/.../redmine_todos_plugin$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
sio4@km:/.../redmine_todos_plugin$ git push origin master
Counting objects: 11, done.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 1.41 KiB, done.
Total 7 (delta 2), reused 0 (delta 0)
To git@github.com:sio4/redmine-todos-scrum-plugin.git
   64d94a2..67c1324  master -> master
sio4@km:/.../redmine_todos_plugin$  git status
# On branch master
nothing to commit (working directory clean)
sio4@km:/.../redmine_todos_plugin$

이제 나의 저장소와 작업공간은 동기화가 되었다. 이제, github.com의 내 프로젝트 페이지에 가서 "pull request" 버튼을 누르고 프로젝트의 원 저작자에게 나의 변경내용을 반영해줄 것을 요청할 수 있다.

작업하기 - 남의 변경 내용을 반영하기

앞서 얘기한 바와 같이, fork의 목적이 헤어지려 하거나 분리하려는 것이 아니다.

다음 명령은 upstream으로 부르고 있는 원본 저장소의 변경된 내용을 내려받아 내 작업사본에 저장해준다.

$ git pull upstream master
remote: Counting objects: 22, done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 16 (delta 8), reused 0 (delta 0)
Unpacking objects: 100% (16/16), done.
From git://github.com/dalyons/redmine-todos-scrum-plugin
 * branch            master     -> FETCH_HEAD
Merge made by recursive.
 README.rdoc           |    6 +++++-
 config/locales/de.yml |   36 ++++++++++++++++++++++++++++++++++++
 config/locales/fr.yml |   36 ++++++++++++++++++++++++++++++++++++
 config/locales/it.yml |   36 ++++++++++++++++++++++++++++++++++++
 init.rb               |    2 +-
 lang/de.yml           |   35 +++++++++++++++++++++++++++++++++++
 lang/fr.yml           |   35 +++++++++++++++++++++++++++++++++++
 lang/it.yml           |   35 +++++++++++++++++++++++++++++++++++
 8 files changed, 219 insertions(+), 2 deletions(-)
 create mode 100644 config/locales/de.yml
 create mode 100644 config/locales/fr.yml
 create mode 100644 config/locales/it.yml
 create mode 100644 lang/de.yml
 create mode 100644 lang/fr.yml
 create mode 100644 lang/it.yml
$ 
$ 
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 3 commits.
#
nothing to commit (working directory clean)
$ git push origin master
Counting objects: 20, done.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (12/12), 1.74 KiB, done.
Total 12 (delta 7), reused 0 (delta 0)
To git@github.com:sio4/redmine-todos-scrum-plugin.git
   23af36a..031ee41  master -> master
$ git status
# On branch master
nothing to commit (working directory clean)
$
따로 명시하지 않는 한에서 이 사이트의 모든 콘텐츠는 다음의 라이선스를 따릅니다: Creative Commons Attribution-NonCommercial 3.0 License