본문 바로가기

programming/git

git cheat sheet

 

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.5.1
그림 7.5.2

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