혼자 쓰려고 정리했던 프로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글자 이상이 되면 줄 바꿈을 하고 이어지는 내용을 작성한다. 특정 상황에서는 첫번째 줄이 이메일 메시지의 제목이 되고 나머지는 메일 내용이 된다.
간략한 요약 이후에 넣는 빈 줄은 자세한 설명을 아예 쓰지 않는 한 매우 중요하다.
이어지는 추가적인 내용은 한 줄 띄우고 쓴다.
- 목록 표시도 사용할 수 있다.
- 보통 '-'나 '*' 표시를 사용해서 목록을 표현하고 표시 앞에 공백하나, 각 목록 사이에는 빈 줄 하나를 넣는데 상황에 따라 다르다.
댓글 0
.