깃허브 초보가 써보는 GitHub CLI 1.0
2020년 9월 16일 릴리즈된 GitHub 커맨드라인, GitHub CLI가 릴리즈 되었습니다. 기존 GitHub에서 하던 작업들을 커맨드라인에서 할 수 있다고 하는데, GitHub 생초짜인 제가 한 번 써보았습니다.
INSTALL
Windows, Linux, Mac에서 지원을 하며 설치 방법은 CLI에서 확인할 수 있습니다. MacOS기준으로 Homebrew나 MacPorts를 이용하여 설치가 가능합니다.
# Homebrew 인 경우
$ brew install gh
$ brew upgrade gh
# MacPorts 인 경우
$ sudo port install gh
$ sudo port selfupdate && sudo port upgrade gh
명령어는 gh
이며 현재 버전은 1.0.0입니다.
$ gh version
# output
gh version 1.0.0 (2020-09-16)
https://github.com/cli/cli/releases/tag/v1.0.0
그래서 이걸로 무엇이 가능한 걸까??
GitHub에서 하는거야.. 뭐 푸시나 풀 그게 뭐 다 아니야? 그건 Git에서 다 가능한거잖아. 그래서 이걸로 대체 뭐가 가능한건데? 라는 의문이 있었기 때문에 그것을 해결하기 위해 공식 문서에서 명령어들을 살펴보았습니다.
ADDITIONAL COMMANDS
1. Auth
깃허브의 인증 관련을 관리하는 명령어입니다.
- Login 로그인합니다.
- Logout 로그아웃합니다.
- Refresh 인증 정보를 새로고침합니다.
- Status 인증 상태를 확인합니다. —
Login
GitHub.com뿐만 아니라 GitHub Enterprise Server에도 연결이 가능하며, 토큰을 발급받거나 브라우저에서 로그인이 가능함.
# 로그인 명령어
$ gh auth login
# output
...
✓ Configured git protocol
✓ Logged in as < 계정 이름 >
Logout
# 로그아웃 명령어
$ gh auth logout
# output
? Are you sure you want to log out of github.com account < 계정 이름 >? Yes
✓ Logged out of github.com account < 계정 이름>
Refresh
# 래플래시 명령어
$ gh auth refresh
# output
✓ Authentication complete. Press Enter to continue...
Status
# 상태 명령어
$ gh auth status
# output
github.com
✓ Logged in to github.com as < 계정 이름 > (~/.config/gh/hosts.yml)
✓ Git operations for github.com configured to use https protocol.
2. Alias
gh명령어
의 알리아스 관련 명령어입니다.
- Delete 알리아스를 삭제합니다.
- List 알리아스들의 리스트를 표시합니다.
- Set 알리아스를 생성합니다.
Login
# gh alias delete <알리아스> [flags]
$ gh alias delete pv
# output
✓ Deleted alias pv; was pr view
List
$ gh alias list
# output
co: pr checkout
pv: pr view
Set
# gh alias set <알리아스> <expansion> [flags]
$ gh alias set pv 'pr view'
# output
- Adding alias for pv: pr view
✓ Added alias.
=>
# gh pr view를 gh pv로 알리아스 설정이 가능해짐.
3. API
GitHub API에 인증된 HTTP 요청을 하고 응답을 표시합니다.
$ gh api repos/:owner/:repo/releases
# output
# JSON 형식으로 응답을 받음
4. Completion
GitHub CLI 명령어에 대한 지정된 자동완성 쉘 스크립트를 생성합니다.
$ gh completion -s zsh
# output
# zsh 쉘 스크립트가 생성이 됨
5. Config
GitHub CLI 세팅들을 관리합니다.
- Get 알리아스를 삭제합니다.
- Set 알리아스들의 리스트를 표시합니다. —
Get
# git 프로토콜에 설정에 대해 표시합니다.
$ gh config get git_protocol
# output
https
Set
# git 에디터에 대해여 vim으로 설정합니다.
$ gh config set editor vim
6. Help
GitHub CLI 명령어의 도움말을 표시합니다.
# --help 옵션을 주는 것도 가능함.
$ gh help alias
# output
Aliases can be used to make shortcuts for gh commands or to compose multiple commands.
Run "gh help alias set" to learn more.
USAGE
gh alias [flags]
CORE COMMANDS
delete: Delete an alias
list: List your aliases
set: Create a shortcut for a gh command
INHERITED FLAGS
--help Show help for command
LEARN MORE
Use 'gh <command> <subcommand> --help' for more information about a command.
Read the manual at https://cli.github.com/manual
CORE COMMANDS
1. Repo
깃허브의 리포지토리를 관리하는 명령어입니다.
이 명령어를 보자마자 git과의 차이점을 느꼈는데 git으로는 당연하겠지만 깃허브의 리포지토리까지는 생성이 불가능하니까요.
- Create 새로운 리포지토리를 생성합니다.
- Clone 리포지토리를 클론합니다.
- Fork 포크를 생성합니다.
- View 리포지토리를 확인합니다.
Create
# gh-test라는 이름의 리포지토리를 생성한다.
$ gh repo create gh-test
# output
? This will create 'gh-test' in your current directory. Continue? Yes
✓ Created repository < 계정 이름 >/gh-test on GitHub
✓ Added remote https://github.com/< 계정 이름 >/gh-test.git
GitHub에 접속해보면 리포지토리가 만들어진 것을 확인할 수 있다.
Clone
# 위에서 만든 리포지토리를 로컬로 클론한다.
$ gh repo clone https://github.com/trapkka997/gh-test
# output
Cloning into 'gh-test'...
warning: You appear to have cloned an empty repository.
Fork
# 다른 리포지토리를 fork한다.
$ gh repo fork https://github.com/cli/cli
# output
✓ Created fork trapkka997/cli
? Would you like to clone the fork? Yes
...
✓ Cloned fork
View
# .git 파일이 존재하는 디렉토리에서 실행한다.
$ gh repo view
# output
리포지토리를 확인할 수 있다.
2. Gist
깃허브의 gist를 관리하는 명령어입니다.
- Create 새로운 gist를 생성합니다.
- Edit gist를 편집합니다.
- List gist들의 리스트를 표시합니다.
- View 특정한 gist를 표시합니다. —
Create
# gist-test.txt파일을 gist에 생성을 한다.
$ gh gist create gist-test.txt -d "gh-gist-test"
# output
- Creating gist gist-test.txt
✓ Created gist gist-test.txt
Gist가 생성이 되었는지 생성이 된 것을 확인할 수 있다.
Edit
# 편집 명령어
$ gh gist edit {<gist ID> | <gist URL>}
# output
편집할 수 있는 NANO같은 에디터가 표시가 됨.
List
# 리스트 명령어 * ls는 되지 않습니다.
$ gh gist list
# output
<gist ID> gh-gist-test 1 file secret about 2 minutes ago
view
# 확인 명령어
$ gh gist list {<gist id> | <gist url>}
# output
gh-gist-test
gist 테스트입니다.
3. Issue
깃허브의 issue를 관리하는 명령어입니다.
- Create 새로운 issue를 생성합니다.
- Close issue를 클로즈합니다.
- List 현재의 리포지토리에 이슈들의 리스트를 표시합니다.
- Reopen issue를 다시 open합니다.
- Status 관련된 issue의 상태를 확입니다.
- View 특정한 issue를 표시합니다. —
Create
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh issue create --title "I found a bug" --body "Nothing works"
# output
Creating issue in trapkka997/gh-test
https://github.com/trapkka997/gh-test/issues/1
이슈가 생성된 것을 확인할 수 있다.
Close
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh issue close {<number> | <url>}
# output
Closed issue #1 (I found a bug)
이슈가 클로즈 된 것을 확인할 수 있다.
List
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh issue list -s all
# output
Showing 1 of 1 issue in trapkka997/gh-test that matches your search
#1 I found a bug about 15 minutes ago
Reopen
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh issue reopen {<number> | <url>} [flags]
# output
✔ Reopened issue #1 (I found a bug)
status
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh issue status
# output
Relevant issues in trapkka997/gh-test
Issues assigned to you
There are no issues assigned to you
Issues mentioning you
There are no issues mentioning you
Issues opened by you
#1 I found a bug about 5 minutes ago
view
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh issue view {<number> | <url>} [flags]
# output
I found a bug
Open • trapkka997 opened about 44 minutes ago • 0 comments
Nothing works
View this issue on GitHub: https://github.com/trapkka997/gh-test/issues/1
4. PR
깃허브의 풀, 리퀘스트를 관리하는 명령어입니다.
- Checkout 체크아웃 합니다.
- Checks CI 상태를 표시합니다.
- Close 현재의 리포지토리에 이슈들의 리스트를 표시합니다.
- Create pr을 생성합니다.
- Diff 변화한 내용을 표시합니다.
- List pr들의 리스트를 표시합니다.
- Merge merge 합니다.
- Ready ready상태로 만듭니다.
- Reopen pr을 Reopen합니다.
- Review pr에 리뷰를 추가합니다.
- View 특정한 pr을 표시합니다. —
Checkout
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh pr checkout {<number> | <url> | <branch>} [flags]
# output
Switched to branch 'trapkka997'
Your branch is up to date with 'origin/trapkka997'.
Already up to date.
Checks
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh pr checks
# output
Close
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh pr close {<number> | <url> | <branch>} [flags]
# output
✔ Closed pull request #3 (두 번째 pr)
Create
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh pr create
# output
? Title The bug is fixed!
? Body <Received>
? What's next? Submit
https://github.com/trapkka997/gh-test/pull/2
pr이 생성된 것을 확인할 수 있다.
Diff
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh pr diff [<number> | <url> | <branch>] [flags]
# output
diff --git a/README.md b/README.md
index 3682bf3..272afa4 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# GH-TEST
+## GH-TEST
GitHub CLI
--- add ghb
\ No newline at end of file
+깃허브 CLI
List
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh pr list
# output
Showing 1 of 1 open pull request in test-gth/test-gh
#1 help this trapkka997:trapkka997
(END)
Merge
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh pr merge
# output
? What merge method would you like to use? Create a merge commit
? Delete the branch locally and on GitHub? Yes
✔ Merged pull request #2 (The bug is fixed!)
✔ Deleted branch ghb and switched to branch master
Ready
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh pr ready [<number> | <url> | <branch>] [flags]
# output
Reopen
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh pr reopen {<number> | <url>} [flags]
# output
✔ Reopened pull request #3 (두 번째 pr)
Review
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh pr review {<number> | <url>} [flags]
# output
? What kind of review do you want to give? Request changes
? Review body <Received>
Got:
이상한데요..
? Submit? Yes
+ Requested changes to pull request #4
Comment, Approve, Request Changes를 선택하여 리뷰를 남길 수 있습니다.
view
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh pr view {<number> | <url>} [flags]
# output
Open • trapkka997 wants to merge 1 commit into master from trapkka997
oops<U+FEFF>
View this pull request on GitHub: https://github.com/test-gth/test-gh/pull/1
5. Release
깃허브의 릴리즈를 관리하는 명령어입니다.
- Create 새로운 릴리즈를 생성합니다.
- Delete 릴리즈를 삭제합니다.
- Download
- List
- Upload
- view 릴리즈의 대한 정보를 표시합니다. —
Create
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh release create v1.0.1
# output
? Title (optional) Release v1.0.1 !
? Release notes Write my own
? Is this a prerelease? Yes
? Submit? Publish release
https://github.com/trapkka997/gh-test/releases/tag/v1.0.1
릴리즈가 생성된 것을 확인할 수 있다.
Delete
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh release delete <tag> [flags]
# output
Closed issue #1 (I found a bug)
Downolad
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh release download [<tag>] [flags]
# output asset이 다운로드 됨.
List
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh release list [flags]
# output
Release v1.0.1 ! Pre-release (v1.0.1) about 4 hours ago
Upload
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh release upload <tag> <files>... [flags]
# output
Successfully uploaded 1 asset to v1.0.1
View
# .git파일이 존재하는 디렉토리에서 실행한다.
$ gh release view [<tag>] [flags]
# output
v1.0.1
Pre-release • trapkka997 released this about 4 hours ago
beta
Assets
test 12 B
View on GitHub: https://github.com/trapkka997/gh-test/releases/tag/v1.0.1
결론
GitHub CLI명령어들을 하나씩 써가면서 git과의 차이점을 생각해봤는데, 써보니까 느낀게 결국 GitHub에서 제공하는 기능들, 즉 GitHub에서만 가능한 것들 전부였습니다. Git명령어로 GitHub에 있는 기능들을 쓰지 못하고, 물론 GitHub CLI명령어가 Git명령어을 대체할 수도 없고 양쪽 전부 써야하는 것을 느꼈습니다.(Git은 Git이고 GitHub는 GitHub였습니다.) CLI를 이용하여 GitHub를 다룰 수 있다는 건, GitHub도 프로그램으로 인한 자동화가 된다는 것이고 더더욱 간편해질 것이라고 생각되네요.