GitQuickStart

Clunix Wiki
Choakira (토론 | 기여) 사용자의 2014년 3월 3일 (월) 10:29 버전

목차

서론

연구소에서 git를 이용한 소스 코드 관리를 추진하고자 한다. git는 기능도 막강하고 무엇보다 분산 Version Control이 가능하여 개인별로 자유로운 버전 관리와 offline 모드 지원이 막강하다.

  • 연구소 공식 git 서버주소는 git (git.rnd.clunix.com, 192.168.12.11)이다.
  • git을 테스트할 수 있는 repository 주소는 git@git:testing

git 설치 및 설정

Linux 환경

Linux 환경에서는 기본적으로 git 프로그램이 설치되어 있다. 만약 설치되어 있지 않다면 Ubuntu 의 경우 다음 패키지를 설치한다.

$ sudo apt-get install git

git을 이용한 commit시 사용되는 기본적인 설정 정보인 사용자 이름과 이메일, commit log 메시지를 작성하는 editor를 등록한다. 설정한 정보는 사용자 홈의 .gitconfig 파일에 기록된다.

$ git config --global user.name "KyungWoon Cho"
$ git config --global user.email "cezanne@clunix.com"
$ git config --global core.editor vi

git repository 접근 하기 위해서는, 자신의 public key를 gitolite에 등록해야 한다. ssh public key를 만드는 방법은 SSH 사용법 안내 페이지를 참고 (현재 gitolite를 등록할 수 있는 사람은 cezanne임, 문의 필요)

SSH config 설정

보통 ssh client 설정에서 X11 forward는 하지 않도록 다음과 같이 설정한다.

Host git 192.168.12.11
        ForwardX11 no

Windows 환경

  • msysgit(Git for windows) 설치, http://code.google.com/p/msysgit/
    • 설치시 행종결자 처리에 대한 옵션을 설정하는데, 3번째 옵션인 변환을 하지 않는 것이 바람직
  • TortoiseGit 설치
  • Putty용 private key 파일인 ppk 파일 생성. 생성 과정은 PPKGen을 참조
  • Git clone시에 생성한 ppk 파일을 지정하여 git clone

Gitppk.png

test 환경


git help

  • git 명령 목록은 단순히 git을 입력 하면된다.
  • git 명령 --help 를 하면 manual page 화면이 수행된다.

git clone

  • git clone 명령은 svn checkout과 유사한 명령이다.
  • 원격 git repository로 부터 로컬에 저장소를 만든다.
$ git clone git@git:testing testing
  • git(192.168.12.11) 서버로 부터 testing repository를 로컬상의 testing 폴더를 작업 폴더로 만든다.
    • svn과 달리 git사용자임을 유의해야 한다. 사용자 식별은 gitolite에 등록된 public key로 구분한다.
    • repository 전체 경로가 아닌 repository명만 써야 한다.(git 권한 툴인 gitolite 특성)
    • git은 SVN과 달리 repository에 있는 전체 저장소를 가져온다.
    • repository의 하위 폴더 일부를 가져오는 방법은 없다. 대신 submodule 기능을 통하여 하위 repository를 만들수 있다.

git add

  • git은 repository에 commit을 하기전 저장공간인 staging area를 둔다.
  • 신규 생성된 파일이나 기존에 존재하던 파일이라도 수정한 내용을 commit하기 위해서는 반드시 add 과정을 거쳐야 한다.
$ git add test.c
  • 추가할 항목은 여러개나 glob 패턴도 가능하다.
$ git add test.c blah*.txt
  • 이미 추가한 항목에 대해서는 별도로 오류를 발생하지 않고, 무시한다.

git status

  • git status 는 현재 작업 폴더의 상태를 나타낸다.
  • svn과 달리 상태 화면이 좀 복잡하다.
$ git status
# On branch master
nothing to commit (working directory clean)

위의 경우는 폴더에 어떠한 파일도 없거나 수정한 것이 없는 경우

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	mytest.c
nothing added to commit but untracked files present (use "git add" to track)

mytest.c가 존재하지만, git으로 관리되지 않는 상태이다.

$ git add mytest.c
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	new file:   mytest.c
#

위의 mytest.c를 staging area에 add한 경우의 status 출력 결과이다.

기존 repository에 있는 파일을 수정한 경우라면 다음과 같은 출력 결과가 표시된다.

# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   test.c
#
no changes added to commit (use "git add" and/or "git commit -a")

위의 경우는 기존에 존재하는 파일인 test.c를 수정한 경우의 status 출력 결과이다.

이 파일을 add하면 다음과 같은 출력결과가 표시된다.

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   test.c
#

git diff

편집한 내용을 확인시에는 git diff를 사용한다.

