본문 바로가기
IT 기술/개발환경_유틸 관련 팁

git 명령어 모음

by 땅뚱 2013. 4. 9.

git 의 일반적인 명령어들은 다른 사이트를 참조하면 되고, 여기는 git 을 사용하면서 내가 필요에 의해서 사용하거나 찾아보았던 명령어를 위주로 정리하려고 한다. 나중에 시간이 되면 각각의 git 명령에 대해서 좀 자세히 알아보아야 겠다.


1. git alias

참고 : https://git.wiki.kernel.org/index.php/Aliases#Aliases_with_arguments


위 사이트를 참고하면 alias 의 다양한 사용법을 확인할 수 있다.


간단하게 $HOME/.gitconfig 파일을 직접 수정하거나, git config --global alias.<alias name> <command> 형식으로 alias 를 만들 수 있다.


우선 git config 명령을 사용해보자. 아래 명령은 git checkout 을 git co 로 alias 해준다.


# git config --global alias.co checkout


위 명령을 수행한 후에 $HOME/.gitconfig 를 확인해보자. co=checkout 이라는 alias 항목이 생긴 것을 확인할 수 있다. 앞에서 말한 것처럼 아래 [alias] 영역에 추가하면 해당 alias 를 사용할 수도 있다.


# cat ~/.gitconfig

[color]

    ui = auto

[user]

    name = xxx

    mail = xxx

    email = xxx

[merge]

    tool = vimdiff

[core]

    editor = vim

[alias]

    co = checkout


2. git rebase

기존 commit 메시지를 수정하기 위하여 git rebase 사용하는 방법.

commit 을 4번 하였고, 4개에 대해서 모두 commit message 를 바꾸고 싶은 상황이 발생하였다.


그래서 git rebase -i (interactive mode) 를 사용하여 다음과 같이 시도하였다.


# git rebase -i HEAD~4


그럼 editor 화면에 최근 4개의 commit 에 대한 정보가 다음과 같이 보여진다.

pick e37aff5 [Patch 1/ ] : Define time macro

pick 7a8010a [Patch 2/ ] Apply time macro .......................

pick 5da2997 [Patch 3/ ] Optimize xxxx function ...............

pick 0ad7148 [Patch 4/ ] Add Simulation ..........................


내 경우에 총 4개 commit 내용을 수정하고 싶었기 때문에 앞 쪽의 pick 이라고 쓰여진 부분을 모두 edit 이라고 바꾸고 editor 를 빠져나온다. 그럼 아래와 같은 메시지가 출력된다.


Stopped at e37aff5... [Patch 1/ ] : Define time macro

You can amend the commit now, with


        git commit --amend


Once you are satisfied with your changes, run


        git rebase --continue


자 이제 git log 를 해보자. 그러면 현재 commit 이 HEAD 에서 이전 4번째 commit 을 가리키고 있는 것을 확인할 수 있다. git add 등을 통해서 추가하고 싶은 내용을 더 추가하고 git commit --amend 를 통해서 commit 메시지를 수정하여 4번째 commit 을 수정한다.


수정이 완료되면 git rebase --continue 를 통해서 다음 edit 항목으로 진행한다. 이렇게 반복하면서 git rebase --continue 를 수행하면 제일 마지막에 다음과 같은 메시지가 나오면서 rebase 가 완료된다.


Successfully rebased and updated refs/heads/master.


rebase 의 interactive option 의 경우 다양한 명령을 사용할 수 있다. edit 의 경우, 앞에서 설명한 것과 같이 해당 commit 을 사용하되, 중간에 멈춰서 해당 commit 의 내용을 추가/수정할 수 있도록 해주는 명령이다.

squash 는 이전 commit 과 합치는 명령이고, fixup 도 squash 와 유사하게 합치는 명령이지만, 현재 commit log 메시지를 무시한다. 아래는 git rebase 시 사용할 수 있는 명령들이다.


# Commands:

#  p, pick = use commit

#  r, reword = use commit, but edit the commit message

#  e, edit = use commit, but stop for amending

#  s, squash = use commit, but meld into previous commit

#  f, fixup = like "squash", but discard this commit's log message

#  x, exec = run command (the rest of the line) using shell



