Git?
Git 은 프로그램 등의 소스 코드 관리를 위한 분산형 버전 관리 시스템이다. 빠른 수행 속도에 중점을 두고 있는 것이 특징으로 Git 의 작업 폴더는 모두, 전체 기록과 각 기록을 추적할 수 있는 정보를 포함하고 있으며, 완전한 형태의 저장소이다. 네트워크에 접근하거나 중앙 서버에 의존하지 않는다. 최초에는 리누스 토발즈가 리눅스 커널 개발에 이용하려고 개발하였으나, 현재는 널리 사용되고 있다.
Git 에 대해 네이버에 검색을 해보면 다음과 같은 결과를 볼 수 있다.
SVN 을 이용하다 Git 으로 전환하면서 서버설정부터 Git 계정관리 등을 설정해야 한다는 것을 알았을 때는 정말 재수 없는 놈이었다. 하지만 Git 은 그 모든 과정을 감내하고 사용할 만한 매력이 있었다.
이제부터 Git 에 대해 알아보자.
1. 분산 버전 관리
분산 버전 관리(Distributed revision control, 또는 Distributed Vertion Control Systems(DVCS), 또는 Decentralized Version Control Systems)는 소프트웨어 버전 관리를 위한 시스템이다. 이 시스템은 각 개발자가 중앙 서버에 접속하지 않은 상태에서도 코드 작업을 할 수 있는 것이 특징이다.
기존의 버전 관리 툴은 중앙 집중 방식으로 자신만의 저장소가 없어서 작업 내용을 보관, 보완(Update) 하려면 반드시 사내 서버에 접속을 해야해서 장기 출장이나 노트북에서 작업한 내용에 대해서는 별 다른 버전 부여가 불가능했다.
하지만 Git 같은 분산 버전 관리툴이 나오면서 자신의 하드에 저장소를 만들고 사내 혹은 프로젝트 전체의 저장소에 자신의 작업 내용을 동기화하므로써 추가/보완/수정 등을 수행가능하게 되었다.
2. SVN vs Git
Git 에 대한 사용방법은 Git 사용자 매뉴얼에서 다루고 이 포스트에서는 SVN 과의 비교를 통해 Git 에 대한 개념을 알아보자.
SVN 의 장점은 무엇일까? 중앙 서버에서 실행되는 SVN 은 변경 사항을 데이터 저장소(repository)에 추가한 후 변경 작업이 발생할 때마다 사용자에게 스냅샷을 제공할 수 있으며 이 스냅샷에는 개정 번호(revision)가 있다. 그리고 이 개정 번호는 SVN과 사용자 모두에게 매우 중요한 요소이다. 변경 사항이 차례로 적용되기 때문에 개정 번호를 통해 최신 변경 사항을 확인할 수 있다.
Git 에도 변경 사항 추적이라는 비슷한 목표가 있다. 그러나 중앙 집중식 서버를 사용하지는 않는다. 이 점이 매우 중요한 차이점이다. 즉, SVN 은 중앙 집중식인 반면 Git 는 분산식이다. 따라서 Git 에는 "최신 개정"이 없기 때문에 증가하는 개정 번호를 제공하는 방법도 없다. 물론 고유 개정 ID가 있기는 하지만 SVN 개정 번호처럼 유용하지는 않다.
Git 에서 중요한 작업은 더 이상 커밋이 아니다. 여기에서 중요한 작업은 바로 병합이다. 누구나 저장소를 복제한 후 복제본에 대해 커밋을 수행할 수 있다. 그리고 저장소의 소유자는 병합된 변경 사항을 되돌릴 수 있다. 또는 개발자가 변경 사항을 저장소에 다시 push 할 수 있다.
3. 간단한 사용법
원문 : http://git.or.cz/gitwiki/QuickStart
Git 프로젝트 설정하기.
기존 프로젝트를 가져와서 작업을 하고자 한다면 그 프로젝트를 복제(Clone)를 해보자.
$ git clone <url> |
만약 당신이 아무것도 없이 초기 상태로 프로젝트를 진행하는것이라면 Git 로 프로젝트를 하나 만들어 보자.
$ cd project/ $ git init # 저장소(repository) 생성. $ git add . # 특정 파일을 프로젝트에 추가. $ git commit # 로컬 저장소에 자신의 작업 변경 내역을 전부 반영(Commit) [동시에 changlog 에 등록이 됨] $ git rm --cached <file>... # complicated command to undo, in case you forgot .gitignore |
Git은 저장소(Repository)의 루트(Root)에 위치한 .gitignore 라는 이름의 파일 안에 있는 쉘 패턴을 참고해서 무시(ignore) 해야 될 파일 패스들을 무시하고 있다. (ex> bin 폴더 등)
브랜칭(Branching) 과 병합(merging)
$ git checkout -b linux-work # 프로젝트 "linux-work" 라는 이름의 새로운 줄기(Branch)를 만든다. $ <make changes> $ git commit -a $ git checkout master # 작업중인 줄기(Branch)의 뿌리(master)로 돌아간다. $ git merge linux-work # 바뀌어진 것들(change set)을 병합(merge)한다. (Git 버젼 1.5 이상) $ git pull . linux-work # 바뀌어진 것들(change set)을 병합(merge)한다. (Git 모든 버젼에서 가능) |
저장소에 패치된 파일을 자신의 컴퓨터에 적용하기
$ git apply < ../p/foo.patch $ git commit -a |
자신의 컴퓨터에 변경된 패치 사항을 원격 저장소에 집어 넣기 (Export)
$ <make changes> $ git commit -a -m "commit message" $ git format-patch HEAD^ # 001-commit-message.txt 파일을 생성. # 명령어중 헤드가 뜻하는 바는 # 모든 패치 작업이 HEAD 라는 이름으로 지정이 되어 있는 줄기의 시작점을 # 기준으로 삼아서 패치 작업이 수행되게 된다. |
네트워크 에서의 Git
# 1차 Git 저장소에서 복제(Clone) 시작. $ git clone git://git.kernel.org/pub/scm/git/git.git $ cd git |
# SSH 프로토콜을 이용해서 원격 저장소(Repository)에 변경된 내용을 밀어(push) 넣기. $ git push user@example.com:my-repository.git/ |
# 원격 저장소의 변경된 내용을 현재 저장소로 가져오기. $ git fetch user@example.com:my-repository.git/ remote-branch:local-branch |
# 원격 컴퓨터로부터 변화된 내용들을 병합하기 bar$ git pull git://foo/repo.git/ branch |
# git 프로토콜을 통해서 저장소 제공하기. $ cd /my/repository/ $ touch .git/git-daemon-export-ok $ git daemon # 자 이제부터 git://너의.컴퓨터/내/저장소/.git 로부터 "느긋하게 가져가라구." |
# Set up a bare (= without working directory) repository (e.g. on a webserver) $ mkdir my-repo.git $ cd my-repo.git $ git --bare init $ chmod a+x hooks/post-update # this is needed for HTTP transport # you need to populate this repository via push |
수정된 내역들을 다시 살펴보기
# 작업내역들을 시각적으로 살펴보기 $ gitk # 이 명령은 Tk 윈도우를 엽니다. 작업 수정본들의 내역들이 존재하는지를 보여주게 됩니다. |
# 수정 내역을 확인합니다. $ git log # this pipes a log of the current branch into your PAGER $ git log -p # ditto, but append a patch after each commit message |
# 정확히 명시된 내용으로 제출(Commit)된 내용들 살펴보기(inspect) $ git show HEAD # 작업 제출 내역에 대한 정보를 보여주기, # 현재 작업하고 있는 줄기의 시작점을 기준 삼아서 # diffstat과 패치 내역을 보여주기. |
수정본을 분석(refer) 합니다.
# 이름을 이용해서 $ git log v1.0.0 # 1.0.0 이란 이름의 테그(Tag)를 보여줍니다. $ git log master # "master" 란 이름의 줄기의 작업 기록 내역을 보여줍니다.
# 이름을 기준으로 이름과 관련된 사항들을 이용해서.
$ git show master^ # master 의 마직막 수정본(revision) 줄기의 바로 윗 단계를 # 보여준다. (수정 요망.) - # show parent to last revision of master $ git show master~2 # master의 뿌리 근본의 2단계 위의 줄기를 보여준다. # show grand parent to tip of master $ git show master~3 # master의 뿌리 근본의 3단계 위의 줄기를 보여준다. # show great grand parent to tip of master (you get the idea)
# git의 describe 명령의 출려내용에 의해서. by output of "git describe" $ git show v1.4.4-g730996f # you get this string by calling "git describe"
# 해쉬에 의한 분류 ( 작업자에게는 보여지지 않는 않게 Git 에서 만들어지는 # 모든 오브젝트에는 해쉬라는 이름의 주민등록 번호를 부여하게 됩니다.) $ git show f665776185ad074b236c00751d666da7d1977dbe $ git show f665776 # 보기 드문 형태의 머릿 글자 7 자를 이용한 검색 결과를 보여주게 됩니다.
# 수정본에 테그 붙이기
$ git tag v1.0.0 # 현재 작업중인 HEAD 줄기에 "v1.0.0" 이라는 이름의 테그를 달기. $ git tag interesting v1.4.4-g730996f # 줄기 이름 "interesting"에 "v1.4.4-g730996f" 란 이름이 테그를 달기. |
수정본이 수정된 내역을 비교 분석
# 두 수정본 줄기(Branch)에 diff을 이용해서 다른점을 파악 $ git diff origin..master # pipes a diff into PAGER $ git diff origin..master > my.patch # pipes a diff into my.patch |
# 제출(Commit)이 되지 않았던 것들을 diffstat 을 사용해서 조회. $ git diff --stat HEAD |
내가 원하는 패치만 골라담기
Cherry picking patches
남형님의 GIT 한글 메뉴얼에서 일부 인용 : SCM 용어에서 “체리피킹”이라는 말은 일련의 변경 사항 (일반적으로 커밋) 중에서 일부를 선택하여 별도의 코드 베이스 상에 새로운 일련의 변경 사항으로 기록한다는 것을 뜻한다. GIT에서 이것은 “git cherry-pick” 명령을 통해 수행하며 기존의 커밋에서 변경한 내용들 중 일부를 추출하여 현재 브랜치의 팁에 새로운 커밋으로 기록한다. |
# 다른 줄기의 4 번째 마지막으로 제출된 패치를 현재 작업하고 있는 줄기에 적용. $ git cherry-pick other-branch~3 |
외부 링크
http://emacs.kldp.net/wiki/doku.php?id=tool_chain:git
§ 일반적인 사이트들
§ Git 의 문서들이 쌓이고 있는 Git Wiki
§ git를 이용해서 웹에서 저장소를 제공한는 서비스를 하고 있는 Git Hub
§ 유용한 글들
§ Namhyung님의 Git 사용자 설명서
SubVersion 사용자를 위한
Git 설명서
§ CVS에서 Git로의 전환 이란 글.
§ git 와 관련된 도구들
§ GitTrac
§ 윈도우용
§ TortoiseSVN과 비슷한 TortoiseGit
'Major Field > GNU Environment' 카테고리의 다른 글
Ubuntu Linux 에 APM(Apache, PHP, MySQL) 설치 (2) | 2012.01.17 |
---|---|
Ubuntu Linux 와의 만남 ( 우분투 설치 후 기본 설정 ) (0) | 2012.01.17 |
Ubuntu Linux 설치 (0) | 2012.01.17 |
VirtualBox 에 Ubuntu 를 설치하자 (0) | 2010.04.01 |
Ubuntu Image Download (0) | 2010.04.01 |
Git 사용자 설명서 (0) | 2010.03.03 |
Windows 에 Git 을 설치하자 (0) | 2010.03.02 |
GDB, GVIM 설치하기 (0) | 2010.02.26 |
MinGW & MSYS 다운로드/설치/환경설정 (0) | 2010.02.24 |
MinGW? MSYS? Cygwin? (0) | 2010.02.21 |