이 책을 다 읽으면 Git 명령어를 사용하는 방법을 많이 배우게 된다. 그러면 로컬 파일을 관리하거나 네트워크 너머에 있는 저장소에 연결하는 것 이상의 일들도 매우 잘 할 수 있다. Git은 CLI말고 다른 도구로도 사용할 수 있다. CLI는 Git 생태계의 한 부분일 뿐이고 터미널이 진리인 것도 아니다. 이 장에서는 다른 환경에서 Git을 어떻게 사용할 수 있는지 살펴보고 어떤 Git 애플리케이션이 있는지도 소개한다.
Git의 본진은 터미널이다. 새로운 기능은 먼저 터미널에 추가될뿐더러 애초에 Git의 모든 기능은 CLI로만 사용할 수 있다. 하지만 텍스트 세상이 늘 좋은 것도 아니고 시각적 표현이 필요할 때도 있다. 가리키고 클릭하는 것을 편하게 느끼는 사용자도 있다.
무슨 인터페이스를 사용하느냐는 중요하지 않지만, 인터페이스에 따라 Workflow도 달라져야 한다. Git의 기능을 엄선해서 제공하는 클라이언트 프로그램이 있는데 이런 도구에서는 지원하는 방법으로만 Git을 사용해야 한다. 이런 맥락으로 각 도구를 서로 비교하고 줄 세울 수 없다. 도구마다 고유의 목적이 있다. 하지만 CLI로는 뭐든 다 할 수 있다. GUI 클라이언트로 할 수 있는 일 중 CLI로 못 하는 일은 없다.
gitk
과 git-gui
Git을 설치하면 gitk
와 git-gui
도 같이 설치된다.
gitk
는 히스토리를 그래프로 보여준다.
git log
와 git grep
을 합쳐놓은 GUI 도구라고 생각하면 된다.
프로젝트 히스토리를 시각화해서 무슨 일이 있었는지 살펴볼 때 이 도구를 사용한다.
Gitk를 실행하는 방법은 쉽다.
cd
명령으로 Git 저장소 디렉토리로 이동해서 실행한다.
$
gitk[
git log options]
Gitk를 실행할 때 옵션을 주고 실행할 수 있는데 대부분 git log
의 것과 같다.
유용한 옵션으로 --all
이 있는데 HEAD의 히스토리가 아니라 저장소의 모든 커밋을 보여달라고 하는 옵션이다.
Gitk는 아래와 같이 생겼다.
gitk
히스토리 뷰어.위에 있는 히스토리는 git log --graph
의 출력과 비슷하게 생겼다. 점은 커밋을 선은 부자관계를 나타내고 색칠된 박스가 Ref다.
노란색 점은 HEAD를 빨간 점은 아직 커밋하지 변경 내역이다.
커밋을 하나 선택하면 왼쪽에 코멘트와 패치를 보여주고 오른쪽에 요약정보를 보여준다.
그리고 중간에는 히스토리를 검색하는 입력 폼이 있다.
git-gui
는 꼼꼼하게 커밋하는데 사용하는 커밋 도구다.
정말 쉽게 실행할 수 있다.
$
git gui
이 프로그램은 아래처럼 실행된다.
git-gui
.왼쪽에는 Index가 있다. 그 위에는 Unstaged 상태의 파일들이 있고 아래에는 Staged 상태의 파일이 있다. 아이콘을 클릭하면 모든 파일을 반대 상태로 옮길 수 있다. 반면 파일 이름을 선택하면 해당 파일 내용을 보여준다.
오른쪽 상단에는 선택한 파일의 변경 내용이 Diff로 보여준다. Diff에서 오른쪽 버튼을 클릭하면 해당 라인이나 해당 Hunk를 하나씩 Stage 할 수 있다.
오른쪽 하단에는 커밋 메시지와 버튼들이 있다. 텍스트 박스에 메시지를 입력하고 “Commit” 버튼을 클릭하면 git commit
을 실행한 것과 같다.
“Amend” 라디오 버튼을 선택하면 최근 커밋도 수정할 수 있다. “Staged Changes” 영역에는 마지막 커밋 내용이 표시된다.
빠트린 것을 Stage 하거나 잘못 커밋한 것을 Unstage 하고 커밋 메시지를 수정하고 나서 다시 “Commit” 버튼을 클릭하면 새 커밋으로 변경된다.
gitk
와 git-gui
는 특정 일에 맞춰진 도구다.
gitk
는 히스토리 조회용이고 git-gui
는 커밋용 도구다. 이 도구로 다른 일은 할 수 없다.
GitHub은 GitHub for Mac과 GitHub for Windows라는 Git 클라이언트를 만들었다. 이 클라이언트는 Git의 모든 기능을 지원하지 않는다. 사람들이 많이 사용하는 Workflow를 따르도록 만들었다. 어떻게 생겼는지 한번 보자.
이 두 프로그램은 거의 똑같이 생겼다. 그래서 이 둘을 한 프로그램이라고 생각하고 설명한다. 우리는 이 도구에 자세하게 설명하지 않는다. 자세한 것은 설명서를 참고하길 바란다. 아마도 “changes” 뷰를 중심으로 사용하게 될 것이라서 “changes” 뷰를 잘 소개하려고 한다.
왼쪽에 있는 것은 이 클라이언트가 추적하고 있는 저장소의 목록이다. 아래에 있는 “+” 아이콘을 클릭하면 이미 로컬에 있는 저장소를 추가하거나 새로 Clone 할 수 있다.
중앙에는 커밋을 위한 컨트롤이 있다. 메시지를 입력하고 파일을 골라서 커밋할 수 있다. 윈도 버전에서는 바로 아래 커밋 히스토리가 보여지지만 Mac 버전에서는 별도 탭에 보여진다.
오른쪽은 워킹 디렉토리 변경된 부분을 보여주는 Diff 뷰다. 커밋을 하나 선택하면 해당 커밋의 내용만 보여준다.
오른쪽 위에 있는 “Sync” 버튼을 누르면 외부 저장소와 동기화한다.
Github 계정이 없어도 이 툴을 사용할 수 있다. GitHub 서비스와 GitHub이 제안하는 Workflow에 초점을 맞춘 툴이지만 다른 호스트나 저장소에도 사용할 수 있다.
GitHub for Windows와 GitHub for Mac은 각각 https://windows.github.com와 from https://mac.github.com에서 내려받을 수 있다. 프로그램이 처음 실행되면 이름과 이메일 주소같은 설정을 하도록 안내하고 Credential Cache나 CRLF 같은 설정도 사람들이 많이 사용하는 값으로 똘똘하게 처리한다.
업데이트는 백그라운드로 다운로드하고 설치해서 늘 최신버전으로 유지한다. 번들로 포함된 Git도 업데이트하기 때문에 업데이트는 고민할 필요가 없다. GitHub for Windows는 Posh-git이 적용된 Powershell을 실행하는 단축아이콘도 만들어 준다. 이 부분은 좀 있다 설명하겠다.
저장소를 추가해보자. 이 클라이언트는 GitHub에서 접근 가능한 저장소들의 목록을 보여주고 한번에 Clone 할 수 있도록 안내한다. 이미 로컬 저장소가 있으면 간단히 Mac Finder나 Windows Explorer에서 끓어다(Drag) 놓으면 왼쪽 저장소 목록에 추가된다.
설치하고 설정을 마쳤으면 평소 Git을 사용하듯이 GitHub 클라이언트를 사용할 수 있다. 이 툴은 “GitHub 플로우”에서 설명한 “GitHub Flow”를 지원하도록 설계했다. 하지만 하는 일을 매우 단순하게 나눠보면 브랜치에 커밋하거나 리모트 저장소와 동기화 시키는 일로 나눠 볼 수 있다.
브랜치 관리는 두 버전이 조금 다르다. GitHub for Mac에서는 윈도우의 위쪽에 있는 버튼으로 브랜치를 만들 수 있다.
GitHub for Windows에서는 브랜치를 바꾸는 위젯에서 브랜치 이름을 새로 입력하면 된다.
브랜치를 만들면 즉시 커밋할 수 있다. 워킹 디렉토리에서 작업을 하고 GitHub 클라이언트로 창을 바꾸면 무엇을 수정했는지 보여준다. 커밋 메시지를 입력하고 파일을 선택하고 나서 “Commit” 버튼을 클릭하면(ctrl-enter이나 ⌘-enter) 커밋된다.
GitHub 클라이언트에서는 “Sync” 기능이 외부 저장소와 통신하는 방법이다. Git은 Push, Fetch, Merge, Rebase 각각 다른 기능이지만 GitHub 클라이언트는 “Sync”에 전부 녹여 넣었다.
git pull --rebase
.
충돌이 생기는 경우에는 git pull --no-rebase
이 실행된다.
git push
.
저장소를 동기화할 때는 이 순서대로 명령어를 실행하는 것이 일반적이다. GitHub 클라이언트에서는 한 명령으로 전부 실행해서 시간을 절약할 수 있다.
이 툴은 툴이 원하는 특정 Workflow에 적합하도록 설계했다. 개발자든 비개발자든 조금만 배우면 바로 프로젝트에 참여할 수 있다. 이 Workflow와 비슷하게 일하고 있다면 이 툴을 사용하는 것이 가장 최선이다.
Git GUI 클라이언트에는 종류가 많다. 범용으로 만들어진 것도 있고 아닌 것도 있다. Git 공식 웹사이트인 http://git-scm.com/downloads/guis에는 많이 사용하는 클라이언트를 소개한다. Git 위키 사이트에는(https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#Graphical_Interfaces) 더 많은 클라이언트가 정리돼 있다.
Visual Studio 2013 Update 1부터 Git 클라이언트가 Visual Studio에 들어갔다. Visual Studio에도 오랫동안 버전관리 기능이 들어 있었다. 이 버전관리 시스템은 Git과는 방식이 다르다. 중앙 집중식이고 파일을 잠그는 방식이다. Visual Studio 2013은 Git에 어울리는 Workflow를 따를 수 있도록 Git을 지원한다.
Git으로 관리하는 프로젝트나 git init
을 해서 새로 관리하도록 설정한 프로젝트를 열면 이 기능을 사용할 수 있다. View > Team Explorer 메뉴를 선택한다.
그럼 “Connect” 뷰를 보여주는데 아래와 같이 생겼다.
Visual Studio는 한 번 열었던 Git 프로젝트는 모두 저장해두기 때문에 하단에 있는 목록에서 찾을 수 있다. 찾는 프로젝트가 목록에 없으면 “Add” 링크를 클릭해서 워킹 디렉토리의 경로를 입력한다. 로컬 Git 저장소 중 하나를 더블 클릭하면 Home 뷰로 이동한다. Home 뷰는 Figure A-8 처럼 생겼다. Home 뷰는 일종의 Git 센터다. 코드를 작성할 때는 “Changes” 뷰에서 많은 시간을 쓸 것이고 다른 동료가 커밋한 코드를 내려받을 때는 “Unsynced Commits"이나 “Branches” 뷰를 사용하게 된다.
Visual Studio에는 Git과 연동되는 Task-focused UI도 있다. 여기에는 히스토리 뷰, Diff 뷰어, 리모트 명령어 등등의 기능이 포함된다. 이 기능에 대한 자세한 문서는 http://msdn.microsoft.com/en-us/library/hh850437.aspx에 있다.
Eclipse에는 꽤 잘 만든 Egit이라는 플러그인이 들어 있다. Perspective를 Git으로 변경하면 바로 사용할 수 있다. (메뉴에서 Window > Open > Other… > Git 순으로 선택한다)
Egit은 문서화가 잘 돼 있다. Help > Help Contents 메뉴를 통해 도움말 페이지를 열고 EGit Documentation을 선택하면 EGit 문서를 볼 수 있다.
Bash 사용자라면 평소 사용하던 패턴대로 Git을 설정해 사용할 수 있다. Git에는 쉘에 유용한 플러그인이 들어있는데 자동으로 적용되진 않는다.
먼저 Git 소스에 들어 있는 contrib/completion/git-completion.bash
을 가져다가 홈 디렉토리 어디엔가 넣는다. 그리고 .bashrc
파일에 추가한다.
. ~/git-completion.bash
이렇게 적용하고 Git 저장소에 들어가서 아래와 같이 입력한다.
$
git chec<tab>
git checkout
이라고 자동완성 된다.
Git 하위 명령어와 파라미터, 리모트, Refs까지 관련된 모든 것이 전부 자동완성된다.
게다가 프롬프트에 Git 저장소의 정보를 보여줄 수 있다.
단순하게 보여주는 것도 가능하고 꼼꼼하게 보여주는 것도 가능하다. 여기서는 사람들이 공통적으로 사용하는 현 브랜치 이름과 워킹디렉토리 상태 정보를 보여주는 것을 살펴본다.
Git 소스 저장소에서 contrib/completion/git-prompt.sh
파일을 복사해서 홈 디렉토리에 넣고 아래와 같이 .bashrc
파일에 추가한다.
. ~/git-prompt.sh
export GIT_PS1_SHOWDIRTYSTATE=1
export PS1='\w$(__git_ps1 " (%s)")\$ '
\w
는 현 워킹 디렉토리를, \$
는 $
를 출력하고, __git_ps1 " (%s)"
는 git-prompt.sh
에 있는 함수에 포맷을 아규먼트로 주고 호출하는 것이다.
이제부터는 Git 프로젝트 디렉토리에 들어가면 아래와 같이 보인다.
bash
프롬프트.여기서 소개한 두 스크립트 git-completion.bash
와 git-prompt.sh
에 대해 자세히 알고 싶으면 코드를 읽어 보는 게 좋다.
Git에는 Zsh용 탭 자동완성 스크립트도 들어 있다.
contrib/completion/git-completion.zsh
를 홈 디렉토리에 복사하고 .zshrc
에 설정(Source)한다.
Zsh은 Bash보다 더 강력하다.
$
git che<tab>check-attr -- display gitattributes information
check-ref-format -- ensure that a reference name is well formed
checkout -- checkout branch or paths to working tree
checkout-index -- copy files from index to working directory
cherry -- find commits not merged upstream
cherry-pick -- apply changes introduced by some existing commits
Zsh은 선택지가 여러 개일 때 단순히 이름만 보여주지 않는다. 간단한 설명도 함께 보여주고 탭 키로 고를 수 있다. Git 명령어만이 아니라 아규먼트도 자동완성해준다. 게다가 저장소의 리모트나 Refs같은 이름과 파일 이름 같은 것도 자동완성한다. Zsh은 아는 모든 것을 제시한다.
Zsh 프롬프트는 Bash과 많이 비슷하지만 오른쪽 프롬프트가 더 있다.
오른쪽 프롬프트에 브랜치 이름을 나오게 하려면 ~/.zshrc
파일에 아래 라인을 추가한다.
setopt prompt_subst
. ~/git-prompt.sh
export RPROMPT=$'$(__git_ps1 "%s")'
쉘에서 Git 저장소 디렉토리로 이동하면 터미널 오른쪽에 현 브랜치 이름을 아래와 같이 보여준다.
zsh
프롬프트 설정.Zsh의 강령함을 이끌어 내는 프레임워크가 있다. “oh-my-zsh"이 대표적인데 https://github.com/robbyrussell/oh-my-zsh에서 찾을 수 있다. Git 탭 자동완성도 “oh-my-zsh” 플러그인을 사용하면 되고 브랜치 이상의 정보를 보여주는 다양한 프롬프트 테마도 제공한다. Figure A-12은 프롬프트 테마를 적용한 모습이다.
윈도의 표준 CLI 터미널인 cmd.exe
는 Git을 사용하기에 별로 좋지 않다. 그래서 Powershell을 쓸 줄 안다면 Powershell을 사용하는 것이 낫다.
Posh-Git(https://github.com/dahlbyk/posh-git)이라는 프로젝트가 있어서 Tab 자동완성과 저장소 상태를 보여주는 프롬프트도 사용할 수 있다.
GitHub for Windows에는 Posh-Git이 기본으로 포함돼 있다. 그래서 설치하고 profile.ps1
파일에 아래 내용을 추가한다. 이 파일은 C:\Users\<username>\Documents\WindowsPowerShell
에 있다.
.
(
Resolve-Path
"$env:LOCALAPPDATA\GitHub\shell.ps1"
)
.
$env:github_posh_git
\
profile
.
example
.
ps1
GitHub for Windows 사용자가 아니면 https://github.com/dahlbyk/posh-git에서 Posh-Git을 내려받아 WindowsPowershell
디렉토리에 압축을 풀어 놓는다.
그리고 관리자 권한으로 Powershell 프롬프트를 열고 아래와 같이 실행한다.
>
Set-ExecutionPolicy
RemoteSigned
-Scope
CurrentUser
-Confirm
>
cd
~\
Documents
\
WindowsPowerShell
\
posh-git
>
.\
install
.
ps1
이렇게 profile.ps1
파일에 추가한 posh-git
은 프롬프트를 새로 열 때 부터 적용된다.
이 장에서는 각 환경에서 Git의 힘을 극대화하는 방법과 다양한 개발도구로 Git 저장소에 연결하는 방법을 배웠다.