참고: ^ 과 ~N

^ : ^ 는 이전 Commit(리비전) 을 나타낸다. ^를 여러개 사용가능하다. HEAD^^^ 는 HEAD 의 3번째 앞 commit 을 나타낸다.

~N : ~N은 정수를 나타낸다. N번째 이전 commit 을 나타낸다.

위 두가지 표현은 중복해서 사용이 가능하다. 따라서 다음 4개의 명령은 모두 동일한 리비전을 보여준다.


# git log -1 HEAD^^^^

# git log -1 HEAD^~3

# git log -1 HEAD~3^

# git log -1 HEAD~4



3. git reset

git reset HEAD <file> : staging 되어 있는 파일을 working tree 로 내려보낸다.



4. git cherry-pick

특정 commit 만을 반영하고 싶을 때, cherry-pick 명령을 사용한다.

branch A 에서 commit 한 코드중에서 일부만을 master branch 에 반영하고 싶은 경우에, 우선 반영하고 싶은 branch A 의 commit id 를 확인한다. 그리고 master branch 로 현재 working tree 를 옮긴 후에 git cherry-pick <commit-id> 를 실행하면 된다.


# git log (wroking tree : branch A)


# git checkout master


# git cherry-pick <commit-id>

< conflict 발생시 해당 파일을 열어서 conflict 를 해결한다. 그리고 git commit 을 수행한다. >

# git commit


5. git format-patch -n / git am

현재 commit 을 patch format 형태로 만들어 주는 명령. n 만큼의 commit 수만큼 patch 를 생성해준다.

아래와 같은 명령을 수행하면, 0001-<마지막 commit 제목>.patch / 0002-<마지막에서 두번째 commit 제목>.patch 파일이 생성된다.


# git format-patch -2


이렇게 생성된 patch 를 적용하려고 할 때는 am 명령을 사용한다.


# git am <patch file>


6. git log

많은 사람들이 git log 를 자주 사용할 것 같은데, graph 라는 좋은 옵션이 있다.

내 경우에는 구글링으로 찾은 내용을 살짝 수정해서 사용하고 있다.


git log --graph --decorate=full --pretty=oneline --abbrev-commit


각각의 옵션에 대해서 간단하게 알아보자


--graph : 화면 왼쪽에 commit history 에 대하여 text 기반의 graphical 한 표현으로 그려준다.

* 이 오른쪽에 설명된 commit 이 일어난 branch 를 표시해 준다.


--decorate[=short|full|no] : commit 의 refs 이름을 표시해준다. 기본값은 short 이고, short 으로 설정되면, refs/heads/, refs/tags/, refs/remotes/ 등과 같은 prefix 들은 표시하지 않는다. full 은 그러한 prefix 까지 모두 표시해준다.


--pretty[=<format>] 또는 --format=<format>

commit log 내용을 format 에 맞춰서 출력해준다. 다양한 포맷형식이 있을 수 있는데, oneline, short, medium, full, fuller, email, raw, format:<string> 등이 올 수 있고, 세부적인 내용은 직접 man page 를 확인해보면 된다. 내가 사용한 oneline 은 commit log 를 한줄로 title 만 보여준다.


--abbrev-commit

commit 은 보통 40 바이트 hexdecimal 로 표현되는 commit object name 으로 표현되는데, 일부만 표시해준다. 표시개수는 --abbrev=<n> 이란 옵션으로 설정할 수 있다. 보통 80 컬럼 터미널에서 가독성을 높여주기 위해서 --pretty=oneline 옵션과 함께 사용한다.


위 내용을 모두 추가해서 명령을 내리면 아래와 같은 방식으로 출력된다. 매번 이 명령을 타이핑하기 귀찮기 때문에 alias 를 이용해서 ~/.gitconfig 파일에 다음과 같이 추가한다.


~/.gitconfig

[alias]

lol = log --graph  --decorate=full --pretty=oneline --abbrev-commit


이제 git lol 을 치면 아래 그림과 같은 출력을 확인 할 수 있다.


출처 : http://stackoverflow.com/questions/1057564/pretty-git-branch-graphs

git lg1



7. git branch 이름 변경하기

git branch -m old_branch new_branch