본문 바로가기

Major Field/GNU Environment

Git 의 사용방법

반응형




 



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 이용해서 웹에서 저장소를 제공한는 서비스를 하고 있는 Git Hub

§  유용한 글들

§  Namhyung님의 Git 사용자 설명서
SubVersion 용자를 위한 Git 설명서

§  CVS에서 Git로의 전환 이란 .

§  git 관련된 도구들

§  GitTrac

§  윈도우용

§  윈도우용 msysGit

§  TortoiseSVN 비슷한 TortoiseGit

 

반응형