2008년 9월 24일 수요일

Git - CVS 에서 전환

첫번째 문서 중 중요 내용 요약, 약간의 내용

단어들

저장소
repository
중앙 저장소
central repository
개별 저장소, 작업본 저장소
local repository
작업본
working copy
bare 저장소
작업본이 없는 저장소
SHA1-number
git 은 모든 object 에 SHA1 hash number 를 생성한다. 이것은 어떤 파일이나 특정 commit 등을 지정하는데 사용할 수 있다.

처음

이름과 이메일 설정

 git config --global user.name "Your Name"
 git config --global user.email "my@email.com"

원할 경우, conflicts 해결을 위해 머지(merge) 툴을 설정할 수 있다.

 git config --global merge.tool meld

CVS 에서 하던 것처럼

괜히 더 복잡하다고 생각할 수도 있다.

중앙 저장소를 두는 셋팅의 경우.

가져오기
 cvs checkout

 git clone <server>:/path/to/repos/project.git
중앙 저장소에 바뀐 부분 가져오기
 cvs update

 git pull origin master
수정한 것을 중앙 저장소로
 cvs update
 cvs checkin file1 file2 ...

 git pull origin
 git commit file1 file2 ...
 git push origin master

여기에서 git 과 CVS 의 차이가 확연히 나타난다. git 의 commit 은 개별 저장소에만 commit 을 하는 것이다. (git 의 경우 작업본마다 개별 저장소를 가지고 있다.) 중앙 저장소에 push 하는 것은 별개의 작업이다.

좀 더 유용한 작업 방식은 아래 처럼.

 ... 작업
 git commit file1 file2 ...
 ... 작업
 git commit fileN dir2 ...
 ... 작업
 git commit -a  # (수정 사항 모두 commit)
 ... 새로운 기능 완성!
 git pull origin master
 git push origin master
기타 작업
 cvs add file1 ...
 git add file1 ...

 cvs remove file1
 git rm file1

파일 이동이나 이름 바꾸기

 [cvs remove, add 각각]
 git mv file1 file

지운 파일 살리기

 cvs update
 git checkout file1

commit 을 자주

git 과 CVS 의 가장 큰 차이 두가지:

  • 작업본이 완전한 저장소 - commit 과 commit 들을 보내는 차이가 존재함
  • 각각의 파일 상태를 추적하는 것이 아니라 전체 상태를 추적함

git 의 commit 은 CVS 의 그것과 같다. 다만 push 하기 전까지 그것은 개발자의 작업본 저장소에만 적용된다. 중앙 저장소로 push 하면 개발자의 저장소와 중앙 저장소는 같은 상태가 된다. 마지막 push 이후 12번의 commit 을 했다면 12번의 commit 이 중앙 저장소로 push 된다. CVS 에서라면 서버에 직접 12번 commit 을 했어야 한다. git 에서는 원하는 만큼 commit 하고 됐다고 생각될 때 서버로 작업한 것을 올릴 수 있다.

결론 : git 은 자주 commit 하는데 부담이 없다.

Branch

git 에서 branch 와 merge 는 (CVS에 비해서) 아주 간단하다. 사실 각각의 개별 저장소는 각각의 branch 라고 할 수 있다.

branch 만들기

 git branch <branch>

특정 지점 으로 branch 만들기

 git branch <branch> <지점>

<지점> - 다른 branch, tag, SHA1-number 등이 올 수 있다.

branch 목록 보기

 git branch

작업 branch 바꾸기

 git checkout <branch>

git checkout 은 branch, tag 등 지점을 가져오는데도 사용되고 파일이나 디렉토리를 가져오는데도 사용된다.

branch 지우기 - commit 들이 현재 branch 에서 추적 가능한 경우에만

 git branch -d <branch>

branch 지우기 - commit 들이 추적 불가능한 경우에도 지워버림

 git branch -D <branch>
작은 오류 수정 push

작은 오류 수정을 해야할 필요가 있는데, 많은 commit 을 했고 push 할만한 상태가 아닐 경우, branch 가 유용할 수 있다.

  • 아직 수정하지 않은 경우 - 임시 branch (fix 라고 이름 지었다고 가정)를 만들고 checkout 한다. 문제를 해결하고 commit, 서버에 push 한다. 작업 branch 를 chekout 하고 수정사항을 서버에서 pull 한다. fix branch 를 지운다.
  • 문제를 이미 해결하고 commit 해둔 경우 - 임시 branch (fix)를 만든다. 오류 수정한 commit 의 SHA1-number 를 찾는다. (gitk 나 git log 사용) git cherry-pick SHA1-number 로 해당 commit 만을 fix branch 에 반영한다. push 하고 작업 branch 를 checkout 한다. fix branch 를 삭제한다.
기타 유용한 경우
  • 실험 branch
  • 둘 이상의 release 관리
  • 특화 기능 추가 요청
  • 등등 …

submodule

git 은 파일 하나 하나의 변화를 추적하는 대신 전체의 변화를 한 commit 으로 관리한다. 부분별 관리가 따로 필요할 경우를 위해서 만들어진 기능이 submodule 기능이다.

Manual 참조.

기타

  • push 는 bare 저장소에 쓰기 위한 것이다. 작업본이 있는 저장소에도 push 를 할 수 있기는 하지만 작업본까지 바꾸지는 않기 때문에 개발자를 혼란에 빠뜨릴 것이다.
  • GUI 가 있다. "git gui". pull은 없고 fetch 와 merge 를 해야한다.
  • git bisect - 버그가 들어온 경우, 어떤 commit 때문인지를 2진 검색(binary search) 으로 찾을 때 사용.

댓글 없음: