2. Category
❖ CVS, SVN
❖ Git 방식이란?
❖ Git 설정하기
❖ Git 이용하여 개발하기
11년 8월 28일 일요일 2
3. CVS, SVN
CVS, SVN
CVS(Concurrent Versions System) ; 동시 관리 버전 시스템
저장소의 파일들의 이름을 바꿀 수 없다.
SVN(Subversion) ; 자유 소프트웨어 버전 관리 시스템
네트웍 연결이 되지 않으면 자유로운 버전관리가 불가능하다.
11년 8월 28일 일요일 3
4. Git 방식이란?
❖ 저장소(repository)란?
❖ 어떻게 저장 대상을 결정하는가?
❖ 작업 트리(working tree)란?
❖ 어떻게 파일을 조작하고 동기화 하는가?
❖ 어떻게 프로젝트, 디렉토리 그리고 그 안에 포함된 파일을
추적하는가?
❖ 어떻게 태그(tag)를 이용해 마일스톤(milestone)을 기록
하는가?
❖ 어떻게 브랜치(branch)를 이용해 분기 이력을 추적하는가?
❖ 합치기(merge)란 무엇인가?
❖ 어떻게 Git이 파일 잠금을 처리하는가?
11년 8월 28일 일요일 4
5. Git 방식이란?
Git 방식의 강점
❖ 분산 아키텍쳐
- 항상 인터넷에 연결돼있어야 하는 고통 없이 동작한다.
❖ 쉬운 브랜치 만들기와 합치기
- 브랜치를 생성하기가 쉽다.
- 비용이 적다.
- 속도가 빠르다.
- 브랜치를 여러번 나눈 경우라도 간단히 합칠 수 있다.
❖ 서브 버전과 통신
- 회사 내에 자신만이 Git으로 바꿀 준비가 된 유일한 사람이라
면, 모두가 서브버전을 계속 사용하고 있어도 무방하다.
11년 8월 28일 일요일 5
6. Git 방식이란?
저장소(repository)란?
버전 관리 시스템에서 사용자가 변경한 모든 내용을 추적하는 공간.
ex) 은행(Bank)
은행 계좌 ➜ 저장소(repository)
은행 거래 내역 ➜ 저장소 이력
돈 ➜ 소스 코드(source code)
입금 ➜ Commit
⦁ Git 방식 : 현금 자동 인출기가 붙어있는 자신 만의 금고(개인은행)
⦁ 중앙 집중식 시스템 : 팀 구성원 모두가 사용하나는 하나의 은행
11년 8월 28일 일요일 6
7. Git 방식이란?
저장 대상을 결정
프로젝트를 진행하는 데 필요한 전부.
ex) Source code, Makefile, Rakefile, Ant(build.xml) 등..
그 외 : 설정 파일 예제, 문서, 이미지 등..
⦁ Makefile : C/C++ / Rakefile : Ruby / Ant : Java build
11년 8월 28일 일요일 7
8. Git 방식이란?
작업 트리(working tree)란?
모든 변경은 작업트리에서 이루어 진다.
작업트리 ➜ 모든 프로젝트(소스코드, 빌드 파일, 단위 테스트)
= 작업 복사본(working copy)
맨 처음의 작업트리는,
❖ 자신의 프로젝트를 저장소에 초기화 하도록 요청
❖ 기존 저장소의 프로젝트를 복제(clone)
복제하기(clone)는 지역 저장소를 만든 후 기본 흐름인 마스터 브랜
치에서 복사본을 체크아웃(check out) 한다.
⦁ 체크아웃(check out) : 사용자의 작업트리를 저장소의 특정 시점과 일치하도록 변경하는 것
11년 8월 28일 일요일 8
9. Git 방식이란?
파일을 조작, 동기화
❖ 변경 사항을 커밋(commit)하고 저장소에 새로운 리비전을 추가,
무엇을 변경했는지 로그메시지를 저장
❖ 바뀐 내용을 다른 개발자가 이용하게 하기 위해서 변경 사항을 공유
➜ 푸싱(pushing) : 바뀐 내용을 다른 개발자와 공유
❖ 다른 팀 멤버의 변경 사항을 가져와 최신으로 갱신하여 동기화 완료
➜ 풀링(pulling) : 다른 멤버의 변경 사항을 나의 저장소와 동기화
변경 사항 가져 오기
▶ 원격 저장소에 있는 변경 사항의 복사본 생성 ⇔ 푸싱
▶ 가져온 변경 사항을 지역 이력과 합친다 ⇒ 풀링
11년 8월 28일 일요일 9
10. Git 방식이란?
프로젝트, 디렉토리 안 파일 추적
❖ 저장 대상을 구조화
❖ 파일을 내용 단위로 추적 ; 최하위계층
ex) models.py 내 부의 변수나 함수 등을 구성하는 각 문자와
줄을 추적, 이름, 파일 모드(file mode), 심볼릭 파일 여부와 같은
메타데이터(metadata)를 models.py 에 추가 한다.
➜ 저장소의 전체 이력을 저장하는 데 필요한 공간 줄어듬.
❖ 저장소의 구조는 프로젝트 마다 다르다 ; 프로젝트에 알맞게 구성 .
➜ 프로젝트 마다 새로운 디렉토리, or 새로운 저장소
11년 8월 28일 일요일 10
11. Git 방식이란?
태그(tag), 마일스톤(milestone) 추적
❖ 마일스톤(milestone) ; 일정 간격으로 세워져 있는 이정표.
프로젝트가 잘 진행되고 나아갈 수 있도록 중간 중간의 목표지점
및 체크포인트로서 설정을 해 놓은 것.
➜ 날짜와 목적하는 상태에 대한 서술, 세부 항목들의 체크 리
스트, 중간 점검을 위함.
❖ 태그(tag) ; 저장소 이력의 특정 시점을 기록.
저장소 이력의 특정 위치를 기록해두어 참조 한다.
쉬운 이름을 특정 리비전의 태그에 부여 ➜ 저장소의 이력을 추적
11년 8월 28일 일요일 11
12. Git 방식이란?
브랜치(branch), 분기 이력 추적
마스터 브랜치
ex) ❖ 브랜치를 생성 ➜ 파일이 분기하는 위치가
책 = 저장소, 저장소에 기록됨.
시리즈 = 브랜치 ❖ 다른 브랜치와 분리하여 변경 사항을 지속
적으로 추적, 분기 이력을 생성.
⦁ 마스터 브랜치(master branch) ; 트렁크(trunk) : 개발의 기본 줄기
11년 8월 28일 일요일 12
13. Git 방식이란?
브랜치(branch), 분기 이력 추적
promt > git branch [..] master
릴리즈 브랜치
브랜치 생성
마스터 브랜치
ex) ❖ 브랜치를 생성 ➜ 파일이 분기하는 위치가
책 = 저장소, 저장소에 기록됨.
시리즈 = 브랜치 ❖ 다른 브랜치와 분리하여 변경 사항을 지속
적으로 추적, 분기 이력을 생성.
⦁ 마스터 브랜치(master branch) ; 트렁크(trunk) : 개발의 기본 줄기
11년 8월 28일 일요일 12
14. Git 방식이란?
브랜치(branch), 분기 이력 추적
promt > git branch [..] master
릴리즈 브랜치
브랜치 생성
마스터 브랜치
기타 브랜치
ex) milestone...
ex) ❖ 브랜치를 생성 ➜ 파일이 분기하는 위치가
책 = 저장소, 저장소에 기록됨.
시리즈 = 브랜치 ❖ 다른 브랜치와 분리하여 변경 사항을 지속
적으로 추적, 분기 이력을 생성.
⦁ 마스터 브랜치(master branch) ; 트렁크(trunk) : 개발의 기본 줄기
11년 8월 28일 일요일 12
15. Git 방식이란?
합치기(merge)란?
합치기(merge) : 브랜치의 이력을 하나로 합친다.
❖ Git 방식 : 사용자가 직접 하는 방식과 동일.
❖ 파일의 서로 다른 영역이 변경 ➜ Git이 알아서 합친다.
합칠 수 없는 상황 ➜ 오류가 있음을 기록, 사용자에게 충돌 알림.
(서로 다른 개발자가 같은 위치를 다르게 수정)
❖ 합치기 추적 ; Git이 합치기 추적 제공.
함께 합쳐진 커밋 내용을 추적, 이미 합쳐진 내용은 다시 합치지 않
음.
➜ CVS 같은 버전 관리시스템에서는 제공 되지 않음.
11년 8월 28일 일요일 13
16. Git 방식이란?
Git의 파일 잠금 처리
ex) 도서관에서 책을 빌림 = 체크아웃(check out)
strict locking ➜ 내가 사용하는 한 다른 사람 사용 금지.
optimistic locking ➜ 다수의 개발자 동시에 접근 가능.
① A 와 B가 모두 저장소의 복사본 생성, 각자 변경.
② 같은 파일의 다른 부분을 편집.
③ A가 자신의 변경 사항을 고유 저장소에 푸싱.
④ B도 자신의 변경 사항을 푸싱.
⑤ Git은 B의 푸싱을 거절.
➜ Why?
11년 8월 28일 일요일 14
17. Git 방식이란?
Git의 파일 잠금 처리
ex) 도서관에서 책을 빌림 = 체크아웃(check out)
strict locking ➜ 내가 사용하는 한 다른 사람 사용 금지.
optimistic locking ➜ 다수의 개발자 동시에 접근 가능.
① A 와 B가 모두 저장소의 복사본 생성, 각자 변경.
② 같은 파일의 다른 부분을 편집.
③ A가 자신의 변경 사항을 고유 저장소에 푸싱.
④ B도 자신의 변경 사항을 푸싱.
⑤ Git은 B의 푸싱을 거절.
➜ 복사본을 만든 후 파일이 변경됐으므로, B는 저장소에서 파일의 변경사항을 풀
링한 후, 충돌된 영역이 있다면 이를 처리 후 다시 서버로 변경사항을 푸싱 해야함.
11년 8월 28일 일요일 14
18. Git 설정하기
❖ Git 설치하기
❖ Git 구성하기
❖ Git 도움말 이용
11년 8월 28일 일요일 15
19. Git 설정하기
Git 설치하기
Linux :
$ sudo apt-get build-dep git-core git-doc
➜ git-core와 git-doc 패키지가 의존하는 모든 패키지 설치.
$ make prefix=/usr/local all doc
➜ 전체 사용자가 사용할 수 있도록 Git을 설치.
$ sudo make install install-doc
➜ 설치
Mac OS X:
$ sudo port install git-core +svn +doc
➜ Git과 git-svn을 설치
11년 8월 28일 일요일 16
20. Git 설정하기
Git 설치하기
Window : Cygwin, msysGit 등..
11년 8월 28일 일요일 17
26. Git 이용하여 개발하기
새 저장소 만들기
$ mkdir Project
$ cd Project
$ git init
❖ 초기에 사용할 어떤 내용물이 있다면,
$ tar xzvf MyProject.tar.gz
$ cd MyProject
$ git init
$ git add .
$ git commit
11년 8월 28일 일요일 23
27. Git 이용하여 개발하기
커밋 만들기
① 편집기를 이용하여 작업 디렉토리 상에 변경 사항을 만든다.
② git에게 변경 사항을 알려준다.
③ 위 단계에서 git에게 알려준 내용을 이용하여 커밋을 만든다.
$ git commit -m “message” -a # 가장 최신 버전 커밋
$ git commit -m “message” hello.c # 지정 파일만 커밋
11년 8월 28일 일요일 24
28. Git 이용하여 개발하기
차이점 살펴보기
$ git diff # 스테이징 되지않고 커밋되지도 않은 변경 사항 표시.
$ git diff --cached # 스테이징되지않은 변경 사항 표시 안함.
$ git diff HEAD # 작업트리, 스테이징된 변경 사항, 저장소의 모든
차이점을 비교함.
11년 8월 28일 일요일 25
29. Git 이용하여 개발하기
변경 사항 추적하기(1)
$ git status
11년 8월 28일 일요일 26
30. Git 이용하여 개발하기
변경 사항 추적하기(2)
$ git log
$ git log -1
11년 8월 28일 일요일 27
31. Git 이용하여 개발하기
브랜치 만들고 사용하기
$ git branch # 이 저장소 내의 모든 로컬 브랜치
$ git branch RB_1.0 master # 생성하려 것, 분기해 나올 것.
$ git checkout RB_1.0 # 브랜치를 RB_1.0으로 변경.
❖ 마스터 브랜치를 변경 했다면, 릴리즈 브랜치에는 없는 내용이다.
11년 8월 28일 일요일 28
32. Git 이용하여 개발하기
브랜치 합치기
$ git merge RB_1.0 # RB_1.0 브랜치의 변경 사항이 master 브
랜치에 합쳐진다.
$ git merge --squash hello.c # 모든 커밋을 하나의 커밋으로
밀어넣는다.
11년 8월 28일 일요일 29
33. Git 이용하여 개발하기
릴리즈 다루기
$ git tag 1.0 RB_1.0
$ git tag
1.0
hello.c 변수 추가
릴리즈 브랜치
hello.c 추가 hello.c 1차 수정 hello.c 1차 수정
마스터 브랜치
11년 8월 28일 일요일 30
34. Git 이용하여 개발하기
릴리즈 다루기
$ git checkout master
$ git rebase RB_1.0
$ git branch -d RB_1.0
$ git branch RB_1.0.1 1.0 hello.c 변수 추가
$ git checkout RB_1.0.1
릴리즈 브랜치
hello.c 추가 hello.c 1차 수정 hello.c 1차 수정
마스터 브랜치
11년 8월 28일 일요일 31
35. Git 이용하여 개발하기
릴리즈 다루기
$ git checkout master
$ git rebase RB_1.0
$ git branch -d RB_1.0
$ git branch RB_1.0.1 1.0
$ git checkout RB_1.0.1
hello.c 추가 hello.c 1차 수정 hello.c 변수 추가 hello.c 1차 수정
1.0
11년 8월 28일 일요일 31
36. Git 이용하여 개발하기
릴리즈 다루기
$ git archive --format=tar
--prefix=Project-1.0/ 1.0
| gzip > Project-1.0.tar.gz
# --format ; Git이 생성할 출력 파일의 형식
# --prefix ; 1.0 의 모든 내용을 Project-1.0/ 디렉토리 아래 포함.
# | gzip > ; git archive에 의한 tar파일을 파이프라인으로 연결하여,
gzip으로 압축.
$ git archive --format=zip
--prefix=mysite-1.0/ 1.0
| gzip > mysite-1.0.zip
11년 8월 28일 일요일 32
37. Git 이용하여 개발하기
원격 저장소 복제하기
$ git clone git://git.kernel.org/pub/scm/git/git.git
# git 프로그램
❖ 생성된 디렉토리에는,
프로젝트 파일의 복사본들(= 작업트리)과 프로젝트의 변경 이력에
대한 모든 정보를 포함하고있는 “.git”라는 최상위 디렉토리가 존재.
11년 8월 28일 일요일 33
38. Git 이용하여 개발하기
변경 사항 푸싱하기
❖ 프로젝트 구성원과 변경사항을 공유하도록 상위 저장소에 변경 사
항을 푸싱한다.
$ git push
$ git push --dry-run # 푸싱된 변경 사항 확인.
❖ 아무 매개변수 지정하지 않으면, origin 저장소에 동일한 이름의
브랜치로 동기화.
11년 8월 28일 일요일 34
39. Git 이용하여 개발하기
새로운 원격 저장소 추가하기
❖ 쉽게 말하면 내 저장소에 다른 저장소를 동기화.
❖ 기본 원격 저장소는 origin 이라고 명명하며, 복제한 저장소의 전
체 이름에 대한 별칭이다.
$ git pull git://ourcompany.com/dev-erin.git
$ git remote add erin git://ourcompany.com/dev-erin.git
$ git pull erin HEAD
⦁ 읽기나 쓰기 권한이 있다면 어떠한 저장소에서도 푸싱하거나 풀링 할 수 있다.
11년 8월 28일 일요일 35
40. 로컬 컴퓨터에서 생성된 Git 이용하여 개발하기
프로젝트를 원격 저장소에 추가
$ git remote add origin [email protected]:/repos/pocus.git
$ git push origin master
❖ 변경 사항을 푸싱하려는 저장소가 기본 저장소라면 원격 저장소를
origin으로 별칭을 지정한다.
⦁ 읽기나 쓰기 권한이 있다면 어떠한 저장소에서도 푸싱하거나 풀링 할 수 있다.
11년 8월 28일 일요일 36
41. The most commonly used git commands are:
add Add file contents to the index
bisect Find by binary search the change that introduced a bug
branch List, create, or delete branches
checkout Checkout a branch or paths to the working tree
clone Clone a repository into a new directory
commit Record changes to the repository
diff Show changes between commits, commit and working tree, etc
fetch Download objects and refs from another repository
grep Print lines matching a pattern
init Create an empty git repository or reinitialize an existing one
log Show commit logs
merge Join two or more development histories together
mv Move or rename a file, a directory, or a symlink
pull Fetch from and merge with another repository or a local branch
push Update remote refs along with associated objects
rebase Forward-port local commits to the updated upstream head
reset Reset current HEAD to the specified state
rm Remove files from the working tree and from the index
show Show various types of objects
status Show the working tree status
tag Create, list, delete or verify a tag object signed with GPG
11년 8월 28일 일요일 37