toggle menu

[Git] 텍스트 기반 Git 유저 인터페이스, Tig

2016. 5. 29. 18:23 Git



들어가며

Tig 는 Jonas Fonseca 가 개발한 텍스트 기반 Git 유저 인터페이스(text-mode interface for git) 이다. 설명의 앞글자를 하나씩 따서 TIG 라는 이름을 지었을 수도 있지만, Git 을 반대로 읽었을때 Tig 이기도 해서 약간은 장난스러운 네이밍이 아니었을까 싶다.


Git 클라이언트로 유명한 프로그램으로는 아틀라시안에서 만든 SourceTree 가 있는데, 이에 비해서 Tig 는 잘 알려지지 않은 Git Client 이다.


많은 이들이 보통은 커맨드를 직접 입력하는 것을 더 선호하고 별도의 user interface 를 사용하는 것을 지양하는 편인데, 일본의 어떤 IT 회사에서는 Git을 교육할 때 Tig 활용을 적극 권장할 정도로 Tig 는 다른 도구와는 다른 장점이 있다.


짧은 시간에 높은 효율로 Git의 본질을 알 수 있다.

종속성이 적고 설치가 간단하며 빠르게 사용할 있다.

Git의 개념을 쉽게 파악할 수 있도록 화면이 구성되어 있다.

텍스트 기반이기에 원격 접속 환경에서도 로컬에서도 똑같이 사용할 수 있다.

사용이 쉽기 때문에 문턱이 낮을 뿐만 아니라 고급 사용자를 위한 커스터마이징 등이 제공된다. 


이제부터 Tig 의 설치부터 기본적인 활용법 그리고 설정까지 Tig 의 모든 것에 대해 알아보자.





Tig 설치

직접 컴파일해서 설치할 수도 있지만, 아래와 같이 패키지 매니저로 설치하는 것을 권장한다. 리눅스와 OSX 에서는 쉽게 설치가 가능하지만 윈도우의 경우 Cygwin 을 활용해야 설치가 가능하다. (추후 Windows subsystem for Linux 을 활용하면 윈도우에서도 쉽게 가능할지도..)


우분투에서 tig 설치

$ apt-get install tig


OSX에서 tig 설치

$ brew install tig




기본적인 사용 방법

언젠가 Tig Manual 을 번역하려고 했는데 강성진 (ujuc) 님이 깔끔하게 번역을 해주셨다. Tig 에 대한 전반적인 사용방법을 익히고 싶다면 매뉴얼을 한번 읽어보는 것을 추천한다. 기본적으로 Git 에 대해서 잘 알고 있다면 매뉴얼을 한번 읽어보는 것만으로도 어떻게 사용하는지 감이 오겠지만 Git 자체가 익숙하지 않다면 어렵게 느껴질 수도 있다.


Tig Manual 한글 번역



아래부터 이어지는 내용은 Git 과 Tig 에 대해 어느정도 기본적인 이해가 있다고 가정하고 있다.





Tig 설정 파일

Tig 는 .tigrc 파일을 통해 거의 모든 기능과 단축키를 커스터미이징 할 수 있고, 사용자 정의 단축키도 추가할 수 있다. 기본적으로는 tigrc 파일이 존재하지 않기 때문에 아래와 같이 직접 tigrc 파일을 생성해서 내용을 추가해주어야 한다.

$ vim ~/.tigrc



tigrc 파일에 어떤 내용을 입력할 수 있는 지는 Tig 홈페이지의 tigrc 에 대한 설명 페이지를 통해 확인하거나 터미널에서 아래와 같이 입력해서 확인할 수 있다.

$ man tigrc



Tig Gihub Repository 에는 Tig의기본 설정과 이에 대한 주석이 달린 tigrc 파일을 공개하고 있는데, 실제 설정들이 주석과 함께 있기 때문에 이 파일을 보고 변경해보면 오히려 더 빠르고 쉽게 Tig 를 커스터마이징하는 방법을 파악할 수 있다.


아래의 내용은 tigrc 기본 설정 파일의 주석을 한글로 번역한 것이다. 단, 기본 설정 중 일부는 내가 선호하는 설정으로 변경하고 내가 자주 사용하는 커맨드를 사용자 정의 단축키로 추가했기 때문에 GitHub에 공개되어 있는 파일 내용과는 설정이 약간(?) 다르다는 점에 주의해야 한다.


# Tig 기본 설정 # 'man tigrc' 를 커맨드라인에서 입력하면 전체 매뉴얼을 볼 수 있다. # 설정 # -------- # 여기에 있는 대부분의 설정들은 toggle-* 이나 옵션 메뉴(기본값은 'o' 키)를 통해 토글할 수 있다. # 뷰 설정 # # 지원되는 컬럼 유형과 옵션들: # # author # ㄴdisplay (enum) [no|full|abbreviated|email|email-user] : 작성자 정보를 표시하는가? # (예: author:display=full) # # commit-title # ㄴ display (bool) : 커밋 타이틀 표시하는가? # ㄴ graph (enum) [no|v2|v1] : 커밋 그래프를 보여주는가? (main view만 해당, 낮은 버전은 yes/no) # ㄴ refs (bool) : 브랜치와 태그, 리모트를 보여주는가? (main view만 해당) # ㄴ overflow (boolint) : 넘치는 부분에 대해 하이라이팅하는가? 활성화하면 기본값은 50이다. # (예: commit-title:display=yes,graph=yes,refs=yes,overflow=no) # # date # ㄴ display (enum) [no|default|local|relative|short] : 날짜를 보여주는가? # (예: date:display=default) # # file-name # ㄴ display (enum) [no|always|auto] : 파일명을 보여주는가? # (예: file-name:display=auto) # # file-size # ㄴ display (enum) [no|default|units] : 파일 사이즈를 보여주는가? # (예: file-size:display=default) # # id # ㄴ display (bool) : commit/tree ID를 보여주는가? # (예: id:display=yes) # # line-number # ㄴ display (bool) : 줄번호를 표시하는가? # ㄴ interval (int) : 줄번호 표시 간격. 기본값은 5 # (예: line-number:display=yes,interval=5) # # mode # ㄴ display (bool) : 파일 모드를 표시하는가? # (예: mode:display=yes) # # status # ㄴ display (enum) [no|short|long] : status label을 표시하는가? # (예: status:display=long) # # text # ㄴ display (bool) : 텍스트를 표시하는가? # ㄴ commit-title-overflow (boolint) : log view 및 diff view 에서 넘치는 부분을 하이라이팅하는가? # (예: text:display=yes) # # 모든 컬럼들은 최대 너비를 설정하기위한 width 옵션을 지원한다. 0으로 설정하면 사이즈를 자동으로 조절한다. set blame-view = date:default author:full file-name:auto id:yes,color line-number:no,interval=5 text:display=yes set grep-view = file-name:no line-number:yes,interval=1 text:display=yes set main-view = line-number:no,interval=5 id:display=yes,width=10 date:display=relative author:display=full commit-title:display=yes,graph=yes,refs=yes,overflow=no set refs-view = line-number:no id:no date:display=default author:full ref commit-title:display=yes set stash-view = line-number:no,interval=5 id:no date:default author:display=full commit-title:display=yes set status-view = line-number:no,interval=5 status:display=long file-name:display=always set tree-view = line-number:no,interval=5 mode author:full file-size date:default id:no file-name:display=always # 페이저 기반 뷰들 set pager-view = line-number:no,interval=5 text set stage-view = line-number:no,interval=5 text set log-view = line-number:no,interval=5 text set blob-view = line-number:no,interval=5 text set diff-view = line-number:no,interval=5 text:yes,commit-title-overflow=no # UI 표시 설정 set show-changes = yes # 메인 뷰에서 커밋들의 변경사항들을 표시하는가? set wrap-lines = no # 페이저 기반 뷰에서 긴 줄을 감싸는가? set tab-size = 4 # 탭을 확장할 때 몇 개의 공백을 사용하는가? set line-graphics = default # 그래프 표시방법 -> ascii, default, utf-8 # 타입 기반 레퍼런스명 포맷 # ㄴ head : 현재 HEAD. # ㄴ tag : 서명된 태그. # ㄴ local-tag : 서명되지 않은 태그. # ㄴ remote : 리모트. # ㄴ tracked-remote : 현재 HEAD에 트랙되고 있는 리모트 # ㄴ replace : 교체된 레퍼런스 # ㄴ branch : 다른 레퍼런스. # # 만약 local-tag 를 위한 포맷이 정의되지 않으면 tag 가 사용된다. # 유사하게, tracked-remote 포맷이 없으면 remote 가 사용된다. # 레퍼런스 타입을 보여주지 않으려면 hide:remote 과 같이 hide: 프리픽스를 사용하면 된다. # 포맷 문자열의 리스트 구분은 스페이스(공백)으로 한다. set reference-format = [branch] <tag> {remote} ~replace~ # Git으로 부터 어떻게 정보를 읽을지를 조절하는 설정들 set commit-order = auto # Enum: auto, default, topo, date, reverse (main view) set status-untracked-dirs = yes # 트래킹하고 있지 않은 디렉토리의 파일들도 보여주는가? (status) set ignore-space = no # Enum: no, all, some, at-eol (diff) set show-notes = yes # `--show-notes=...` 를 전달하는가? (diff) set diff-context = 6 # diff changes 를 보여줄 때 라인 수 (diff) #set diff-options = -C # `tig show` 명령을 위한 사용자 정의 옵션 (git-diff) #set blame-options = -C -C -C # `tig blame` 명령을 위한 사용자 정의 옵션 (git-blame) #set log-options = --pretty=raw # `tig log` 명령을 위한 사용자 정의 옵션 (git-log) #set main-options = -n 1000 # `tig` 명령을 위한 사용자 정의 옵션 (git-log) #set mailmap = yes # 캐노니컬 이름과 이메일 주소를 보여주기 위해 .mailmap 를 사용하는가? # Misc set refresh-mode = auto # Enum: manual, auto, after-command, periodic set refresh-interval = 1 # 리프레시 주기 (초) set ignore-case = no # 검색시 대소문자를 무시하는가? # set wrap-search = yes # 검색시에 화면의 위 아래를 감싸는가? set focus-child = yes # 하위 화면이 열리면 포커스를 이동하는가? set horizontal-scroll = 50% # 스크롤하기 위한 컬럼 수의 가로 너비 비율 set split-view-height = 70% # 위아래로 화면을 나눌 때, 아래쪽 화면의 높이 # set split-view-width = 50% # Width of right-most view for vertical splits set vertical-split = vertical # Enum: horizontal, vertical, auto; 가로 너비가 허용되면 좌우 분할로 자동 변경되게 하려면 auto 를 사용한다. set editor-line-number = yes # 에디터에 라인 번호를 자동으로 넘기는가? diff 등에서 해당 라인 위치까지 바로 이동하고 싶을 때 사용한다. set mouse = no # 마우스를 사용하도록 하는가? set mouse-scroll = 3 # 마우스로 스크롤할 때 한번에 넘길 라인수 # 사용자 정의 커맨드 (가장 유용한 부분) # ----------------------------------- # # 이 커맨드들은 Tig 안에서 바로 쉘 커맨드를 실행할 수 있게 해준다. # 별도의 규정이 없는 한, 커맨드들은 포어그라운드에서 실행되어 콘솔 출력을 함께 보여준다. # 여러개의 커맨드 옵션들을 지정할 수도 있는데, 예를 들어 "?<git commit" 와 같은 경우 실행할 지를 사용자에게 묻고 난 후, # 실행이 끝나면 Tig 를 종료시킬 것이다. (? 는 묻는 것이고, < 는 종료이므로..) # # ! 기본값으로, 커맨드를 포어그라운드에서 실행하고 결과를 보여준다. # @ 커맨드를 백그라운드에서 실행하고 결과도 보여주지 않는다. # ? 커맨드를 실행하기 전에 사용자에게 실행할지를 묻는다. # < 커맨드 실행을 마치면 Tig를 종료한다. # # # 사용자 정의 커맨드를 실행할 키를 바인드할 때는 "bind 키를-바인드할-화면 바인드할-키 커맨드" 의 순서로 선언하게 된다. # 키를 바인드할 화면은 main, diff, log, tree, blob, blame, refs, pager, help, status, stage, stash, grep 이 있고, # 모든 화면에서 바인드할 경우, generic 을 화면명으로 지정하면 된다. # 바인드할 키는 대소문자, <C-D>, ^d, <Down> 등으로 표기한다. # 사용 가능한 키 바인딩: # <Enter>, <Space>, <Backspace>, <Tab>, <Escape> 또는 <Esc>, <Left>, <Right>, <Up>, <Down>, <Insert> 또는 <Ins>, # <Delete> 또는 <Del>, <Hash>, <LessThan> 또는 <LT>, <Home>, <End>, <PageUp> 또는 <PgUp>, <PageDown> 또는 <PgDown>, # <F1>, <F2>, <F3>, <F4>, <F5>, <F6>, <F7>, <F8>, <F9>, <F10>, <F11>, <F12> # # 사용자 정의 커맨드는 Tig의 내부 상태값을 옵션으로 참조할 수 있는데, 아래와 같은 값들이 존재한다. # # %(head) : 현재 ref ID. 기본값은 HEAD. # %(commit) : 현재 커밋 ID # %(blob) : 현재 blob ID. # %(branch) : 현재 브랜치명. # %(remote) : 현재 리모트명. # %(tag) : 현재 태그명. # %(stash) : 현재 스태시(stash)명. # %(directory) : tree view 에서의 현재 디렉토리 경로. 비어있으면 루트 디렉토리. # %(file) : 현재 선택된 파일. # %(ref) : The reference given to blame or HEAD if undefined. # %(revargs) : The revision arguments passed on the command line. # %(fileargs) : The file arguments passed on the command line. # %(cmdlineargs) : All other options passed on the command line. # %(diffargs) : The diff options from `diff-options` or `TIG_DIFF_OPTS` # %(prompt) : 인자값을 입력받기 위한 프롬프트. bind main C ?git cherry-pick %(commit) # 체리픽 (해당 커밋을 현재 브랜치에 새로 커밋) bind main <Hash> !@bash -c "echo -n %(commit) | pbcopy" # 현재 커밋의 해시를 복사 bind main R ?git rebase -i %(commit) # 커밋의 순서를 재정렬하고 첨삭 bind main ! ?git rebase --abort # 리베이스를 취소 bind main L ?git pull --rebase %(remote) "%(prompt Branch name to pull : )" # 리모트에서 변경사항 가져오기 bind main P ?git push %(remote) "%(prompt Branch name to push : )" # 리모트에 변경사항 커밋 bind main <C-P> ?git push --force %(remote) "%(prompt Branch name to +push : )" # 리모트에 변경사항 강제 커밋

bind main T !git tag "%(prompt Tag name : )" %(commit) # 해당 커밋에 태그 추가 bind main <C-T> ?git push %(remote) %(tag) # 리모트에 현재 태그 커밋 bind status C !git commit # 스테이지(인덱스)에 올라간 파일 로컬에 커밋하기 bind status S ?git stash save --keep-index "%(prompt Stash name : )" # 스테이지 올라가지 않은 파일 스테시에 올리기 bind stash P ?git stash pop %(stash) # 스테시에서 꺼내오기 bind stash ! ?git stash drop %(stash) # 스테시 초기화하기 bind refs C ?git checkout %(branch) # 선택한 브랜치 체크아웃하기 bind refs B ?git branch "%(prompt Branch name to create : )" # 입력한 브랜치 생성하고 체크아웃하기 bind refs ! ?git branch -D %(branch) # 선택한 브랜치 삭제하기 # 기본 커맨드 # --------------- # 화면 전환 키 설정 bind generic m view-main bind generic d view-diff bind generic l view-log bind generic t view-tree bind generic f view-blob bind generic b view-blame bind generic r view-refs bind generic p view-pager bind generic h view-help bind generic s view-status # bind generic S view-status bind generic c view-stage # bind generic y view-stash bind generic y none # 기본 키바인딩을 제거 bind generic S view-stash bind generic g view-grep # 화면 조작 키 설정 bind generic <Enter> enter # 선택된 엔트리를 열거나 들어간다. bind generic <Down> next # 다음으로 이동한다. # bind generic <C-N> next # bind generic J next bind generic <Up> previous # 이전으로 이동한다. # bind generic <C-P> previous # bind generic K previous # bind generic , parent bind generic <Tab> view-next # 다음 뷰로 포커서를 이동 # bind generic R refresh bind generic <F5> refresh # 화면 리프레시 bind generic O maximize # 현재 화면을 전체화면으로 본다. bind generic q view-close # 현재 화면을 닫는다. bind generic Q quit # 모든 화면을 닫고 종료한다. bind generic <C-N> none # 기존 바인딩 제거 bind generic J none # 기존 바인딩 제거 bind generic <C-P> none # 기존 바인딩 제거 bind generic K none # 기존 바인딩 제거 bind generic , none # 기존 바인딩 제거 bind generic R none # 기존 바인딩 제거 bind generic <LT> none # 기존 바인딩 제거 # 커서 및 방향 키 설정 # bind generic j move-down # bind generic k move-up #bind generic 키값 move-half-page-down #bind generic 키값 move-half-page-up bind generic <PgDown> move-page-down bind generic <C-D> move-page-down bind generic <Space> move-page-down bind generic <PgUp> move-page-up bind generic <C-U> move-page-up bind generic - move-page-up bind generic <Home> move-first-line bind generic <End> move-last-line bind generic j none # 기존 바인딩 제거 bind generic k none # 기존 바인딩 제거 # 스크롤 관련 키 설정 bind generic | scroll-first-col bind generic <Left> scroll-left bind generic <Right> scroll-right bind generic <Ins> scroll-line-up # bind generic <C-Y> scroll-line-up bind generic <Del> scroll-line-down # bind generic <C-E> scroll-line-down bind generic <SBack> scroll-page-up bind generic <SFwd> scroll-page-down # 검색 관련 키 설정 bind generic / search # bind generic 키값 search-back # bind generic n find-next # bind generic N find-prev bind generic . find-next bind generic , find-prev # 검색 중 사용되는 네이게이션 키 설정 # bind search <Down> find-next # bind search <C-N> find-next # bind search <C-J> find-next # bind search <Up> find-prev # bind search <C-P> find-prev # bind search <C-K> find-prev # 옵션 조작 키 설정 bind generic o options # 옵션 메뉴 열기 # 옵션을 쉽게 끄고 켜기 위한 키 바인딩 bind generic I :toggle sort-order # 오름차순/내림차순 bind generic i :toggle sort-field # 정렬 기준 필드 bind generic <Hash> :toggle line-number # 줄번호 bind generic D :toggle date # 날짜 bind generic A :toggle author # 저작자 bind generic ~ :toggle line-graphics # 그래픽 모드 bind generic F :toggle file-name # 이름 # bind generic 키값 :toogle show-changes # 로컬 변경사항 표시 bind generic W :toggle ignore-space # diff 화면에서 공백 무시 # bind generic 키값 :toggle commit-order # 커밋 순서 정렬 bind generic X :toggle id # 커밋 ID 표시 bind generic $ :toggle commit-title-overflow # 커밋 제목 넘침 하이라이팅 # bind generic 키값 :toggle file-size # 파일 크기 형식 # bind generic 키값 :toggle status # 상태 표시 # bind generic 키값 :toggle status-untracked-dirs # 트래킹하지 않는 디렉토리의 파일 표시 # bind generic 키값 :toggle vertical-split # 좌우로 창 나누기 bind generic % :toggle file-filter # 기타 키 설정 bind generic e edit # 에디터로 편집한다. bind generic : prompt # 프롬프트를 연다. bind generic <C-L> screen-redraw # 화면을 다시 그린다. bind generic z stop-loading # 로딩을 중단한다. bind generic v show-version # Tig 버전을 표시한다. # 화면별 키 설정 bind status u status-update # 파일을 인덱스에 추가/삭제한다. bind status ! status-revert # 파일의 변경 사항을 Revert 한다. bind status M status-merge # git-mergetool(1) 을 연다. # bind status 키값 :toggle status # 짧은/긴 status label 을 표시한다. bind stage u status-update # Stage/unstage current diff (c)hunk bind stage 1 stage-update-line # Stage/unstage current line bind stage ! status-revert # Revert current diff (c)hunk bind stage \ stage-split-chunk # Split current diff (c)hunk bind stage @ :/^@@ # Jump to next (c)hunk bind stage [ :toggle diff-context -1 # Decrease the diff context bind stage ] :toggle diff-context +1 # Increase the diff context bind stage <Down> move-down bind stage <Up> move-up bind diff @ :/^@@ # Jump to next (c)hunk bind diff [ :toggle diff-context -1 bind diff ] :toggle diff-context +1 bind diff <Down> move-down bind diff <Up> move-up bind blob <Down> move-down bind blob <Up> move-up bind main G :toggle commit-title-graph # Toggle revision graph visualization bind main F :toggle commit-title-refs # Toggle reference display (tags/branches) # 색상 설정 # ------ # UI 의 색상들도 변경가능하다. 게다가 pager, blob, diff, stage 화면 요소의 색상들도 # 큰 따옴표로 감싼 텍스트 매칭으로 찾아서 새로운 색으로 지정해줄 수 있다. # # 아래와 같이 설정하면 Signed-off-by 라는 문구가 있는 줄의 색상을 글자는 노란색, # 배경은 기본색으로 지정하게 된다. # # color " Signed-off-by" yellow default # # 위에서 보면 처음에 네 칸의 공백을 두고 있는데, Git 에서 커밋 메시지에 자동으로 # 네 개의 공백을 추가하기 때문이다. # # 아래와 같이 화면의 이름을 프리픽스로 붙이면 해당 화면에만 해당하는 색상을 지정해줄 수 있다. # # color grep.file blue default # color "diff --" yellow default color "--- " yellow default color "+++ " yellow default color "@@" magenta default color "+" green default color " +" green default color "-" red default color " -" red default color "index " blue default color "old file mode " yellow default color "new file mode " yellow default color "deleted file mode " yellow default color "copy from " yellow default color "copy to " yellow default color "rename from " yellow default color "rename to " yellow default color "similarity " yellow default color "dissimilarity " yellow default color "diff-tree " blue default color "Author: " cyan default color "Commit: " magenta default color "Tagger: " magenta default color "Merge: " blue default color "Date: " yellow default color "AuthorDate: " yellow default color "CommitDate: " yellow default color "TaggerDate: " yellow default color "Refs: " red default color "Reflog: " red default color "Reflog message: " yellow default color "stash@{" magenta default color "commit " green default color "parent " blue default color "tree " blue default color "author " green default color "committer " magenta default color " Signed-off-by" yellow default color " Acked-by" yellow default color " Tested-by" yellow default color " Reviewed-by" yellow default color default default default normal color cursor white green bold color status green default color delimiter magenta default color date blue default color mode cyan default color id magenta default color overflow red default color header yellow default color section cyan default color directory yellow default color file default default color grep.file blue default color file-size default default color line-number cyan default color title-blur white blue color title-focus white blue bold color main-commit default default color main-tag magenta default bold color main-local-tag magenta default color main-remote yellow default color main-replace cyan default color main-tracked yellow default bold color main-ref cyan default color main-head cyan default bold color stat-none default default color stat-staged magenta default color stat-unstaged magenta default color stat-untracked magenta default color help-group blue default color help-action yellow default color diff-stat blue default color palette-0 magenta default color palette-1 yellow default color palette-2 cyan default color palette-3 green default color palette-4 default default color palette-5 white default color palette-6 red default # color palette-7 magenta default bold # color palette-8 yellow default bold # color palette-9 cyan default bold # color palette-10 green default bold # color palette-11 default default bold # color palette-12 white default bold # color palette-13 red default bold color graph-commit red default # color search-result black yellow # git configuration 으로부터 읽은 색상들 매핑. "no" 라고 설정하면 비활성화된다. set git-colors = \ branch.current=main-head \ branch.local=main-ref \ branch.plain=main-ref \ branch.remote=main-remote \ \ diff.meta=diff-header \ diff.meta=diff-index \ diff.meta=diff-oldmode \ diff.meta=diff-newmode \ diff.frag=diff-chunk \ diff.old=diff-del \ diff.new=diff-add \ \ grep.filename=grep.file \ grep.linenumber=grep.line-number \ grep.separator=grep.delimiter \ \ status.branch=status.header \ status.added=stat-staged \ status.updated=stat-staged \ status.changed=stat-unstaged \ status.untracked=stat-untracked


주요 화면 (main, diff, log, tree ... )마다 화면 설정과 사용자 정의 단축키 설정이 가능하다. 나는 주로 메인 화면에 사용자 정의 단축키를 많이 추가했다. Tig는 기본적으로 리모트를 위한 단축키는 존재하지 않는데, 사용자 정의 단축키 설정을 통해 리모트로 Push 하거나 Pull 할 수 있도록 설정할 수 있다.


이외에도 자주 사용하게 되는 리베이스 관련 명령이나 체리픽 등을 사용자 정의 단축키에 추가해두었다. 또 기본적으로 방향키는 Vi 의 방향키와 유사하게 설정되어 있는데 완전히 같지 않기 때문에 실제 방향키로 설정을 변경했다.


위 설정은 내가 선호하는 설정일 뿐이므로 각자 취향에 맞게 변경하거나 추가해서 사용하면 된다.




사용자 정의 커맨드 설정

사용자 정의 커맨드는 Tig에서 가장 유용한 부분이다. 사용자 정의 커맨드를 설정함으로써 Tig 안에서 바로 쉘 명령을 실행할 수 있게 해준다.


기본적으로는 포어그라운드에서 쉘 명령을 수행하지만 커맨드 옵션을 다르게 지정해줄 수 있다. 여러개의 커맨드 옵션들을 지정할 수도 있는데, 예를 들어 "?<git commit" 와 같이 앞에 ? 와 <를 추가하면, 실행할 지를 사용자에게 묻고 난 후, 실행이 끝나면 Tig 를 종료시킬 것이다. (? 는 묻는 것이고, < 는 종료이므로..)


