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

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

혼자 쓰려고 정리했던 프로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 제3회 ETRI 휴먼이해 인공지능 논문경진대회 file 인공지능팩토리1 2024.04.22 25
128 KVM 소스코드를 수정하고자 합니다. [1] 두두 2024.04.20 37
127 [딥러닝러닝데이] AutoML을 활용한 모델 탐색-서호건 file 인공지능팩토리1 2024.01.11 93
126 [랭체인러닝데이] 개인 데이터셋을 통한 llama2 fine-tune - 최재혁 file 인공지능팩토리1 2024.01.05 65
125 [SD러닝데이] 광고에서의 생성 AI 활용 실무사례 모음집 file 인공지능팩토리1 2023.12.07 43
124 [챗GPT 러닝데이] 개발자에게 부탁하기 두려웠던 나머지...(더보기) file 인공지능팩토리1 2023.11.02 75
123 [2023 제3회 K-water AI 경진대회] 어종(魚種) 식별 및 분류 알고리즘 개발 file 인공지능팩토리1 2023.10.25 42
122 제4차 USG AI·데이터 문제해결 제조혁신 경진대회 file 인공지능팩토리1 2023.10.25 17
121 [SD러닝데이] 디자이너의 영상&3D에서의 AI 활용 실전 워크플로우 file 인공지능팩토리1 2023.10.17 17
120 [리눅스 커널 강의] 커널 코어 분석 공유 [1] 이파란 2023.10.11 146
119 [챗GPT 러닝데이 세미나] 사랑의 컨설턴트 챗GPT(챗GPT를 활용한 연애상담) file 인공지능팩토리1 2023.10.05 28
118 [Github] 경로 또는 이름이 바뀐 파일 추적 기능 공유 file 이파란 2023.08.23 60
117 무료세미나 음성 챗봇 만들기와 마이크로소프트 ISV 혜택 및 등록팁 방출! 인공지능팩토리 2023.07.26 23
116 2023 제1회 철도 인공지능 경진대회 인공지능팩토리 2023.07.24 22
115 제2회 통신망 안정성 확보를 위한 인공지능 해커톤 인공지능팩토리 2023.07.21 10
114 무료세미나 - [SD러닝데이] AI야 배경 좀 그려줘 인공지능팩토리 2023.07.13 29
113 [무료세미나] SAM(Segment Anything Model)과 친해지기 인공지능팩토리 2023.07.06 42
112 [경진대회] 2023 AI 대학원 챌린지 with kt 믿:음 ~ 7월 23일(일) 인공지능팩토리 2023.07.05 30
111 [무료세미나] - SD러닝데이 Knock Knock. "Stable Diffusion? 인공지능팩토리 2023.06.30 22
110 위성영상을 활용한 정유탱크·컨테이너 탐지 AI 경진대회 인공지능팩토리 2023.06.22 29
XE Login