본문 바로가기

책/프로 Git

Git의 기초

Git 저장소 만들기

기존 디렉터리를 Git 저장소로 만들기

이 명령은 저장소가 필요한 뼈대 파일이 있는 .git 디렉터리를 만든다. 

$ git init

 

Git이 파일을 관리하게 하려면 저장소에 파일을 추가하고 커밋해야한다. 

$ git add *.c
$ git add README
$ git commit -m 'initial project version'

기존 저장소를 Clone하기

서브버젼에서는 checkout 이라는 명령어를 쓰지만 Git에서는 clone 이라는 명령어를 사용한다.

  • Git은 서브버젼과 다르게 서버의 프로젝트 히스토리 데이터를 전부 복사해 온다.
  • 이는 서버에서 디스크가 망가져도 클라이언트에서 복구할 수 있다는 장점이 된다. 

Ruby 용 Git 라이브러리인 grit을 Clone 하는 예이다.

  • grit 이라는 디렉터리를 만들고 그 안에 .git 디렉터리를 만든다.
  • 저장소의 데이터를 모두 가져와 자동으로 가장 최신 버젼을 Checkout해 놓는다.
$ git clone git://github.com/schacon/grit.git

 

아래는 grit 이라는 디렉터리 말고 mygrit 디렉터리를 생성하여 Clone 하는 예이다. 

$ git clone git://github.com/schacon/grit.git mygrit

 

수정하고 저장소에 저장하기

Working 디렉터리

  • Tracked(관리대상) 파일 :  스냅샷에 포함되 있던 파일
    • Unmodified : 수정하지 않음
    • Modified : 수정함
    • Staged : 커밋하면 저장소에 기록됨
  • Untracked(비관리대상) 파일 : 나머지 파일
    • 워킹 디렉터리에 있는 모든 파일이 스냅샷에 포함돼 있는 것도 아니고 Staging Area에 있는 것도 아니다. 

 

 

파일의 상태 확인하기

초기 상태를 확인한다.

$ git status
# On branch master
nothing to commit (working directory clean)

 

README 는 파일을 생성하고 상태를 확인한다.

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

파일을 새로 추적하기

git add README 명령을 실행하고 상태를 확인한다.

  • Tracked 상태이면서 Staged 상태 이다.
$ git add README
$ git status
# On branch master
# Changes to be commtted:
#    (use "git reset HEAD <file>..." to unstage)
#
#    new file: README
#

Modified 상태의 파일을 State 하기 

benchmars.rb 파일을 수정하고 상태를 확인한다.

$ vim benchmarks.rb
$ git status
# On branch master
# Changes to be commtted:
#    (use "git reset HEAD <file>..." to unstage)
#
#    new file: README
#
# Changed but not updated:
#    (use "git add <file>..." to include in what will be committed)
#
#    modified:  benchmarks.rb
#

 

git add benchmars.rb 명령을 실행하고 상태를 확인한다.

$ git add benchmarks.rb
$ git status
# On branch master
# Changes to be commtted:
#    (use "git reset HEAD <file>..." to unstage)
#
#    new file: README
#    modified:  benchmarks.rb
#

 

위의 상태에서 benchmars.rb 파일을 수정하고 상태를 확인한다.

$ vim benchmarks.rb
$ git status
# On branch master
# Changes to be commtted:
#    (use "git reset HEAD <file>..." to unstage)
#
#    new file: README
#    modified:  benchmarks.rb
#
# Changed but not updated:
#    (use "git add <file>..." to include in what will be committed)
#
#    modified:  benchmarks.rb
#

 

다시 git add benchmars.rb 명령을 실행하고 상태를 확인한다.

$ git add benchmarks.rb
$ git status
# On branch master
# Changes to be commtted:
#    (use "git reset HEAD <file>..." to unstage)
#
#    new file: README
#    modified:  benchmarks.rb
#

 

파일 무시하기

.gitignore 파일 

  • 로그파일이나 빌드 시스템이 자동으로 생성한 파일은 Untracted 파일이라고 보여줄 필요가 없을 때 사용한다.
  • 입력패턴
    • 아무것도 없는 줄이나. #로 시작하는 줄은 무시한다.
    • 표준 Glob 패턴을 사용한다.
    • 디렉터리는 슬레시(/)를 끝에 사용하는 것으로 표현한다.
    • 느낌표(!)로 시작하는 패턴의 파일을 무시하지 않는다.
$ cat .gitignore
*.[oa]      # 확장자가 .o 나 .a인 파일을 무시

