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

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

혼자 쓰려고 정리했던 프로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
48 VIM에서 CONFIG_ 설정 확인하기 [19] pororo 2013.07.18 8512
47 ARM Linux Kernel v4.0.5 head.S 분석자료 file 윤창호 2019.05.16 1026
46 스터디 지역 관련 문의 [1] Tooson9010 2019.03.25 341
45 올해 스터디 모집기간 문의드립니다. [1] 니나노 2019.03.22 212
44 커널스터디 모집기간 [3] spinis 2019.02.22 609
43 안녕하세요 처음 가입합니다. 스터디는 어떤식으로 모집되는 건가요 [1] 이남호 2019.03.02 309
42 프로세스별 다른 ip 쓰기 [2] wizard1483 2017.09.03 5994
41 가상 머신 QEMU를 이용한 라즈베리파이2 커널 디버깅(업데이트) [2] 송원식 2017.05.22 1560
40 SW개발자를 위한 PaaS 서비스 무료 제공 안내 클라우드파스 2017.07.10 1069
39 가상 머신 QEMU를 이용한 라즈베리파이2 커널 디버깅 [2] 수풀 2016.08.08 2302
38 간단한 블럭장치 드라이버에 대한 강좌를 만들었습니다. [1] 김기오 2016.11.05 549
37 [무료세미나] 2016년 마우저 파워 컨퍼런스에 초대합니다. (마감임박) file 짜메롱 2016.11.24 291
36 U-BOOT관련 질문 입니다. 감기귤 2016.11.03 332
35 리눅스 커널 스터디 참고자료 (x86) [4] 리누즈박 2013.05.06 18396
34 SMP Booting에 관련해서 질문이 있습니다. [2] 컴퓨터 2016.06.15 389
33 작업하던 x86 분석 문서입니다. [9] file pororo 2014.06.26 4630
32 ion/dma-buf/dma_mapping_api 정리 문서 김기오 2014.05.19 2741
31 if문에 사용하는 likely와 unlikely 함수의 용도 [1] 아폴로 2014.03.05 11173
» Pro Git 2장, 3장 요약입니다. 아폴로 2013.11.05 52108
XE Login