1. 기본 설정
설정파일은 3가지
- /etc/gitconfig: 시스템의 모든 사용자에게 적용. git config --system으로 접근.
- ~/.gitconfig, ~/.config/git/config: 현재 사용자에게만 적용. git config --global로 접근
- .git/config: git 디렉토리에 있으며 해당 프로젝트에만 적용. git config --local로 접근
우선 순위는 역순입니다. (.git/config > ~/.gitconfig > /etc/gitconfig)
1.1 사용자 정보
사용자의 이름과 이메일을 설정합니다.
$ git config --global user.name "goax"
$ git config --global user.email "goax@gmail.com"
--global 옵션으로 설정했으므로 ~/.gitconfig에 해당 정보가 있습니다.
$ cat ~/.gitconfig
[user]
name = goax
email = goax@gmail.com
1.2 편집기
commit할때 사용할 에디터를 설정합니다.
git config --global core.editor vim
1.3 설정 확인
git config --list로 설정한 정보를 확인할 수 있습니다.
git config --list
위의 경우 전체 값을 merge하여 현재 설정 상태를 보여줍니다.
--system, --global, --local 을 사용하여 특정 설정 상태만을 볼 수 있습니다.
1.4 설정 삭제
git config --unset user.name
1.5 사용자 이름/암호 기억
Push/Pull 할 때 몇 분동안 사용자 이름/암호를 기억합니다.
git config --global credential.helper cache
1.5 Alias
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
# This makes the following two commands equivalent:
# $ git unstage fileA
# $ git reset HEAD -- fileA
2. Clone
2.1 디렉토리 지정
디렉토리를 지정하여 Clone합니다.
$ git clone https://github.com/libgit2/libgit2 mylibgit
2.2 Shallow Clone (--depth)
Commit History를 1개를 갖는 Shallow Clone을 생성합니다.
git clone --depth=1 https://github.com/libgit2/libgit2 mylibgit2
3. Log 조회
3.1 Patch (include diff)
git log -p -2
3.2 Stat (abbreviated stats)
git log --stat
3.3 Pretty
Oneline
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
$ git log --abbrev-commit --pretty=oneline
ca82a6d changed the version number
085bb3b removed unnecessary test code
a11bef0 first commit
Format
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit
Graph
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
* 11d191e Merge branch 'defunkt' into local
3.4 범위 지정
Since[After], Until[Before]
$ git log --since=2.weeks
$ git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \
--before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch
Filter function_name
git log -S function_name
3.5 Reflog
로컬에서 일어나는 모든 기록입니다. (Shell의 History와 유사함)
$ git reflog
734713b HEAD@{0}: commit: fixed refs handling, added gc auto, updated
d921970 HEAD@{1}: merge phedders/rdocs: Merge made by the 'recursive' strategy.
1c002dd HEAD@{2}: commit: added some blame and merge stuff
git log에 -g옵션으로 reflog 결과를 git log의 형태로 볼 수 있습니다.
$ git log -g master
commit 734713bc047d87bf7eac9674765ae793478c50d3
Reflog: master@{0} (Scott Chacon <schacon@gmail.com>)
Reflog message: commit: fixed refs handling, added gc auto, updated
Author: Scott Chacon <schacon@gmail.com>
Date: Fri Jan 2 18:32:33 2009 -0800
fixed refs handling, added gc auto, updated tests
해당 HEAD@{n} 또는 master@{DATE}로 조회할 수 있습니다.
$ git show HEAD@{5}
$ git show master@{yesterday}
$ git show HEAD@{2.months.ago}
3.6 부모 찾기 (^, ~)
HEAD^는 HEAD의 부모를 의미하므로 바로 이전 커밋을 보여줍니다.
HEAD^2는Merge되어 두번째 부모가 있는 경우에만 사용할 수 있습니다.
$ git show HEAD^
commit d921970aadf03b3cf0e71becdaab3147ba71cdef
Merge: 1c002dd... 35cfb2b...
Author: Scott Chacon <schacon@gmail.com>
Date: Thu Dec 11 15:08:43 2008 -0800
Merge commit 'phedders/rdocs'
HEAD~는 HEAD^ 과 동일하지만 뒤에 숫자는 다른 의미를 갖습니다.
HEAD~2는 "첫 번째 부모의 첫 번째 부모", 즉 "조부모"를 나타냅니다. (HEAD^^ 과 같음)
HEAD~3^2는 "증조부모의 Merge 커밋의 부모의 부모를 조회" 합니다.
3.7 Merge되지 않은 커밋 조회 (..)
experiment 브랜치의 커밋 중 master 브랜치에 Merge 되지 않은 커밋을 조회합니다.
$ git log master..experiment
서버에 Push되지 않은 커밋 조회하기
$ git log origin/master..HEAD
4. 되돌리기
4.1 --amend
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
4.2 Staged File을 Unstaged로...
Stage된 파일을 Unstage상태로 변경합니다.
git reset HEAD <file>
4.3 변경된 파일을 이전 상태로...
$ git checkout -- CONTRIBUTING.md
5. 리모트 저장소
5.1 리모트 저장소 확인
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
5.2 리모트 저장소 추가
$ git remote add pb https://github.com/paulboone/ticgit
5.3 리모트 저장소 살펴보기
원격 브랜치, pull & push branch 정보등 다양한 정보를 보여줍니다.
$ git remote show origin
5.4 리모트 저장소 이름 바꾸기
$ git remote rename pb paul
5.5 리모트 저장소 삭제하기
$ git remote remove paul
6. Tag
6.1 Tag 조회
# 알파벳 순서로 모든 태그 출력
$ git tag
# v1.8.5로 시작하는 태그만 출력
$ git tag -l "v1.8.5*"
6.2 Lightweight Tag
브랜치와 비슷하며 가리키는 지점을 최신 커밋으로 이동시키지 않습니다. (단순 포인터 개념)
$ git tag v1.4-lw
단순 커밋 정보만 출력합니다.
$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
6.3 Annotated Tag
Tag 생성자의 정보와 시간 및 메시지를 Git Database에 저장합니다.
$ git tag -a v1.4 -m "my version 1.4"
태그 생성 정보 포함한 정보를 출력합니다.
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
6.4 특정 커밋에 Tagging
$ git tag -a v1.2 9fceb02
6.5 Tag 공유
특정 Tag를 지정하여 서버에 Push합니다.
$ git push origin v1.5
리모트 서버에 없는 모든 태그를 Push합니다.
$ git push origin --tags
6.6 특정 Tag에서 작업
Tag를 Checkout하면 detached HEAD 상태가 됩니다. 여기에서의 변경된 사항은 커밋을 할 수 없는 상태입니다.
$ git checkout v2.0.0
브랜치를 생성하여 Checkout을 하여 수정한 후 작업을 진행합니다. 이 변경은 v2.0.0의 Commit을 변경하는 것은 아닙니다.
$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'
7. Branch
7.1 생성 / 변경
# new_branch 생성
$ git branch new_banch
# new_branch로 변경
$ git checkout new_branch
# new_branch가 없으면 생성하면서 변경
$ git checkout -b new_branch
7.2 조회
브랜치 목록을 조회합니다.
$ git branch
마지막 커밋 메시지와 함께 브랜치 목록을 조회합니다.
$ git branch -v
리모트 브랜치를 조회합니다.
$ git branch -r
Tracking (Upstream) 브랜치를 조회합니다.
git branch -vv
iss53 7e424c3 [origin/iss53: ahead 2] forgot the brackets
master 1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
testing 5ea463a trying something new
Merge 완료 상태의 브랜치를 조회합니다.
*이 없는 경우는 Merge된 상태이므로 삭제할 수 있습니다.
브랜치 이름을 지정하지 않으면 현재 브랜치를 기반으로 작동합니다.
# [branch] 또는 현재 브랜치와 Merge된 브랜치 조회
$ git branch --merged [branch]
iss53
* master
Merge되지 않은 브랜치를 조회합니다. 브랜치 삭제 불가합니다.
# [branch] 또는 현재 브랜치와 Merge되지 않은 브랜치 조회
$ git branch --no-merged [branch]
testing
7.3 삭제
-d를 이용하여 브랜치를 삭제합니다. (강제 삭제: -D)
$ git branch -d testing
# Merge되지 않은 경우 다음과 같은 에러 발생
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.
--delete를 이용하여 리모트 브랜치를 삭제합니다.
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
- [deleted] serverfix
7.4 Merge & Abort
현재 브랜치에 해당 브랜치의 변경 내역을 Merge 합니다.
$ git merge target_branch
Fetch로 가져온 후 리모트 브랜치에서 Merge 합니다.
git fetch origin
git merge origin/serverfix
Fetch로 가져온 후 새로운 브랜치를 생성합니다.
git checkout -b serverfix origin/serverfix
Merge 충돌이 난 경우 취소할 수 있습니다.
$ git merge --abort
7.5 Rebase
# [그림 7.5.1] experiment 브랜치의 변경 내용을 master 브랜치로 Rebase 합니다.
# 아래 두 커맨드와 동일: git rebase master experiment
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
# [그림 7.5.2] Rebase된 상태에서 master 브랜치를 Fast-Forward 시킵니다.
$ git checkout master
$ git merge experiment
7.6충돌 (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
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
충돌의 경우 <<<<<<<, =======, >>>>>>> 부분을 적절히 수정 후 해결 상태로 변경하기 위해 git add 를 실행합니다.
Staging상태에 저장된 것을 확인 한 후 git commit 을 호출합니다.
아래는 Commit Message입니다. 충돌에 대한 자세한 기록을 볼 수 있습니다.
Merge branch 'iss53'
Conflicts:
index.html
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
# modified: index.html
#
7.7 Tracking (추적)
Tracking 가능한 로컬 브랜치 이름을 자동으로 생성합니다.
$ git checkout serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
Tracking 가능한 리모트 브랜치와 다른 이름의 브랜치를 생성합니다.
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
이미 로컬에 존재하는 브랜치가 리모트의 특정 브랜치와 추적하게 합니다. (-u or --set-upstream-to)
git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
8. Stash
Stash는 Modified, Tracked, Staging Area에 있는 파일들을 보관해두는 장소입니다.
추적되지 않는 파일을 Stash하기 위해서는 --include-untracked (-u) 옵션을 사용합니다.
8.1 Stash Save
# git stash save와 동일
$ git stash
# Stage된 파일은 Stash 하지 않음
$ git stash --keep-index
# Tracking되지 않은 파일들을 Stash
$ git stash -u
8.2 Stash List
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
8.2 Stash Apply
# 최근의 Stash를 적용
$ git stash apply
# or
# 특정 Stash를 적용
$ git stash apply stash@{2}
# Stage상태까지 적용되기를 원한다면 --index
$ git stash apply --index stash@{2}
8.3 Drop
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)
8.4 Pop
바로 Stash를 Apply 하고 삭제합니다.
$ git stash pop
8.4 Stash Branch
Stash 당시의 브랜치를 Checkout하고 Stash를 적용합니다. 이 모든 것이 성공하면 Stash는 삭제됩니다.
$ git stash branch testchanges
M index.html
M lib/simplegit.rb
Switched to a new branch 'testchanges'
On branch testchanges
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: index.html
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: lib/simplegit.rb
Dropped refs/stash@{0} (29d385a81d163dfd45a452a2ce816487a6b8b014)
9. Reset
9.1 --soft
마지막 Commit으로 되돌리고 Staging 상태를 유지합니다. (git add 불필요)
# 바로 이전 커밋으로 HEAD와 브랜치를 이동
$ git reset --soft HEAD~
9.2 --mixed
마지막 Commit으로 되돌리고 변경된 파일은 Unstaging 상태가 됩니다. (git add 필요)
일반적인 reset은 --mixed가 기본 입니다.
$ git reset --mixed HEAD~
9.3 --hard
마지막 Commit으로 되돌리고 모든 변경사항을 초기화 합니다.
$ git reset --hard HEAD~
9.4 커밋 합치기
커밋들이 깃털같이 가벼운 경우 --soft로 되돌린 후 커밋을 합칠 수 있습니다.
$ git reset --soft HEAD~2
$ git commit
10. Clean
10.1 Untracked 파일을 모두 삭제
# dryrun
$ git clean -f -n
# force delete
$ git clean -f -d
# force delete and .gitignore에 포함된 파일 포함
$ git clean -f -d -x
'programming > git' 카테고리의 다른 글
Terminal용 Git UI Tool - lazygit (0) | 2020.02.28 |
---|