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)
$