Pro Git 2장, 3장 요약입니다.

아폴로 2013.11.05 14:32 조회 수 : 52127

혼자 쓰려고 정리했던 프로Git 명령어 요약.

혹시 필요하신 분은 참고하세요~^^


=============================


- 사용자 정보

$ git config --global user.name "John Doe"

$ git config --global user.email johndoe@example.com


- 설정 확인

$ git config --list

$ git config user.name


도움말

$ git help config


새 저장소 만들기

$ git init

$ git add *.c

$ git add README

$ git commit -m 'initial project version'


이미 있는 저장소 clone 하기

$ git clone [url] [로컬dir명]

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


파일 상태 확인

$ git status


파일 무시 설정

.gitignore


파일 변경되어도 알리지 않음

$ git update-index --assume-unchanged [file]


파일 변경내용 확인

$ git diff

$ git diff --cached

$ git diff --staged


직전 커밋과 다른 내용 확인

$ git diff HEAD^ HEAD [-- file]


변경사항 커밋

$ git commit -v (diff 결과도 함께 저장)

$ git commit -m "Story 182: Fix benchmarks for speed"


Staging Area에 자동 추가

$ git commit -a -m 'added new benchmarks'


파일 삭제

$ git rm 파일명

$ git rm --cached 파일명 (하드디스크 파일은 남겨둠)


파일 여러개 삭제

