2. Git 의 기초 #1 - ProGit |
2.1. Git 저장소 만들기
-
Git 저장소를 만드는 방법은 두가지이다.
기존 프로젝트나 디렉터리를 Git 저장소로 만드는 방법이 있고, 다른 서버에 있는 저장소를 Clone 하는 방법이 있다.
* 기존 디렉터리를 Git 저장소로 만들기
-
$ git init
이는 .git 이라는 하위 디렉터리를 만든다.
.git 디렉터리에는 저장소에 필요한 뼈대 파일(skeleton)이 들어 있다.
* 기존 저장소를 Clone 하기
$ git clone [url] [folderName]
이는 folderName 이라는 폴더에 url 로부터 내용을 받아와 넣는다.
-
Git 은 다양한 프로토콜을 지원한다.
https://
git://
user@server:path/to/repo.git ( SSH 프로토콜 )
2.2. 수정하고 저장소에 저장하기
-
워킹 디렉터리의 모든 파일은 크게 Tracked(관리대상)와 Untracked(관리 대상이 아님)로 나뉜다.
* 파일의 상태 확인하기
-
$ git status
* 파일을 새로 추적하기
-
$ git add [fileName]
-
Changes to be committed:
에 표시된 파일은 staged 상태라는 것을 의미한다.
* Modified 상태의 파일을 Stage 하기
-
파일을 새로 추적하는 경우 말고, modified 상태인 녀석을 staged 상태로 만들 때에도 git add 를 사용한다.
또한 Merge 할 때 충돌 난 상태의 파일을 Resolve 상태로 만들 때도 사용한다.
따라서 add 의 의미는 프로젝트에 파일을 추가한다기보다는 다음 커밋에 추가한다고 받아들이는게 좋다.
* 파일 상태를 짤막하게 확인하기
-
$ git status
git status 명령으로 확인할 수 있는 내용이 많아 보일 수 있다.
간단하게 변경내용을 보려면 git status -s 또는 git status —short 를 이용하면 된다.
-
$ git status -s
결과는 아래와 같은 형태로 나온다.
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
untracked file 에는 ?? 가 표시된다.
staged 상태로 추가된 파일 중 새로 생성된 파일 앞에는 A 가 붙는다.
staged 상태로 수정된 파일에는 M 이 붙는데, modified 이면서 unstaged 이면 뒤쪽에 M 이, stage 까지 되면 앞쪽에 M 이 붙는다. (돼왕: 설terminal 설정에 따라 color 로도 구분할 수 있다.)
Rakefile 의 경우 modified 이면서 일부는 stage 되었고, 일부는 unstage 상태라 두개의 M이 표시된다.
* 파일 무시하기
-
Git 에서의 파일 관리를 무시하려면 .gitignore 파일을 만들고 그 안에 무시할 파일 패턴을 적는다.
-
.gitignore 파일에 입력하는 패턴은 아래 규칙을 따른다.
아무것도 없는 라인이나, #로 시작하는 라인은 무시한다.
표준 Glob 패턴을 사용한다.
슬래시(/)로 시작하면 하위 디렉터리(recursivity)에 적용되지 않는다.
디렉터리는 슬래시(/)를 끝에 사용하는 것으로 표현한다.
느낌표(!)로 시작하는 패턴의 파일은 무시하지 않는다.
-
Glob 패턴은 정규식을 단순하게 만든 것으로 생각하면 되고 보통 셸에서 많이 사용한다.
에스터리크(*)는 문자가 하나도 없거나 하나 이상을 의미하고, [abc] 는 중괄호 안에 있는 문자 중 하나를 의미한다.
물음표(?)는 문자 하나를 말하고, [0-9]처럼 중괄호 안의 캐릭터 사이에 붙임표(-)를 사용하면 그 캐릭터 사이에 있는 문자 하나를 말한다.
에스터리스크 2개를 사용하여 디렉터리 안의 디렉터리까지 지정할 수 있다.
예를 들어 a/**/z 패턴은 a/z, a/b/z, a/b/c/z 디렉터리에 사용할 수 있다.
* Staged 와 Unstaged 상태의 변경을 보기
-
어떤 내용이 변경되었는지 살펴보려면 git diff 명령을 사용해야 한다.
$ git diff
git diff 는 수정했지만 아직 staged 되지 않은 파일과 stage된 파일을 비교해서 보여준다. (stage 된 것이 없다면 committed 와 비교)
다시 말해 unstaged 상태인 것들만 보여준다.
-
stage 된 파일과 committed 와의 비교를 보고 싶다면 git diff —staged 를 사용하면 된다.
( git diff —cached 도 동일한 명령이다. )
$ git diff --staged
$ git diff --cached
-
git difftool 명령을 사용해서 emerge, vimdiff 같은 도구로 비교할 수도 있다.
git difftool —tool-help 명령은 사용 가능한 도구를 보여준다.
* 변경 사항 커밋하기
-
git commit 을 하면 commit msg 를 입력할 수 있는 editor 가 뜨고, 수정 후 종료하면, # 이 없는 라인이 commit msg 가 되어 commit 된다.
아래와 같이 -m 옵션을 사용하여 editor 를 거치지 않고 메시지를 쓸 수도 있다.
$ git commit -m “Commit Msg”
* Staging Area 생략하기
-
git commit 에 -a 옵션을 추가하면 Git 은 Tracked 상태의 파일을 자동으로 Staging Area 에 넣는다.
그래서 git add 를 실행하는 수고를 덜 수 있다.
$ git commit -a
* 파일 삭제하기
-
git rm 으로 tracked 상태의 파일을 staging area 에서 삭제할 수 있다.
staging area 에서 삭제한 후에는 commit 을 해줘야 한다.
-
git rm 명령은 워킹 디렉터리에 있는 파일도 삭제하여 실제 파일도 지워진다.
수정한 파일을 index 에 추가했다면 -f 옵션을 주어 강제로 삭제해야 한다.
-
staging area 에서만 제거하고 워킹 디렉터리에 있는 파일은 지우지 않고 남겨두려면 —cached 옵션을 사용하면 된다.
-
여러 개의 파일이나 디렉터리를 한꺼번에 삭제할 수도 있다.
git rm 명령에 file-glob 패턴을 사용하면 된다.
ex)
log 폴더 안의 .log 파일 모두 삭제
$ git rm log/\*.log
~ 로 끝나는 파일 모두 삭제
$ git rm \*~
* 파일 이름 변경하기
-
Git 은 파일 이름의 변경이나 파일의 이동을 명시적으로 관리하지 않는다.
파일 이름이 변경됐다는 별도의 정보를 저장하지 않는다는 말이다.
Git 은 똑똑해서 굳이 파일 이름이 변경되었다는 것을 추적하지 않아도 아는 방법이 있다.
-
$ git mv file_from file_to
git mv 는 다음 명령어와 동일하다.
$ mv file_from file_to
$ git rm file_from
$ git add file_to
2.3. 커밋 히스토리 조회하기
-
저장소의 히스토리를 보고 싶을 때는 git log 를 수행하면 된다.
가장 최근 커밋이 가장 먼저 나온다.
각 커밋의 SHA-1 체크섬, 저자 이름, 저자 이메일, 커밋한 날짜, 커밋 메시지를 보여준다.
-
git log -p 는 굉장히 유용하다.
-p 는 각 커밋의 diff 결과를 보여준다.
-n 와 같이 최근 n 개의 결과만 보여줄 수도 있다.
ex)
$ git log -p -2
-
git log —stat 으로 커밋의 통계 정보를 조회할 수 있다.
$ git log --stat
—stat 옵션은 어떤 파일이 수정됐는지, 얼마나 많은 파일이 변경되었는지, 또 얼마나 많은 라인을 추가하거나 삭제했는지 보여준다.
요약정보는 가장 뒤쪽에 보여준다.
-
—pretty 옵션도 유용하다.
이 옵션을 통해 히스토리 내용을 보여줄 때 기본 형식 이외에 여러 가지 중 하나를 선택할 수 있다.
oneline 옵션은 각 커밋을 한 라인으로 보여준다.
short, full, fuller 옵션도 있다.
ex)
$ git log —pretty=oneline
-
format 옵션은 나만의 포맷으로 결과를 출력하고 싶을 때 사용한다.
특히 결과를 다른 프로그램으로 파싱하고자 할 때 유용하다.
이 옵션을 사용하면 포맷을 정확하게 일치시킬 수 있기 때문에 Git 을 새 버전으로 바꿔도 결과 포맷이 바뀌지 않는다.
ex)
$ git log —pretty=format:%h - %an, %ar : %s”
%H : 커밋 해시
%h : 짧은 길이 커밋 해시
%T : 트리 해시
%t : 짧은 길이 트리 해시
%P : 부모 해시
%p : 짧은 길이 부모 해시
%an : 저자 이름
%ae : 저자 메일
%ad : 저자 시각(현식은 -date=옵션 참고)
%ar : 저자 상대적 시각
%cn : 커미터 이름
%ce : 커미터 메일
%cd : 커미터 시각
%cr : 커미터 상대적 시각
%s : 요약
-
저자는 원래 작업을 수행한 원작자이고 커미터는 마지막으로 이 작업을 적용한(저장소에 포함한) 사람이다.
어떤 프로젝트에 패치를 보냈고 그 프로젝트의 담당자가 패치를 적용했다면 두 명의 정보는 다를 것이다.
-
oneline 과 format 옵션은 —graph 옵션과 함꼐 사용할 때 더 빛난다.
이 명령은 브랜치와 머지 히스토리를 보여주는 아스키 그래프를 출력한다.
$ git log --pretty=oneline --graph
-
git log 의 옵션들은 아래와 같은 것들이 있다.
-p : 각 커밋에 적용된 패치를 보여준다.
—stat : 각 커밋에서 수정된 파일의 통계정보를 보여준다.
—shortstat : —stat 명령의 결과 중에서 수정한 파일, 추가된 라인, 삭제된 라인만 보여준다.
—name-only : 커밋 정보 중에서 수정된 파일의 목록만 보여준다.
—name-status : 수정된 파일의 목록을 보여줄 뿐만 아니라 파일을 추가한 것인지, 수정한 것인지, 삭제한 것인지도 보여준다.
—abbrev-commit : 40자짜리 SHA-1 체크섬을 전부 보여주는 것이 아니라 처음 몇 자만 보여준다.
—relative-date : 정확한 시간을 보여주는 것이 아니라 “2주 전”처럼 상대적인 형식으로 보여준다.
—graph : 브랜치와 Merge 히스토리 정보까지 아스키 그래프로 보여준다.
—pretty : 지정된 형식으로 보여준다. oneline, short, full, fuller, format 이 있다.
돼왕 : --first-parent <branch_name> 을 통해 해당 branch 의 commit log 들을 볼 수 있다.
* 조회 제한 조건
-
-n 과 같은 옵션은 사실 자주 쓰지 않는다.
Git 은 기본적으로 출력을 pager 류의 프로그램을 거쳐서 내보내므로 한 번에 한 페이지씩 보여준다.
-
—since 나 —until 같은 시간을 기준으로 조회하는 옵션은 매우 유용하다.
ex) 지난 2주 동안 만들어진 커밋만을 조회한다.
$ git log —since=2.weeks
-
since 와 until 은 다양한 형식을 지원한다.
2008-01-15 같이 정확한 날짜도 사용할 수 있고,
2 years 1 day 3 minutes ago같이 상대적인 기간을 사용할 수도 있다.
-
—author 옵션으로 저자를 지정하여 검색할 수도 있고, —grep 옵션으로 커밋 메시지에서 키워드를 검색할 수도 있다.
(author 와 grep 옵션을 함께 사용하여 만족하는 커밋을 찾으려면 —all-match 옵션도 반드시 함께 사용해야 한다.)
-
-S 옵션은 코드에서 추가되거나 제거된 내용 중에 특정 텍스트가 포함되어 있는지를 검색한다.
ex)
git log -S text
-
파일 경로로 검색하는 옵션이 있다.
디렉터리나 파일 이름을 사용하여 그 파일이 변경된 log 결과를 검색할 수 있는데, 이 옵션은 -- 와 함께 경로 이름을 사용하는데 명령어 끝 부분에 쓴다.
$ git log — path1 path2
-
조회 범위를 제한하는 옵션들은 다음이 있다.
-(n) : 최근 n개의 커밋만 조회한다.
—since, —after : 명시한 날짜 이후의 커밋만 검색한다.
—until, —before : 명시한 날짜 이전의 커밋만 검색한다.
—author : 입력한 저자의 커밋만 보여준다.
—committer : 입력한 커미터의 커밋만 보여준다.
—grep : 커밋 메시지 안의 텍스트를 검색한다.
-S : 커밋 변경(추가/삭제) 내용 안의 텍스트를 검색한다.
-
ex) t/ 폴더 안의 2008년 10월에 gitster 가 author 이나 merge 되지 않은 녀석들을 format 에 맞게
$ git log —pretty=“%h - %s” —author=gitster —since=“2008-10-01” —before”2008-11-01” —no-merges — t/
'프로그래밍 놀이터 > Tips' 카테고리의 다른 글
[도서 정리] 3. Git 브랜치 - ProGit (0) | 2020.01.07 |
---|---|
[도서 정리] 2. Git 의 기초 #2 - ProGit (0) | 2020.01.06 |
[도서 정리] 1. 시작하기 - ProGit (0) | 2020.01.04 |
[도서 정리] 부록A. 많이 쓰는 앱과 언어에서 활용하는 정규식 - 손에 잡히는 10분 정규 표현식 (0) | 2020.01.03 |
[도서 정리] 11. 정규 표현식으로 해결하는 일반적인 문제들 - 손에 잡히는 10분 정규 표현식 (0) | 2020.01.02 |
댓글