!    기본값으로, 커맨드를 포어그라운드에서 실행하고 결과를 보여준다.

@    커맨드를 백그라운드에서 실행하고 결과도 보여주지 않는다.

?    커맨드를 실행하기 전에 사용자에게 실행할지를 묻는다.

<    커맨드 실행을 마치면 Tig를 종료한다.



사용자 정의 커맨드를 실행할 키를 바인드할 때는 "bind  화면  키  커맨드" 의 순서로 선언하게 된다. 키를 바인드할 화면은 main, diff, log, tree, blob, blame, refs, pager, help, status, stage, stash, grep 이 있고, 모든 화면에서 바인드할 경우, generic 을 화면명으로 지정하면 된다.


바인드할 키는 대소문자, <C-D>, ^d, <Down> 등으로 표기한다. 사용 가능한 키 바인딩은 아래와 같다.

<Enter>, <Space>, <Backspace>, <Tab>, <Escape> 또는 <Esc>, <Left>, <Right>, <Up>, <Down>, <Insert> 또는 <Ins>,

<Delete> 또는 <Del>, <Hash>, <LessThan> 또는 <LT>, <Home>, <End>, <PageUp> 또는 <PgUp>, <PageDown> 또는 <PgDown>,

<F1>, <F2>, <F3>, <F4>, <F5>, <F6>, <F7>, <F8>, <F9>, <F10>, <F11>, <F12>



