Git을 처음 배울 때, 커맨드 라인에서 배워서 익숙해져있는 것도 있기도 하고, intelliJ를 쓰다보니, 내장된 Git 도구를 사용하기 때문에 UI 툴은 따로 설치하여 사용하지 않았습니다. 아 intelliJ를 사용하기 이전에는 sourceTree를 쓰기도 했었네요. GitHub 데스크탑이라는 GitHub에서 만든 툴도 있지만, 몇번 써보고는 사용하지 않았습니다. 기능이 좋고 나쁘고를 떠나서, 커맨드 라인에서 쓰는 게 딱히 불편하지 않았고, 개발하다가 다른 툴과 계속 왔다갔다하면서 작업하는게 귀찮았습니다. 그래서 intelliJ의 내장된 툴을 쓰거나, 터미널을 실행해서 커맨드 라인에서 Git을 사용하는게 편했습니다.
그런데 이런 제 마음을 GitHub에서 읽었는지, GitHub CLI( https://cli.github.com/ ) 툴이 올 초부터 베타로 운영되고 있었습니다. 처음엔 굳이 커맨드 라인툴이 필요할까 생각했지만, 커맨드 라인툴로 PR을 생성하거나 조회하거나 할 수 있다면, 브라우져 조차 띄울 필요가 없어진다면, 나름 괜찮지 않을까 싶어서 한번 살펴봤습니다.
GitHub CLI는 Issue, PR, Repository, gist 그리고 api를 이용할 수 있습니다. Git관련 명령들의 조합은 건드리지 않고, 오직 GitHub과 인터페이스 하는 역할을 합니다. 그리고 그 외에 GitHub CLI를 사용자 입맛에 맞게 사용할 수 있도록 alias, completion, config 의 기능도 있습니다.
GitHub ClI는 gh 명령으로 시작하고 뒤에 <command> <subcommand> 순으로 명령을 내립니다. 예를 들어 이슈의 상태를 조회하고 싶을 때는 이렇게 합니다.
$ gh issue status
Issues assigned to you
#8509 [Fork] Improve how Desktop handles forks (epic:fork, meta)
Issues mentioning you
#8938 [Fork] Add create fork flow entry point at commit warning (epic:fork)
#8509 [Fork] Improve how Desktop handles forks (epic:fork, meta)
Issues opened by you
#8936 [Fork] Hide PR number badges on branches that have an upstream PR (epic:fork)
#6386 Improve no editor detected state on conflicts modal (enhancement)
그럼 하나하나 살펴 보도록 하겠습니다.
Gist
gist는 생성만 가능합니다. (현재는.. ) 기존에 만들었던 gist를 수정하거나, 조회하는 기능은 아직은 없습니다.
$ gh gist create file [flags]
file은 파일 명을 직접 입력해도 되고, 비워둘 경우 표준 입력에서 입력 받을 수도 있습니다. [flag]에는 -d : gist에 대한 설명을 추가 -p 옵션을 추가하여 gist를 공개할 수 있습니다. ( 기본 설정은 비공개-private 입니다. )
Issue
GitHub에서 PR 다음으로 많이 사용하는 기능이 아닐까 싶은 Issue를 생성, 조회할 수 있는 기능입니다. Issue를 닫고, 조회하고 다시 열고 상태를 조회하고 내용을 볼 수 있는 기능을 제공합니다. ( 삭제는 제공하지 않습니다. )
# issue 닫기
$ gh issue close issue_number
# issue 생성 (옵션을 주지 않은 경우, 제목과 내용을 입력받음
$ gh issue create
? Title My new issue
? Body [(e) to launch nano, enter to skip]
# 또는 브라우져를 실행시킬 수 있음.
$ gh issue create --web
Opening https://github.com/owner/repo/issues/new in your browser.
# issue 목록 조회
$ gh issue list
Issues for owner/repo
#14 Update the remote url if it changed (bug)
#14 PR commands on a detached head (enhancement)
#13 Support for GitHub Enterprise (wontfix)
#8 Add an easier upgrade command (bug)
# 닫힌 Issue 다시 열기
$ gh issue reopen issue_number
# Issue 상태보기
$ gh issue status
Issues assigned to you
#8509 [Fork] Improve how Desktop handles forks (epic:fork, meta)
Issues mentioning you
#8938 [Fork] Add create fork flow entry point at commit warning (epic:fork)
#8509 [Fork] Improve how Desktop handles forks (epic:fork, meta)
Issues opened by you
#8936 [Fork] Hide PR number badges on branches that have an upstream PR (epic:fork)
#6386 Improve no editor detected state on conflicts modal (enhancement)
# Issue 내용 보기
gh issue view issue_number
or
gh issue view 21 --web # 브라우져에서 이슈가 열림.
코딩 중에는 Issue번호를 기록해두지 않는 다는 점에서 불편할 수 있지만, List 조회시 Issue 번호를 알 수 있으므로 두 명령을 조합해서 사용하도록 해야 할 것 같습니다.
PR
PR 명령이 좀 유용해 보이는게 몇가지 있는데, 그 중하나 checkout 입니다.
$ gh pr checkout 12
remote: Enumerating objects: 66, done.
remote: Counting objects: 100% (66/66), done.
remote: Total 83 (delta 66), reused 66 (delta 66), pack-reused 17
Unpacking objects: 100% (83/83), done.
From https://github.com/owner/repo
* [new ref] refs/pull/8896/head -> patch-2
M README.md
Switched to branch 'patch-2'
12번 pr을 체크아웃하면, 해당 브랜치의 PR 소스를 클론하게 됩니다. 현재 올라온 PR 소스를 바로 확인할 수 있어서 활용가치가 높아 보입니다.
그 외에 Issue와 동일하게 close, create, list, reopen, status, view의 기능을 제공하고,
# PR에서 변경사항 확인
$ gh pr diff pr_number
# PR 병합( 머지커밋을 어떻게 만들건지 옵션으로 지정할 수도 있음. 머지 후 브랜치는 삭제됨으로 설정되어있음 )
$ gh pr merge pr_number
# PR에 대해 리뷰승인 커멘트를 전송.
$ gh PR review pr_number --approve
REPO
리파지토리를 clone, create, fork, view 기능이 있습니다.
# GitHub clone
$ gh repo clone <repository>
# 생성 (GitHub에 리파지토리를 생성하고, remote에 설정을 추가함.
$ gh repo create my-cool-project
✓ Created repository user/my-cool-project on GitHub
✓ Added remote https://github.com/user/my-cool-project.git
# fork 생성
$ gh repo fork [<repository>]
# 리파지토리 정보 보기 . 제목 리드미, Repo URI 를 보여줍니다.
$ gh repo view [<repository>]
API
API를 하려면, URL을 생성하여 응답을 받아 파싱하고 하는 과정이 필요해서 간단한 내용 조회같은 것을 할 때도 별도의 코드를 작성하곤했습니다. 그런데 CLI에서 바로 사용할 수 있다고 하니 편리해질 것 같습니다.
# GitHub에서 리파지토리의 릴리즈를 조회. ( REST API )
$ gh api repos/:owner/:repo/releases
# GitHub에서 리파지토리의 릴리즈를 조회. ( GraphQL )
$ gh api graphql -F owner=':owner' -F name=':repo' -f query='
query($name: String!, $owner: String!) {
repository(owner: $owner, name: $name) {
releases(last: 3) {
nodes { tagName }
}
}
}
'
아직은 Beta라서 기능이 조금은 부족해 보이는데, CLI에서 간단한 조회를 한다거나, 액션을 할 때 브라우져에 접근하지 않아도 할 수 있는데, 저의 귀찮음을 줄여줄 도구 중 하나가 될 것 같은 느낌입니다.