$ git rm log/*.log


파일 이름 변경

$ git mv file_from file_to


커밋 히스토리 조회

$ git log

$ git log -p -<n> : n은 최근 몇개의 숫자

$ git log --stat

$ git log --pretty=[oneline/short/full/fuller]


$ git log --pretty=format:"%h - %an, %ar : %s" 

   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 --pretty=format:"%h %s" --graph

    옵션 설명

-p 각 커밋에 적용된 패치를 보여준다.

--stat 각 커밋에서 수정된 파일의 통계정보를 보여준다.

--shortstat `--stat` 명령의 결과 중에서 수정한 파일, 추가된 줄, 삭제된 줄만 보여준다.

--name-only 커밋 정보중에서 수정된 파일의 목록만 보여준다.

--name-status 수정된 파일의 목록을 보여줄 뿐만 아니라 파일을 추가한 것인지, 수정한 것인지, 삭제한 것인지도 보여준다.

--abbrev-commit 40자 짜리 SHA-1 체크섬을 전부 보여주는 것이 아니라 처음 몇 자만 보여준다.

--relative-date 정확한 시간을 보여주는 것이 아니라 `2 주전`처럼 상대적인 형식으로 보여준다.

--graph 브랜치와 머지 히스토리 정보까지 아스키 그래프로 보여준다.

--pretty 지정한 형식으로 보여준다. 이 옵션에는 oneline, short, full, fuller, format이 있다. format은 원하는 형식으로 출력하고자 할 때 사용한다.


조회 제한조건

$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t/

옵션 설명

-(n) 최근 n 개의 커밋만 조회한다.

--since, --after 명시한 날짜 이후의 커밋만 검색한다.

--until, --before 명시한 날짜 이전의 커밋만 조회한다.

--author 입력한 저자의 커밋만 보여준다.

--committer 입력한 커미터의 커밋만 보여준다.

--grep 키워드 검색

--all-match 저자와 키워드를 한번에 검색


커밋 수정하기 --amend

$ git commit --amend


파일상태 Unstage로 변경하기

$ git reset HEAD <file>


수정하기 이전으로 복원

$ git checkout -- <file>


커밋 취소하기

$ git reset HEAD~1 (숫자만큼 과거로 복구)


직전 상태로 복구

$ git reset HEAD^


변경내용 되돌리기(새로운 커밋이 생성됨)

$ git revert HEAD


- 리모트 저장소

$ git remote -v


- 리모트 저장소 추가: git remote add [단축이름] [url]

$ git remote add [remote-name] git://github.com/paulboone/ticgit.git


- 리모트 저장소에 있는 것 로컬로 가져오기(Pull)

$ git fetch [remote-name]

$ git fetch origin

$ git pull


- 리모트 저장소에 Push

$ git push origin master

  ==> master 브랜치를 origin 서버에 Push한다


- 리모트 저장소 정보 조회

$ git remote show origin


리모트 저장소 이름변경, 삭제

$ git remote rename pb paul

$ git remote rm paul


- Tag 조회

$ git tag -l 'v1.4.2.*'


Annotated Tag: 모든 정보 저장

$ git tag -a v1.4 -m 'my version 1.4'


Tag정보와 커밋 정보 모두 확인

$ git show v1.4


Tag에 GPG 개인키로 서명하기

$ git tag -s v1.5 -m 'my signed 1.5 tag'


Lightweight Tag : 커밋 체크섬만 저장

$ git tag v1.4-lw


나중에 Tag하기

$ git tag -a v1.2 9fceb02


Tag 공유하기(브랜치 공유와 같은 방법)

$ git push origin [Tag 이름]

$ git push origin --tags ==> Tag 한꺼번에 Push


팁!!

자동완성: <tab>

Git Alias : 

$ git config --global alias.unstage 'reset HEAD --'  (unstage 상태로 변경)

$ git config --global alias.last 'log -1 HEAD'       (최근 커밋 확인)

$ git config --global alias.visual "!gitk" (외부명령 gitk 실행)


================= 2장 끝


브랜치 준비

$ git add README test.rb LICENSE

$ git commit -m 'initial commit of my project'


브랜치 만들기

$ git branch testing


- 브랜치로 이동

$ git checkout testing


- 브랜치 조회 (-v:각 브랜치의 마지막 커밋메시지)

$ git branch -v


브랜치에서 커밋!

$ vim test.rb

$ git commit -a -m 'made a change'


master 브랜치로 이동

$ git checkout master


master 브랜치에서 다시 커밋!

$ vim test.rb

$ git commit -a -m 'made other changes'

--------------

- 브랜치를 만들면서 Checkout까지 한 번에 하려면

$ git checkout -b iss53

Switched to a new branch 'iss53'


- iss53에서 커밋

$ vim index.html

$ git commit -a -m 'added a new footer [issue 53]'


- 다시 master로 이동

$ git checkout master

Switched to branch 'master'


- hotfix 브랜치 만들어서 사용

$ git checkout -b 'hotfix'

Switched to a new branch 'hotfix'

$ vim index.html

$ git commit -a -m 'fixed the broken email address'


- hotfix를 머지(Fast forward Merge)

$ git checkout master

$ git merge hotfix

Updating f42c576..3a0874c

Fast forward


- 머지 후 hotfix 브랜치 삭제

$ git branch -d hotfix

Deleted branch hotfix (3a0874c).


- 이슈 53을 처리하던 환경으로 컴백!

$ git checkout iss53

$ vim 작업 후...

$ git commit -a -m 'finished the new footer [issue 53]'


- 머지의 기초(3-way Merge)

$ git checkout master

$ git merge iss53

Merge made by recursive.

$ git branch -d iss53


- 충돌(Conflict)의 기초

  : 두 브랜치에서 같은 파일의 한 부분 동시 수정

$ git merge iss53

Auto-merging index.html

CONFLICT (content): Merge conflict in index.html

Automatic merge failed; fix conflicts and then commit the result.

$ git status


- 머지툴 사용

$ git mergetool

 ==> 충돌 해결 후 git commit 명령으로 커밋.


- 브랜치 정보

$ git branch -v


- 모든 브랜치 정보 조회

$ git branch -av


- 머지한 브랜치 목록

$ git branch --merged


- 머지하지 않은 브랜치 목록

$ git branch --no-merged


- branch 삭제

$ git branch -d testing


- 리모트 브랜치 Push하기(로컬저장소->리모트저장소)

  => git push (remote) (branch)

$ git push origin serverfix


- 리모트 브랜치에서 시작하는 새 브랜치 만들려면..

$ git checkout -b serverfix origin/serverfix


- 추적 브랜치 만들기

   => git checkout -b [branch] [remotename]/[branch]

$ git checkout --track origin/serverfix

$ git checkout -b sf origin/serverfix


- 리모트 추적 브랜치 삭제

  => git push [remotename] :[remotebranch]

$ git push origin :serverfix


- 로컬의 리모트 브랜치 조회

$ git branch -r


- 로컬의 리모트 브랜치 삭제

$ git branch -r -d origin/branch명


- Rebase 하기

$ git checkout experiment

$ git rebase master

이미 공개 저장소에 Push한 커밋을 Rebase하지 마라


- rebase로 이력수정하기

$ git rebase -i

  => 수정할 이력의 pick 을 edit 로 변경 후 저장

  => 변경대상 commit 메시지 수정: git commit --amend

  => 변경완료, 다음 대상 호출: git rebase --continue


- 하던일 Stash하기

$ git stash (임시저장)

$ git stash list (임시저장리스트 출력)

$ git stash apply --index (최근 상태로 복원)

$ git stash drop stash@{0} (해당 stash 제거)

$ git stash pop (stash 적용 후 바로 제거)


- client 브랜치를 Checkout하고 server와 client의 공통조상 이후의 패치를 만들어 master에 적용한다.

$ git rebase --onto master server client


- 이제 master 브랜치로 돌아가서 Fast-forward

$ git checkout master

$ git merge client


- 토픽(server) 브랜치를 Checkout하고 베이스(master) 브랜치에 Rebase한다.

$ git rebase master server

========================= 3장 끝


<Windows에서 Git 설정>

- Diff 도구

$ git config --global merge.tool vimdiff

[merge]

tool = gvimdiff

[mergetool "vimdiff"]

path = c:/Program Files/Vim/vim73/gvim


[diff]

tool = gvimdiff

[difftool "vimdiff"]

path = c:/Program Files/Vim/vim73/gvim


- .bashrc 설정

alias ls='ls --color=auto --show-control-chars'

alias ll='ls -al --color=auto --show-control-chars'

alias vim='/c/"Program Files"/Vim/vim73/gvim.exe'

alias d:='cd /d/depo'

export GIT_EDITOR="/c/Program Files/Vim/vim73/gvim.exe"


- .inputrc 설정

set output-meta on

set convert-meta off

===========================================


- 머지 정책


머지 실행시 Git 는 머지 정책을 선택한다. Already up-to-date, Fast-forward 가 먼저 시도되고 브랜치가 다수라면 Octopus 가 사용된다. 일반적인 경우에는 Recursive 가 사용된다.


: Already up-to-date

머지하려는 브랜치의 HEAD 가 과거에 이미 머지되어 있는 경우에는 머지를 중지한다.


:Fast-forward

other_branch 에 현재 브랜치의 HEAD 가 이미 적용되어 있는 경우, 다르게 말하면 현재 브랜치는 분기 이후 변한 것이 없고 분기해서 수정한 브랜치를 다시 원래 브랜치에 머지하려는 경우, 머지 커밋 생성 없이 HEAD 가 other_branch 를 가리키도록 링크만 바꾼다.


:Resolve

평범한 두 브랜치 머지다. 두 브랜치의 분기점을 찾아서 그 이후 발생한 소스 브랜치의 변경을 타겟 브랜치에 적용한다.


:Recursive

Resolve 의 경우와 흡사하나 머지 베이스가 하나 이상일 때는 머지 베이스들을 일단 머지해서 임시로 머지 베이스를 만든 후 메인 머지에 사용한다.


:Octopus

머지할 브랜치가 세 개 이상일 때는 두 개씩 Recursive 머지를 순차적으로 시도한다

=====================================


- Commit 메시지 작성법

요약문: 50글자 이하의 간략한 수정 요약


자세한 설명. 

영문 72글자 이상이 되면 줄 바꿈을 하고 이어지는 내용을 작성한다. 특정 상황에서는 첫번째 줄이 이메일 메시지의 제목이 되고 나머지는 메일 내용이 된다.

간략한 요약 이후에 넣는 빈 줄은 자세한 설명을 아예 쓰지 않는 한 매우 중요하다.

이어지는 추가적인 내용은 한 줄 띄우고 쓴다.

- 목록 표시도 사용할 수 있다.

- 보통 '-'나 '*' 표시를 사용해서 목록을 표현하고 표시 앞에 공백하나, 각 목록 사이에는 빈 줄 하나를 넣는데 상황에 따라 다르다.


번호 제목 글쓴이 날짜 조회 수
공지 [공지] 강좌, 팁, 정보등에 대해 올리는 게시판입니다. woos 2016.04.09 246
129 여기는 팁, 기타 정보를 올리는 곳입니다. 백창우 2006.06.05 14751
128 #pragma에 관련해서.. [2] 원민수 2006.07.19 20782
127 kernel 2.6의 kzalloc함수 (원민수 씀) 백창우 2007.02.23 19337
126 누가 나를 호출했는지 찾기 + 포인터를 심볼 이름으로 변환하여 출력하기 [1] 지현구 2007.02.27 17863
125 태훈님에 이어. ARM kernel 참고자료 백창우 2007.11.05 19014
124 systemtap 관련 간단한 소개입니다. 남용우 2007.11.06 17058
123 define을 사용한 version 처리. 원민수 2008.02.09 15026
122 허접 영어 사전입니다. [3] 백창우 2008.04.22 16092
121 포토샵 웹버전입니다. [1] 강진성 2010.05.14 40685
120 막강 디버깅 매크로 DM_PRINT() [4] file 배상경 2010.11.23 12045
119 perspective of the medical industry and engineering [15] 김성현2 2011.09.16 8197
118 돈되는 이야기?! 음주운전방지 앱 [3] 김성현2 2011.10.18 6775
117 돈되는 이야기?!, 내친김에 하나더, 나는 잘 자고 있을까? [8] 김성현2 2011.10.18 7789
116 돈되는 이야기?! 삼성 손가락 혈압계 [1] 김성현2 2011.10.20 9493
115 조금은 묵직한 시스템, 뇌감시장치 김성현2 2011.11.17 10585
114 C++에서 meta class 이용하기 [2] 이경문 2012.05.06 6888
113 멀티유저 드라이빙 환경 [3] pororo 2012.08.25 7257
112 xen 4.1 설치 방법(우분투 11.04) [2] 이상철 2012.11.14 10109
111 리눅스 커널 스터디 참고자료 (x86) [4] 리누즈박 2013.05.06 18397
110 2013.05.25 ARM 아키텍쳐 세미나 1차 발표자료 - by 민홍 교수님 [5] file K 2013.05.25 4980
XE Login