사용자 정의 커맨드는 Tig의 내부 상태값을 옵션으로 참조할 수 있는데, 아래와 같은 값들이 존재한다.

%(head) : 현재 ref ID. 기본값은 HEAD.

%(commit) : 현재 커밋 ID

%(blob) : 현재 blob ID.

%(branch) : 현재 브랜치명.

%(remote) : 현재 리모트명.

%(tag) : 현재 태그명.

%(stash) : 현재 스태시(stash)명.

%(directory) : tree view 에서의 현재 디렉토리 경로. 비어있으면 루트 디렉토리.

%(file) : 현재 선택된 파일.

%(ref) : The reference given to blame or HEAD if undefined.

%(revargs) : The revision arguments passed on the command line.

%(fileargs) : The file arguments passed on the command line.

%(cmdlineargs) : All other options passed on the command line.

%(diffargs) : The diff options from `diff-options` or `TIG_DIFF_OPTS`

%(prompt) : 인자값을 입력받기 위한 프롬프트.



간단한 예를 살펴보자. 아래는 리모트에 변경 사항을 강제로 커밋하기 위한 단축키를 등록한 예이다.

bind main    <C-P>    ?git push --force %(remote) "%(prompt Branch name to +push : )"  # 리모트에 변경사항 강제 커밋