*~          # ~로 끝나는 모든 파일 무시

*.a         # 확장자가 .a인 파일 무시

!lib.a      # 윗줄에서 확장자가 .a인 파일은 무시했지만 lib.a는 무시하지 않음

/TODO       # 루트 디렉터리에 있는 TODO파일은 무시하고
            # subdir/TODO처럼 하위 디렉터리에 있는 파일은 무시한다.
            
build/      # build/ 디렉터리에 있는 파일은 무시하지 않는다.

doc/*.txt   # doc/notes.txt같은 파일은 무시하고 
            # doc/server/arch.txt같은 파일은 무시하지 않는다.

Staged와 Unstaged 상태의 변경 내용을 보기

다음을 수행하고 상태를 확인한다.

  1. README 파일 수정
  2. git add README 명령실행
  3. benchmarks.rb 파일 수정
$ vim README
$ git add README
$ vim benchmarks.rb
$ git status
# On branch master
# Changes to be commtted:
#    (use "git reset HEAD <file>..." to unstage)
#
#    new file: README
#
# Changed but not updated:
#    (use "git add <file>..." to include in what will be committed)
#
#    modified:  benchmarks.rb
#

 

git diff

  • 수정했지만 아직 staged 상태가 아닌 파일을 비교
  • Working 디렉터리에 있는 것과 Staging Area에 있는 것을 비교
  • Unstaged 상태인 것들만 보여줌
    • 마지막으로 커밋한 후에 수정한 것을 보여주지 않음
    • 수정한 파일을 모두 Staging Area에 넣었다면 아무것도 출력하지 않음
$ git diff
diff --git a/benchmarks.rb b/benchmarks.rb
index 3cb747f..da65585 100644
--- a/benchmarks.rb
+++ b/benchmarks.rb
@@ -36,6 +36,10 @@ def main
           @commmit.parents[0].parents[0].parents[0]
         end

+        run_code(x, 'commits 1') do
+          git.commits.size
+        end
+
         run_code(x, 'commits 1') do
           log = git.commits('master', 15)
           log.size

 

git diff --cached ( git diff --staged )

  • 저장소에 커밋한 것과 Staging Area에 있는 것을 비교
$ git diff --cached
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README2
@@ -0,0 +1,5 @@
+grit
+ by Tom Preston-Werner, Chris Wanstrath
+ http://github.com/mojombo/grit
+
+Grit is a Ruby library for extracting infomation from a Git repository

 

benchmarks.rb 파일을 Stage한 후에 다시 수정해도 git diff 명령을 사용할 수 있다.

$ git add benchmarks.rb
$ echo '# test line' >> benchmarks.rb
$ git status
# On branch master
# Changes to be commtted:
#
#    modified:  benchmarks.rb
#
# Changed but not updated:
#
#    modified:  benchmarks.rb
#

 

git diff : Working 디렉터리에 있는 것과 Staging Area에 있는 것을 비교

$ git diff
diff --git a/benchmarks.rb b/benchmarks.rb
index e445e28..86b2f7c 100644
--- a/benchmarks.rb
+++ b/benchmarks.rb
@@ -127,3 +127,4 @@ end
 main()
  
 ##pp Grit::GitRuby.cache_client.stats
+# test line

 

git diff --cached : 저장소에 커밋한 것과 Staging Area에 있는 것을 비교

$ git diff
diff --git a/benchmarks.rb b/benchmarks.rb
index 3cb747f..da65585 100644
--- a/benchmarks.rb
+++ b/benchmarks.rb
@@ -36,6 +36,10 @@ def main
           @commmit.parents[0].parents[0].parents[0]
         end

+        run_code(x, 'commits 1') do
+          git.commits.size
+        end
+
         run_code(x, 'commits 1') do
           log = git.commits('master', 15)
           log.size

 

변경사항 커밋하기

git status 명령으로 모든 것이 Stated 상태인지 확인할 수 있다. 그리고 커밋한다.

  • 이 명령을 실행하면 무조건 저장된 편집기가 실행되어 commit 메시지를 작성하도록 한다.
  • 편집기는 $EDITOR 환경변수 등록된 편집기가 실행된다. 보통 Vim 이나 Emacs가 기본이다.
  • git config --global core.editor 명령으로 편집기를 변경할 수 있다.
$ git commit

 

-v 옵션: 편집기에 diff 메시지도 추가된다.

$ git commit -v

 

-m 옵션: 편집기 실행 없이 실행과 동시에 메시지를 작성한다.

  • master 브랜치에  커밋했고 체크섬은 463dc4f이다.
  • 수정한 파일은 2개 이고, 추가된 줄은 3줄, 삭제된 줄은 0줄이다.
$ git commit -m 'Story 182: Fix benchmarks for speed'
[master]: created 463dc4f: "Fix benchmarks for speed"
2 files changed, 3 insertions(+), 0 deletions(-)

Staging Area 생략하기

-a 옵션 : git add 명령의 수행없이 Untracted 상태의 파일을 자동으로 Staging Area에 넣는다.

  • 이 예제에서는 커밋하기 전에 git add benchmarks.rb 명령 실행없이 커밋하여 Untracked 상태의 benchmarks.rb 파일을 커밋 하였다.
$ git status
# On branch master
# Changed but not updated:
#
#    modified:  benchmarks.rb
#

$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks
1 files changed, 5 insertions(+), 0 deletions(-)

파일을 삭제하기

Git 에서 파일을 제거하려면 git rm 명령으로 Tracked상태의 파일을 삭제( Staging Area 에서 삭제) 한 후에 커밋해야 한다. 이 명령은 워킹 디렉터리에 있는 파일도 삭제하기 때문에 실제로 지워진다.

 

파일을 그냥 삭제하고 상태를 확인하면 Unstaged상태가 된다.

 

$ rm grit.gemspec
$ git status
# On branch master
#
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be commited)
#       
#       deleted:    grit.gemspec
#

 

이 상태에서 git rm 명령을 실행하면 삭제한 파일은 Staged 상태가 된다.

$ git rm grit.gemspec
rm 'grit.gemspec'
$ git status
# On branch master
#
# Changed to be committed:
#   (use "git reset HEAD <file>..." to unstaged)
#       
#       deleted:    grit.gemspec
#

 

커밋하면 파일은 삭제되고 Git은 이 파일을 더는 추적하지 않는다. 

 

이미 파일을 수정했거나 Staging Arear( Index )에 추가했다면 -f 옵션을 주어 강제로 삭제해야 한다. 이 점은 실수로 데이터를 삭제하지 못하도록 하는 안전장치이다. 

 

한 번도 커밋한 적 없는 데이터는 Git으로 복구할 수 없다.

 

--cached 옵션: Stagin Area에서만 제거하고 Working 디렉터리에 있는 파일은 지우지 않고 남겨둘수 있다.

  • .gitignore 파일에 추가하는 것을 빼먹었을 경우
  • 대용량 로그파일이나 컴파일된 파일이 추가됬을 경우
$ git rm --cached readme.txt

 

file-glob 패턴으로 여러파일이나 디렉터리를 삭제할 수 있다.

  • * 앞에 \을 사용한 이유는 파일명 확장기능이 셸에만 있는 것이 아니라 Git 자체에도 있기 때문이다.
$ git rm log/\*.log   # log 디렉터리에 있는 .log 파일을 모두 삭제한다.


$ git rm \*~          # ~로 끝나는 파일을 모두 삭제한다.

 

파일 이름 변경하기

$ git mv README.txt README
$ git status
# On branch master
# Your brach is ahead of 'origin/master' by 1 commit.
#
# Changed to be committed:
#   (use "git reset HEAD <file>..." to unstaged)
#       
#       renamed:    README.txt -> README
#

 

위의 명령은 다음 명령과 같다.

$ mv README.txt README
$ git rm README.txt
$ git add README

커밋 히스토리 조회하기

더 많은 옵션은 다음을 참조한다. ( https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%EC%BB%A4%EB%B0%8B-%ED%9E%88%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0 )

명령어 설명
git log 저장소의 커밋 히스토리를 가장 최근 것부터 시간순으로 보여준다. 

SHA-1 체크섬, 저자 이름, 저자 이메일, 커밋한 날짜, 커밋 메시지
git log -p -2 -p : 각 커밋의 diff 결과를 보여준다.

-2 : 최근 두 개의 결과만 보여준다.
git log --stat 커밋의 통계 정보를 보여준다.

얼마나 많은 파일이 변경됬는지, 얼마나 많은 줄을 추가하거나 삭제했는지 보여준다.
요약정보는 가장 뒷쪽에 보여준다.
git log --pretty=oneline 각 커밋을 한줄로 보여준다. 

short, full, fuller 등이 더 있다.
git log --pretty=format:"%h - %an, %ar : %s" 요약된커밋해시 - 저자명, 저자의커밋일자 : 커밋메시지

예) a11bef0 - Scott Chacon, 11 months ago : first commit
git log --pretty=format:"%h %s" --graph 브랜치와 머지 히스토리를 보여주는 아스키 그래프를 출력한다. 
git log --since=2.weeks 지난 2주 동안 만들어진 커밋들만 조회
git log --pretty="%h - %s"
--author=gitster
--since="2008-10-01"
--before="2008-11-01"
--no-merges -- t/
2008년 10월 Junio Hamano가 커밋한 히스토리를 조회. 그중 테스트 파일을 수정한 커밋 중에서 머지 커밋이 아닌 것들만 조회

GUI 도구로 히스토리를 시각화하기

gitk 는 Tcl/Tk 프로그램이고 git log 명령을 시각화해주는 도구다. gitk는 git log 명령이 지원하는 필터링 옵션을 모두 지원한다.

되돌리기

한 번 되돌리면 복구 할 수 없다. 

커밋 수정 하기

종종 완료한 커밋을 수정해야 할 때 사용한다.

  • 커밋을 했는데 Stage하는 것을 깜빡하고 빠트린 파일이 있으면 다음과 같이 고칠 수 있다.
  • 여기서 실행한 명력어 3개는 모두 하나의 커밋으로 기록된다. 두번째 커밋은 첫 번째 커밋을 덮어쓴다.
$ git commit -m 'initial commit'
git add forgotten_file
$ git commit --amend

파일 상태를 Unstage로 변경하기

우선 파일들을 Stage 상태로 변경해보자.

$ git add .
$ git status
# On branch master
# Changes to be commtted:
#    (use "git reset HEAD <file>..." to unstage)
#
#    modified:  README.txt
#    modified:  benchmarks.rb
#

 

git reset HEAD <file>... : Unstage 상태로 변경할 수 있는 명령어이다.

$ git reset HEAD benchmarks.rb
benchmarks.rb: locally modified
$ git status
# On branch master
# Changes to be commtted:
#    (use "git reset HEAD <file>..." to unstage)
#
#    modified:  README.txt
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be comitted)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    modified:  benchmarks.rb
#

Modified 파일 되돌리기

git checkout -- <file>...

  • 수정 이전의 파일로 덮어쓰므로 수정했던 내용은 전부 사라진다.(복원이 안된다)
  • 정말 이렇게 삭제해야한다면 Stash와 Branch 사용을 권장한다.
    • 커밋한 것은 언제나 복구 가능 (--amend 옵션으로 커밋한 것도 복구 가능)
$ git checkout -- benchmarks.rb
$ git status
# On branch master
# Changes to be commtted:
#    (use "git reset HEAD <file>..." to unstage)
#
#    modified:  README.txt
#

리모트 저장소

리모트 저장소 확인하기

저장소를 Clone하면 origin이라는 리모트 저장소가 자동으로 등록되기 때문에 origin이라는 이름을 볼 수 있다.

$ git remote
origin

 

-v 옵션 : 단축이름과 URL을 함께 볼수 있다.

$ git remote -v
origin git://github.com/schaon/ticgit.git (fetch)
origin git://github.com/schaon/ticgit.git (push)



# 리모트 저장소가 여러개 있다면 전부 보여준다.
#   이렇게 여러개가 등록되어 있으면 다른 사람이 기여한 내용을 쉽게 가져올 수 있다.
#   origin만 SSH URL이기 때문에 orgin만 Push할 수 있다.
$ git remote -v
bakkdoor git://github.com/bakkdoor/grit.git
cho45 git://github.com/cho45/grit.git
defunkt git://github.com/defunkt/grit.git
koke git://github.com/koke/grit.git
origin git@github.com:mojombo/grit.git

리모트 저장소 추가하기

git remote add [단축이름] [URL]

$ git remote
origin
$ git remote add pb git://github.com/paulboone/ticgit.git
$ git remote -v
origin git://github.com/chacon/ticgit.git
pb git://github.com/paulboone/ticgit.git

리모트 저장소를 Pull 하거나 Fetch 하기

git fetch [단축이름] : 로컬에는 없지만, 리모트 저장소에 있는 데이터를 모두 가져온다. 

  • 리모트 저장소의 데이터를 모두 로컬로 가져오지만 자동으로 머지하지 않는다.
  • git pull 명령으로 git fetch || git merge 를 한번에 수행할 수 있다.
$ git remote
origin
$ git remote add pb git://github.com/paulboone/ticgit.git
$ git remote -v
origin git://github.com/chacon/ticgit.git
pb git://github.com/paulboone/ticgit.git

리모트 저장소에 Push하기

git push [리모트 저장소 이름] [브랜치 이름]

  • master 브랜치를 orgin 서버에 Push 하려면 아래와 같은 명령어를 사용한다.
  • Clone한 리모트 저장소에 쓰기 권한이 있어야한다
  • Clone한 사람이 여러 영일 경우, 다른 사람이 Push 한 후에는 Push 할 수없다.
    • 먼저 서버의 데이터를 fetch, merge 한 후 Push할 수 있다.
$ git push origin master

리모트 저장소 살펴보기

git remote show [리모트 저장소 이름]

$ git remote show origin
* remote origin
  URL : git://github.com/schacon/ticgit.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branches
    master
    ticgit

 

좀 더 많이 사용하게 되면 좀 더 많은 정보를 볼 수 있을 것이다. 

  • 브랜치명을 생략하고 git push 명령을 실행할 때 어떤 브랜치가 어떤 브랜치로 Push되는지 보여준다.
  • 다음 어떤 브랜치들이 있는지 특징별로 보여준다.
    • 아직 로컬로 가져오지 않은 리모트 저장소의 브랜치
    • 서버에서는 삭제됐지만 아직 가지고 있는 브랜치
    • git pull 명령을 실행 했을때 자동으로 머지할 브랜치
$ git remote show origin
* remote origin
  URL : git@github.com:defunkt/github.git
  Remote branch merged with 'git pull' while on branch issues
    issues
  Remote branch merged with 'git pull' while on branch master
    master
  New remote branchs (next fetch will store in remotes/origin)
    caching
  Stale tracking branches (use 'git remote prune')
    libwalker
    walker2
  Tracked remote branches
    acl
    apiv2
    dashboard2
    issues
    master
    postgres
  Local branch pushed with 'git push'
    master:master

리모트 저장소 이름을 바꾸거나 리모트 저장소를 삭제하기

브랜치 이름 변경하기

  • 리모트 저장소의 브랜치 이름도 바뀐다.
    • pb/master리모트 브랜치 --> paul/master 라고 사용해야 한다.
$ git remote rename pb paul
$ git remote
orgin
paul

 

브랜치 삭제

  • 다음과 같을 때 사용한다.
    • 서버 정보가 바뀌었을 때
    • 더는 별도의 미러가 필요하지 않을 때
    • 기여자가 활동하지 않을 때
$ git remote rm paul
$ git remote
orgin

태그

태그 조회하기

$ git tag
v0.1
v1.3


# 1.4.2 버젼의 태그들만 검색하고 싶을때
$ git tag -l 'v1.4.2.*'
v1.4.2.1
v1.4.2.2
v1.4.2.3
v1.4.2.4

태그 붙이기

Annotated 태그

특정 커밋에 대한 포인터인데 여기에 더해서 다음을 저장한다.

  • Git 데이터베이스에 만든 사람의 이름
  • 이메일과 태그를 만든 날짜
  • 태그의 메시지
  • GPG(GNU Privacy Guard) 서명

-a 옵션 : Anotation을 만드는 방법이다.

  • -m 옵션 : 태그 저장 시 메시지를 함께 저장할 수 있다.
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4


# git show 명령으로 태그 정보와 커밋정보를 모두 확인할 수 있다.
#  커밋 정보를 보여주기전에 다음을 보여준다.
#    태그를 만든사람
#    태그를 만든일시
#    태그 메시지
$ git show v1.4
tag v1.4
Tagger: Scott Chacon <schacon@gee-mail.com>
Date: Mon Feb 9 12:45:11 2009 -0800

my version
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sun Feb 8 19:02:46 2009 -0800

    Merge branch 'experiment'

태그에 서명하기

-s 옵션 : GPG 개인키가 있으면 태그에 서명할 수 있다. -a 옵션 대신 사용한다.

$ git tag -s v1.5 -m 'my signed 1.5 tag'
You need a passphrase to unlock the secret key for
user: "Scott Chacon <schacon@gee-mail.com>"
1024-bit DSA key, ID F721C45A, created 2009-02-09


# git show 명령 GPG 서명도 볼 수 있다.
$ git show v1.5
tag v1.5
Tagger: Scott Chacon <schacon@gee-mail.com>
Date: Mon Feb 9 15:22:20 2009 -0800

my signed 1.5 tag
----BEGIN PGP SINATURE----
Version: GnuPG v1.4.8 (Darwin)

iEYE....
=WryJ
----END PGP SINATURE----
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sun Feb 8 19:02:46 2009 -0800

    Merge branch 'experiment'

Lightweight 태그

브랜치와 비슷하지만 브랜치처럼 가리키는 지점을 최신 커밋으로 이동시키지 않는다. 단순히 특정 커밋에 대한 포인터일 뿐이다. 

 

기본적으로 파일에 커밋 체크섬을 저장하는 것 뿐이다. 

  • -a, -m, -s 옵션을 사용하지 않는다.
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5


# git show 명령으로 별도의 태그 정보는 확인할 수 없다.
$ git show v1.4-lw
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sun Feb 8 19:02:46 2009 -0800

    Merge branch 'experiment'

태그 검증하기

git tag -v [태그 이름] : GPG를 사용하여 서명을 검증한다.

$ git tag -v v1.4.2.1
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
type commit
tag v1.4.2.1
tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700

GIT 1.4.2.1

Minor fixes since 1.4.2, including git-mv and git-hjttp with alternates.
gpg: Signature made Web Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
gpg:                 aka "[jpeg image of size 1513]"
Primary key fingerprint 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A

 

만약 서명자의 공개키가 없으면 다음과 같은 메시지를 출력한다. 

Minor fixes since 1.4.2, including git-mv and git-hjttp with alternates.
gpg: Signature made Web Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'

나중에 태그하기

'updated rakefile' 커밋을 v1.2.로 태그하지 못했다고 해도 차후에 태그를 붙일 수 있다. 

  • 특정 커밋에 태그하기 위해서 명령의 끝에 체크섬을 명시한다.
$ git log --pretty=online
....
9fce02d0ae598e95dc970b74767f19372d61af8 updated rakefile
....

# 긴 체크섬을 전부 사용할 필요는 없다.
$git tag -a v1.2 9fceb02

$git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5

$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date: Mon Feb 9 15:32:16 2009 -0800

version 1.2
commit 9fce02d0ae598e95dc970b74767f19372d61af8
Author Magnus Chacon <mschacon@gee-mail.com>
Date: Sun Apr 27 20:43:35 2008 -0700

    updated rakefile
...

태그 공유하기

git push origin [태그 이름] : 태그를 만들었으면 서버에 별도로 Push해야한다

$ git push origin v1.5
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

 

--tags 옵션 :  리모트 서버에 없는 태그를 모두 전송할 수 있다.

  • 누군가 저장소에서 Clone하거나 Pull하면 모든 태그 정보도 함께 전송된다.
$ git push origin --tags
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
To git@github.com:schacon/simplegit.git
 * [new tag]         v0.1 -> v0.1
 * [new tag]         v1.2 -> v1.2
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw
 * [new tag]         v1.5 -> v1.5

팁과 트릭

자동완성

Bash 셸 사용 시 특정 사용자에게 자동완성 기능을 넣을 때

  1. Git의 소스코드를 다운받아 contrib/completion/git-completion.bash 파일을 홈 디렉터리에 카피한다.
  2. .bash 파일에 source ~/.git-completion.bash 의 내용을 추가한다.

모든 사용자에게 자동완성 기능을 설정할때

  • Mac
    • /opt/local/etc/bash_completion.d/ 에 git-completion.bash 파일 복사
  • Linux
    • /etc/bash_completion.d/ 에 git-completion.bash 파일 복사
  • 윈도우
    • msysGit을 설치해서 Git Bash를 사용하는 경우 미리 설정되어 있다. 

Git이 제안하는 명령어가 출력된다.

$ git co<tab><tab>
commit   config

 

옵션도 제안한다.

$ git log --s<tab>
--shortstat                --src-prefix=
--show-signature           --stat
--simplify-by-decoration   --submodule
--simplify-merges          --submodule=
--since=                   --summary
--sparse

Git Alias

Alias를 만드는 예제

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

 

Alias를 설정하고 사용하는 예제

$ git config --global alias.unstage 'reset HEAD --'

# 두 명령은 동일한 명령이다.
$ git unstage fileA
$ git reset HEAD fileA

 

last 알리아스 예제

$ git config --global alias.last 'log -1 HEAD'


$ git last
commit 6693....4646
Author: Josh... <...@example.com>
Date: ...

    test for current head
    
    Signed-off-by: Scott Chacon <schacon@example.com>

 

! : 외부명령 실행

$ git config --global alias.visual '!gitk'

$ git visual