본문 바로가기
프로그래밍 놀이터/Tips

[도서 정리] 2. Git 의 기초 #1 - ProGit

by 돼지왕 왕돼지 2020. 1. 5.
반응형

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/





반응형

댓글