$ git diff
diff --git a/test.c b/test.c
index 71ce22d..a32214c 100644
--- a/test.c
+++ b/test.c
@@ -1,3 +1,5 @@
+#include <stdio.h>
+
 void
 main()
 {

git diff는 staging area에 포함되지 않은 내용에 대해서만 diff 를 수행한다. 만약 staging area에 있는 내용에 대해서 diff를 원한다면 다음과 같이 수행한다.

git diff --cached

특정 파일의 diff만을 보고자 한다면 해당 파일을 인자로 부여한다.

git commit

commit 과정

git commit은 staging area에 있는 변경 내용을 repository로 commit한다.

$ git commit
[master 1bf0f40] test is just test
 1 file changed, 2 insertions(+)

git commit을 수행하면 commit log를 입력하는 editor가 수행되고, editor를 저장후 종료하면 commit 과정이 완료된다. 아래는 commit 수행시 log 입력 화면예시이다.

this is test
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   test.c
#

'this is test'라는 로그메시지를 입력한 화면이며, 아래쪽 #이 표시된 영역은 단순 설명으로서 commit log에 반영되지 않는다.

  • editor 편집을 취소하면 commit 과정은 자동 취소된다.
  • staging area에 반영된 내용만 commit된다. staging area에 반영되지 않는 편집된 내용은 commit되지 않음을 유의해야 한다.
  • commit도 일부 파일만 가능하며, 인자 없이 수행하면 staging area에 있는 전제 내용이 commit된다.

만약 staging area를 거치지 않고, 변경되거나 삭제된 파일을 일괄적으로 commit하고자 한다면 다음 명령을 수행한다.

$ git commit -a
  • 이 명령은 새로 생성된 파일(untracked file)을 자동으로 commit하지는 않는다.
  • staging area에 있는 변경파일도 동시에 commit된다.
  • 일부 파일만 일괄적으로 적용할 수는 없으며, 전체 변경되거나 삭제된 파일을 대상으로 적용된다.

commit 전 확인 사항

협업시 공백라인이나 공백문자에 의해 변경되는 코드들은 매우 성가신 일이다. commit 전 이러한 부분이 없는지 반드시 아래 명령으로 확인을 하도록 한다.

$ git diff --check

변경사항들은 논리적인 단위로 구분해서 commit을 하도록 한다. 여러개의 이슈가 섞인 형태의 commit은 지양한다. git은 이를 위한 다양한 기능들을 제공한다.

commit 메시지는 해당 작업을 잘 표현할 수 있게끔 작성한다. 첫줄에 35글자 이하로 해당 작업 한줄로 요약한다. (영문의 경우라면 50이하) 좀 더 상세한 메시지는 한줄 공백 후 상세 내용을 작성한다.

좋은 commit 메시지의 예시

Short (50 chars or less) summary of changes
  
More detailed explanatory text, if necessary.  Wrap it to about 72
characters or so.  In some contexts, the first line is treated as the
subject of an email and the rest of the text as the body.  The blank
line separating the summary from the body is critical (unless you omit
the body entirely); tools like rebase can get confused if you run the
two together.

Further paragraphs come after blank lines.

  - Bullet points are okay, too

  - Typically a hyphen or asterisk is used for the bullet, preceded by a
    single space, with blank lines in between, but conventions vary here

git log

commit log를 확인하는 방법은 git log 를 이용한다. git log는 터미널 화면에 맞는 만큼만 출력해서 보여준다.

$ git log

diff를 함께 보고자 하는 경우는 다음과 같이 수행한다. 양이 많은 경우 자동으로 paging 기능을 제공한다.

$ git log -p

최근 몇개만을 보고자 하는 경우는 다음과 같이 수행한다.

$ git log -2

git push

  • git 분산 버전 관리도구이다. commit을 하더라도 원격지 repository에 반영되지 않고, 로컬 repository에 commit이 된 것이다.
  • 로컬 repository에 반영된 commit 내용을 원격지 repository에 반영하기 위해서는 git push 명령을 수행한다.
$ git push
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 298 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@git:testing
   e0ab7f0..1bf0f40  master -> master

작업 내용 되돌리기

마지막 commit한 내용을 수정하고자 한다면 다음과 같이 수행한다.

$ git commit --amend
  • 위 명령은 staging area에 있는 변경된 내용을 마지막 commit에 적용한다.
  • 마지막 commit 내용중 변경되지 않는 부분은 영향을 받지 않는다.
  • 만약 변경된 내용이 없다면 단순히 commit log만을 수정하는 것이다.

staging area에 있는 내용을 다시 되돌리는 경우에는 다음과 같이 명령을 수행한다.

$ git reset HEAD <file>...

수정된 내용을 되돌리는 방법(svn revert와 같은 효과)은 다음과 같다. (마이너스 2번)

$ git checkout -- <file>

파일 삭제 및 이동

파일을 repository상에서 삭제하고자 하는 경우 먼저 파일을 삭제한다.

$ rm test.c
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	deleted:    test.c
#
no changes added to commit (use "git add" and/or "git commit -a")

파일 삭제 후 상태를 확인하면 deleted로 표시되며, 이를 staging area에 반영한다.

$ git rm test.c
rm 'test.c'
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	deleted:    test.c
#

이후 commit을 하면 test.c 삭제가 repository에 반영된다.

만약 디스크상에서 파일을 삭제하지 않고, 단순히 repository에서 파일을 제거하고자 한다면 다음과 같이 수행한다.

$ git rm --cached test.c

파일 삭제 없이 test.c 파일이 삭제되었음을 staging area에 반영한다. 이후 commit시 repository에 반영된다.

이름을 변경하고자 하는 경우에는 다음과 같이 수행한다.

$ git mv test.c test1.c
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	renamed:    test.c -> test1.c
#

git remote

원격 저장소 정보를 열람하는 방법은 아래와 같다.

$ git remote
origin

이것은 단순히 원격 저장소명만을 나열한다. 좀 더 자세한 정보를 보고자 한다면

$ git remote show origin

git pull

원격지의 repository에서 update하는 방법은 다음과 같다.(svn update와 같은 효과)

$ git pull

이 명령은 원격 저장소로 부터 변경된 내용을 로컬 저장소로 업데이트하며, 변경된 내용을 현재의 작업 폴더에 merge한다. 만약 conflict가 발생한다면 아래와 같은 오류 메시지가 나타나며, merge가 되지 않는다.

Updating 1bf0f40..80387cd
error: Your local changes to the following files would be overwritten by merge:
	test.c
Please, commit your changes or stash them before you can merge.
Aborting

만약 merge하지 않고, 원격저장소로 부터 변경분만 로컬저장소에 저장한다면 다음과 같이 수행한다.

git fetch

tagging

git은 tagging 기능을 다양한 방식으로 제공한다.

  • lightweight tag: 간편하게 tagging 하는 방식.
  • annotated tag: tagging에 대한 부가설명을 추가할 수 있는 방식
$ git tag

위 명령은 tag 목록을 열람할 수 있다. 패턴으로 tag 목록을 열람할 수도 있다.

$ git tag -l 'v1.3*'

light-weight tag를 추가하는 방법은 다음과 같다.

$ git tag mytag

annotated tag를 추가하는 방법은 다음과 같다.

$ git tag -a mytag

이 경우는 tagging message를 입력하는 editor가 구동된다. annotated는 tagger와 날짜, log등이 기록된다.

tag 정보는 git push시 자동으로 전달되지 않으며, 다음과 같이 명시적으로 tag 정보를 원격 저장소에 전달하여야 한다.

$ git push origin mytag

branching

branch 관리

현재 branch 목록을 열람하는 방법은 다음과 같다.

$ git branch
* master
   somebr

저장소에는 두개의 branch가 있으며, 현재 master branch에 있음을 나타낸다. (앞의 *가 표시)

branch를 생성하는 방법은 다음과 같다.

$ git branch mybranch

이것은 단순히 branch를 생성한 것으로 현재 작업 폴더가 새로 생성된 branch로 이동하지는 않는다.

이동을 위해서는 git checkout 명령어를 사용한다.

$ git checkout mybranch

branch를 생성함과 동시에 해당 branch로 이동하고자 한다면

$ git checkout -b mybranch

특정 branch를 삭제하고자 한다면

$ git branch -d mybranch

merge

branch 내용을 merge하는 방법은 다음과 같다.

$ git merge mybranch

stashing

git은 현재 진행중인 작업 폴더의 작업 내용을 잠시 저장하고 다른 branch나 혹은 해당 branch에서 임시 작업을 진행할 수 있다.

$ git stash

이 명령은 현재 변경된 파일을 잠시 저장하고, 작업 폴더의 내용은 변경 이전 상태로 돌려 놓는다.

$ git stash list

stashing 목록을 열람한다. stashing 목록에서 진행중이던 작업내용에 대한 설명글은 git가 자동적으로 생성하는데, 만약 특정 설명글을 부여하고 싶다면

$ git stash save 사용자 그룹 기능 구현중
stashing된 요약 내용을 보거나 변경사항을 보려면 
$ git stash show
$ git stash show -p

저장된 작업 내용을 다시 작업 폴더에 적용하려면

$ git stash apply

이 명령은 가장 최근의 stashing을 적용하는 것으로 특정 stashing을 적용하려면 다음과 같이 수행할 수 있다.

$ git stash apply stash@{2}

만약 적용된 stashing을 다시 취소하려고 한다면

$ git stash show -p | git apply -R

적용을 하더라도 stashing은 계속 남아 있으며, 명시적으로 삭제를 해야 한다.

$ git stash drop
부서별 위키