Git 저장소를 만들고 Working Directory, Staging Area, Git Directory를 오가는 명령을 알아보자.
> Git 저장소 만들기
- 프로젝트 디렉토리를 만든다
- 프로젝트 디렉토리로 이동한다
- git init 명령을 수행하면 .git 디렉토리가 생긴다 (git 뼈대)
- 버전관리를 시작할려면 git add -> git commit 을 하여 파일을 저장소에 추가해야 시작된다.
$ mkdir pro_git
$ cd pro_git
$ git init
Initialized empty Git repository in d:/git-repositories/pro_git/.git/
$ ls -alrt
total 4
drwxr-xr-x 13 yuwonsys Administ 4096 Dec 24 11:01 ..
drwxr-xr-x 9 yuwonsys Administ 4096 Dec 24 11:01 .git
drwxr-xr-x 3 yuwonsys Administ 0 Dec 24 11:01 .
$ touch README.md
$ git add README.md
$ git commit -a -m "add readme.md file"
[master (root-commit) 3b7d2a8] add readme.md file
0 files changed
create mode 100644 README.md
> Git 복제
> 파일 수정하고 저장소에 저장하기
- Tracked(관리대상)와 Untracked(비관리대상) 으로 나뉜다. 즉 한번이라도 commit 되면 관리대상이 된다.
- Tracked는 Unmodified(수정하지 않음)와 Modified(수정함) 그리고 Staged(커밋전) 상태 중 하나이다.
- Clone을 하게 되면 모든 파일은 Tracked이면서 Unmodified 상태이다. 또한 자동으로 자동 Checkout도 한다.
untracked <-> unmodified <-> modified <-> staged <-> commited
- git status : 파일 상태의 확인 tracked와 modified 상태파일이 없거나, Untracked 파일이 있는지 보여준다
// tracked이면서 modified 상태 파일이 없음 표시
$ git status
# On branch master
nothing to commit, working directory clean
// Untracked 파일 추가
$ touch aa.txt
// Untracked 파일 목록을 보여줌
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# aa.txt
nothing added to commit but untracked files present (use "git add" to track)
// tracked 파일인 README.md 파일에 내용을 입력함
$ vi README.md
// Tracked 파일과 Untracked 파일 목록을 보여줌
$ git status
# 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: README.md
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# aa.txt
no changes added to commit (use "git add" and/or "git commit -a")
- git add <파일명 또는 디렉토리경로명> : Tracked 상태로 만들면서 Staged 상태가 된다
// aa.txt 파일을 add 하여 tracked+staged 상태로 변경함
$ git add aa.txt
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: aa.txt
#
# 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: README.md
#
- Modified 상태의 파일을 Stage 하기
// 수정하여서 Changes not staged for commit: 으로 표현된 README.md파일을 Staged 상태로 변경하기
$ git add README.md
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README.md
# new file: aa.txt
#
- Stage 된 파일을 다시 Modified 하였을 경우
// 이미 Staged 상태인것을 다시 수정한다
$ vi README.md
// 상태를 확인해 보면 README.md 파일이 Staged 에도 존재하고 modified 상태에도 존재한다.
// 만일 commit을 하게 되면 Staged 상태의 READM.md파일이 커밋된다.
// 다시 git add README.md를 해준다
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README.md
# new file: aa.txt
#
# 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: README.md
#
// modified 상태의 파일을 staged 상태로 변경한다
$ git add README.md
// 다시 상태 확인
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README.md
# new file: aa.txt
#
- .gitignore : Untracked 파일을 git 목록에서 제거하기 (로그파일, 빌드환경파일, 프로젝트파일등 무시하고자 하는 것을 명시한다)
- 아무것도 없는 줄이나 # 시작하는 줄 무시
- 표준 Glob 패턴 사용 (Glob패턴은 정규표현식을 단순하게 만든 것으로 보통 쉘에서 사용)
- * : 문자가 하나도 없거나 하나 이상을 의미
- [abc] : 중괄호 안에 있는 문자중 하나를 의미
- ? : 문자 하나를 의미
- [0-9] : 하이픈을 사용하면 그 캐릭터 사이의 문자 하나를 의미
- 디렉토리는 슬래쉬(/)를 끝에 사용
- 느낌표(!)로 시작하는 패턴은 해당 패턴의 파일 무시
# comment
*.a # 확장자 .a 인 파일 무시
!lib.a # lib.a 파일은 무시하지 않음
/TODO # 루트 디렉토리에 있는 TODO 파일 무시
build/ # build/ 디렉토리 모든 파일 무시
doc/*.txt # doc/*.txt는 무시 그러나 doc/another/*.txt 파일은 무시하지 않음
- git diff : Staged와 Unstaged 상태의 변경 내용을 보기 (git status 는 단순 상태 정보만을 보여주지만 git diff는 변경 내용을 볼 수 있다)
// aa.txt 파일안에 test라고 내용을 입력한다
$ vi aa.txt
// working directory의 modified상태와 staging area의 staged 상태의 내역 차이를 비교하고 내용을 보여준다
// 즉 staged 상태가 아닌 파일을 비교해 볼 수 있다. (즉, Ustaged 상태인 것들만 보여준다)
$ git diff
diff --git a/aa.txt b/aa.txt
index e69de29..9daeafb 100644
--- a/aa.txt
+++ b/aa.txt
@@ -0,0 +1 @@
+test
// git diff --cached : staged 와 git directory간의 변경내역을 보고 싶을 경우
// Staging Area 와 저장소에 커밋한 것을 비교해 볼 수 있다. (즉, Staged 상태인 것들만 보여준다)
$ git diff --cached
diff --git a/README.md b/README.md
index e69de29..47086e9 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,2 @@
+hi pro git
+by dowon
diff --git a/aa.txt b/aa.txt
new file mode 100644
index 0000000..e69de29
- git commit <fileName option> -m <message> : Staging Area 파일을 정일한다. 즉, Staged 파일만 해당 된다. git add 하지 않은 파일은 Modified 상태로 남음.
// master 브랜치에 커밋했고, 체크섬은 9160d86 이라는 의미
$ git commit aa.txt -m "add test file"
[master 9160d86] add test file
1 file changed, 1 insertion(+)
create mode 100644 aa.txt
- git commit -a -m <메세지> : Staging Area 생략하고 commit 하기.
// 내용 수정
$ vi README.md
// 현재 상태 : modified 상태가 있지만 Staging Area를 거치지 앟고 바로 Git Direcotry (로컬 저장소)로 보내고 싶을 경우
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README.md
#
# 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: README.md
#
// -a 옵션 사용 단, 파일은 최소 1회 이상 commit 이 된 것이어야 한다
// master 브랜치에 6efd594 체크섬으로 commit 되었음
$ git commit -a -m "modified README.md"
[master 6efd594] modified README.md
1 file changed, 2 insertions(+)
// commit 이 되었음
$ git status
# On branch master
nothing to commit, working directory clean
- git rm <파일> : 삭제된 파일은 Staging 상태가 된다. 다시 commit을 하면 삭제가 된다. (삭제확인을 위한 장치). 만일 Staging Area에서 포함되지 않게 제거하는 것은 git rm --cached를 사용한다.
// 파일을 삭제한다
$ git rm aa.txt
rm 'aa.txt'
// 삭제된 파일이 Staging Area에 Deleted 상태로 있음을 알려준다
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: aa.txt
#
// commit 하여 Staging Area에 있는 Deleted 상태의 파일을 제거한다
$ git commit -m "delete aa.txt"
[master b5da470] delete aa.txt
1 file changed, 1 deletion(-)
delete mode 100644 aa.txt
// aa.txt 파일이 제거되었다.
$ git status
# On branch master
nothing to commit, working directory clean
- git mv <from파일> <to파일> : 파일 이름 변경하기를 하면 Staging Area에 Renamed 상태로 된다.
// 이름을 변경(옮긴다)
$ git mv README.md README
// Staging Area에 Renamed 상태
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: README.md -> README
#
- git log : 커밋 히스토리 보기. 가장 최근 커밋이 가장 먼저 나온다. -p 옵션은 커밋의 diff 결과를 보여준다. -2 는 두개의 결과만 보여준다. -p 옵션은 diff이기 때문에 동료의 변경 내용을 빠르게 확인 할 수 있다. --stat 각 커밋의 통계 정보를 보여줌. --pretty는 사용자 정의가능 (oneline, short, full, fuller, format 옵션 예, --pretty=oneline). --graph는 브랜치 그래프를 보여줌
// -p 변경 내역을 포함하고 -2 최근 2개만 보여줌
$ git log -p -2
commit b5da4702608e2980a38d51416af79a35b7fcd904
Author: Yun DoWon <ysyun@yuwin.co.kr>
Date: Mon Dec 24 14:01:50 2012 +0900
delete aa.txt
diff --git a/aa.txt b/aa.txt
deleted file mode 100644
index 9daeafb..0000000
--- a/aa.txt
+++ /dev/null
@@ -1 +0,0 @@
-test
commit 6efd594f461e0e71d655efab90cf2341f8d9e290
Author: Yun DoWon <ysyun@yuwin.co.kr>
Date: Mon Dec 24 13:54:48 2012 +0900
modified README.md
diff --git a/README.md b/README.md
index e69de29..00ed50f 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,2 @@
+hi pro git
+by dowon yun
// 통계 정보를 보여줌
$ git log --stat
commit b5da4702608e2980a38d51416af79a35b7fcd904
Author: Yun DoWon <ysyun@yuwin.co.kr>
Date: Mon Dec 24 14:01:50 2012 +0900
delete aa.txt
aa.txt | 1 -
1 file changed, 1 deletion(-)
commit 6efd594f461e0e71d655efab90cf2341f8d9e290
Author: Yun DoWon <ysyun@yuwin.co.kr>
Date: Mon Dec 24 13:54:48 2012 +0900
modified README.md
README.md | 2 ++
1 file changed, 2 insertions(+)
commit 9160d863411cd3ef7c7977bff6d405ad41608b58
Author: Yun DoWon <ysyun@yuwin.co.kr>
Date: Mon Dec 24 13:48:06 2012 +0900
add test file
aa.txt | 1 +
1 file changed, 1 insertion(+)
commit 3b7d2a8903cd5b02344ce89b3ff4386ff3f3a038
Author: Yun DoWon <ysyun@yuwin.co.kr>
Date: Mon Dec 24 11:04:33 2012 +0900
add readme.md file
0 files changed
// 한줄로 보여주기 : 내용을 많을 경우 유용함
$ git log --pretty=oneline
b5da4702608e2980a38d51416af79a35b7fcd904 delete aa.txt
6efd594f461e0e71d655efab90cf2341f8d9e290 modified README.md
9160d863411cd3ef7c7977bff6d405ad41608b58 add test file
3b7d2a8903cd5b02344ce89b3ff4386ff3f3a038 add readme.md file
// format 형식을 준다
$ git log --pretty=format:"%h -%an, %ar : %s"
b5da470 -Yun DoWon, 15 minutes ago : delete aa.txt
6efd594 -Yun DoWon, 22 minutes ago : modified README.md
9160d86 -Yun DoWon, 29 minutes ago : add test file
3b7d2a8 -Yun DoWon, 3 hours ago : add readme.md file
// 브랜치 히스토리까지 본다
$ git log --pretty=format:"%h %s" --graph
* b5da470 delete aa.txt
* 6efd594 modified README.md
* 9160d86 add test file
* 3b7d2a8 add readme.md file
* format 옵션 내역
Option Description of Output
%H Commit hash
%h Abbreviated commit hash
%T Tree hash
%t Abbreviated tree hash
%P Parent hashes
%p Abbreviated parent hashes
%an Author name
%ae Author e-mail
%ad Author date (format respects the –date= option)
%ar Author date, relative
%cn Committer name
%ce Committer email
%cd Committer date
%cr Committer date, relative
$s Subject
* git log 옵션들
--since --after : 명시한 날짜 이후의 커밋만 검색. 예)git log --since=2.weeks : 2주 동안 만들어진 커심들만 조회
--until, --before : 명시한 날짜 이전의 커밋만 검색
--author : 저자를 지정할 수 있다.
--committer : 입력한 커밋터의 커밋만 조회
--grep : 커밋 메세지에서 키워드를 검색
-- <path1> <path2> : 해당 경로 밑의 커밋 히스토리를 조회
// commit hash와 subject만을 보여주고 저작자 Yun DoWon 이라는 사람의 23이전 커밋 내역 검색
$ git log --pretty="%h - %s" --author="Yun DoWon" --since="2012-12-23"
b5da470 - delete aa.txt
6efd594 - modified README.md
9160d86 - add test file
3b7d2a8 - add readme.md file