첫번째 항목인 bind 는 단축키를 바인딩하는 키워드이다. 두번째 항목인 main 은 main 화면에서 단축키 바인딩을 설정한다는 의미이다.

세번째 항목인 <C-P> 는 Ctrl 키와 P 키를 눌렀을 때 라는 의미이다.


메인 화면에서 Ctrl + P 키를 누르면 그 다음 네번째 항목의 내용을 실행하게 된다.

네번째 항목의 시작이 물음표(?)로 시작되는데 이는 네번째 항목을 실행하기에 앞서 실행할 것인지를 사용자에게 다시 묻는다는 의미이다.


git push ... 부터 시작되는 내용은 우리가 이미 잘 알고 있는 Git 명령어이다. Git 명령어에 포함되어야 하는 파라메터에 Tig의 내부 상태값을 지정해줄 수 있는데 여기에서는 %(remote) 를 통해 현재 리모트명이 할당된다. 브랜치명의 경우 매번 바뀔 수 있기 때문에 여기에서는 사용자 입력을 받기 위해 %(prompt) 를 활용했다.


이렇게 사용자 정의 단축키를 설정하면 main 화면에서 Ctrl + P 키를 눌렀을 때 브랜치명을 입력받아 강제 커밋을 수행할 수 있게 된다.




마치며

지금까지 텍스트 기반 Git 사용자 인터페이스인 Tig 의 사용법부터 커스터마이징까지 전체적으로 살펴보았다. 처음에는 다소 낯설게 느껴질지도 모르지만, 조금만 익숙해지면 Git 을 좀더 편리하게 활용할 수 있게 되고 나중에는 개발 환경을 세팅할 때 Git 과 함께 Tig 를 설치하는 자신을 발견할 수 있게 될 것이다.


특히, 터미널에서 키보드로 작업하는게 더 편한 개발자라면 Tig 를 한번 사용해보기를 강력 추천한다. 단축키 전체를 커스터마이징 할 수 있는 Tig 가 곧 마음에 들 것이다.


Git 관련 포스팅 더보기