들어가며
“이제와서 시작하는 GitHub 마스터하기” 시리즈의 열아홉 번째 시간입니다. 이번에는 GitHub CLI(gh)를 활용하여 터미널에서 GitHub의 모든 기능을 효율적으로 사용하는 방법을 알아보겠습니다. GitHub CLI는 명령줄에서 GitHub를 완벽하게 제어할 수 있게 해주는 강력한 도구입니다.
학습 목표
- 💻 GitHub CLI 설치와 인증
- 📦 저장소 관리와 PR 작업
- 📋 Issues와 Actions 제어
- 🚀 자동화 스크립트 작성
- 🔧 확장 프로그램 활용
1. GitHub CLI 소개
GitHub CLI란?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| GitHub CLI (gh):
정의: GitHub의 공식 명령줄 인터페이스
주요 기능:
- 저장소 관리
- Pull Request 작업
- Issues 관리
- GitHub Actions 제어
- Gist 관리
- 릴리스 관리
장점:
- 브라우저 전환 불필요
- 자동화 가능
- 빠른 작업 속도
- 스크립트 통합
지원 플랫폼:
- macOS
- Windows
- Linux
|
GitHub CLI 워크플로우
flowchart LR
subgraph "GitHub Web"
W1[🌐 Browser UI]
W2[🐭 Mouse Clicks]
W3[🔄 Page Loads]
end
subgraph "GitHub CLI"
C1[💻 Terminal]
C2[⌨️ Commands]
C3[⚡ Instant]
end
W1 -->|Slow| T[Tasks]
C1 -->|Fast| T
T --> R[Results]
style W1 fill:#ffcccc
style C1 fill:#ccffcc
설치 방법
플랫폼별 설치
| 플랫폼 | 설치 방법 | 패키지 매니저 |
| 🍎 macOS | brew install gh | Homebrew |
| 🪟 Windows | winget install --id GitHub.cli | Winget |
| 🪟 Windows | scoop install gh | Scoop |
| 🐧 Ubuntu/Debian | sudo apt install gh | APT |
| 🌀 Fedora | sudo dnf install gh | DNF |
| 📦 Docker | docker run -it ghcr.io/cli/cli | Docker |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # macOS (Homebrew)
brew install gh
# Windows (Winget)
winget install --id GitHub.cli
# Windows (Scoop)
scoop install gh
# Linux (apt)
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt update
sudo apt install gh
# 버전 확인
gh --version
|
인증 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 인증 시작
gh auth login
# 대화형 프롬프트:
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations? HTTPS
? Authenticate Git with your GitHub credentials? Yes
? How would you like to authenticate GitHub CLI? Login with a web browser
# 토큰으로 인증
gh auth login --with-token < mytoken.txt
# 인증 상태 확인
gh auth status
# 인증 정보 새로고침
gh auth refresh
# 로그아웃
gh auth logout
|
2. 저장소 작업
저장소 생성 및 클론
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # 새 저장소 생성
gh repo create my-project --public --description "My awesome project"
# 대화형으로 생성
gh repo create
# 템플릿에서 생성
gh repo create my-app --template owner/template-repo
# .gitignore와 라이선스 포함
gh repo create my-project --public --gitignore Node --license MIT
# 로컬 프로젝트를 GitHub에 푸시
gh repo create my-project --source . --public --push
# 저장소 클론
gh repo clone owner/repo
# Fork 생성
gh repo fork owner/repo --clone
# 브라우저에서 열기
gh repo view --web
|
저장소 정보 및 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 저장소 정보 보기
gh repo view owner/repo
# JSON 형식으로 출력
gh repo view owner/repo --json name,description,url
# 저장소 목록
gh repo list owner --limit 10
# 저장소 설정 변경
gh repo edit --description "Updated description" --homepage "https://example.com"
# 토픽 추가
gh repo edit --add-topic docker,kubernetes
# 저장소 아카이브
gh repo archive owner/repo
# 저장소 삭제 (주의!)
gh repo delete owner/repo --confirm
|
3. Pull Request 작업
PR 워크플로우 다이어그램
stateDiagram-v2
[*] --> 브랜치생성: git checkout -b
브랜치생성 --> 코드수정: 편집
코드수정 --> 커밋: git commit
커밋 --> 푸시: git push
푸시 --> PR생성: gh pr create
PR생성 --> 리뷰대기: 팀원 할당
리뷰대기 --> 리뷰완료: gh pr review
리뷰완료 --> 병합: gh pr merge
병합 --> [*]
리뷰대기 --> 수정요청: 변경 필요
수정요청 --> 코드수정: 피드백 반영
PR 생성 및 관리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # 현재 브랜치에서 PR 생성
gh pr create
# 제목과 본문 지정
gh pr create --title "Add new feature" --body "This PR adds..."
# 템플릿 사용
gh pr create --template bug_fix.md
# 드래프트 PR 생성
gh pr create --draft
# 특정 리뷰어 지정
gh pr create --reviewer user1,user2 --assignee @me
# 레이블 추가
gh pr create --label bug,urgent
# 마일스톤 지정
gh pr create --milestone v2.0
# 베이스 브랜치 지정
gh pr create --base develop
|
PR 조회 및 검토
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # PR 목록 보기
gh pr list
# 특정 상태의 PR만 보기
gh pr list --state open
gh pr list --state closed
gh pr list --state merged
# 필터링
gh pr list --author @me
gh pr list --assignee @me
gh pr list --label bug
gh pr list --search "fix"
# PR 상세 정보
gh pr view 123
gh pr view --comments
# PR 체크아웃
gh pr checkout 123
# 브라우저에서 PR 열기
gh pr view 123 --web
|
PR 리뷰 및 병합
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| # PR 리뷰
gh pr review 123 --approve
gh pr review 123 --comment -b "Looks good!"
gh pr review 123 --request-changes -b "Please fix..."
# 코멘트 추가
gh pr comment 123 --body "Thanks for the PR!"
# PR 상태 변경
gh pr ready 123 # 드래프트에서 ready로
gh pr close 123
gh pr reopen 123
# PR 병합
gh pr merge 123
gh pr merge 123 --squash
gh pr merge 123 --rebase
gh pr merge 123 --merge
# 자동 병합
gh pr merge 123 --auto --squash
# 병합 후 브랜치 삭제
gh pr merge 123 --delete-branch
|
4. Issues 관리
Issue 생성 및 편집
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 새 이슈 생성
gh issue create
# 제목과 본문 지정
gh issue create --title "Bug: Application crashes" --body "Steps to reproduce..."
# 템플릿 사용
gh issue create --template bug_report.md
# 레이블과 담당자 지정
gh issue create --label bug,high-priority --assignee @me
# 프로젝트에 추가
gh issue create --project "Sprint 1"
# 이슈 편집
gh issue edit 123 --title "Updated title"
gh issue edit 123 --add-label "urgent"
gh issue edit 123 --remove-label "low-priority"
gh issue edit 123 --add-assignee user1,user2
|
Issue 조회 및 관리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| # 이슈 목록
gh issue list
gh issue list --state open
gh issue list --state closed
# 필터링
gh issue list --author @me
gh issue list --assignee @me
gh issue list --label bug
gh issue list --milestone "v1.0"
gh issue list --search "memory leak"
# 이슈 상세 정보
gh issue view 123
gh issue view 123 --comments
# 이슈 상태 변경
gh issue close 123
gh issue reopen 123
# 이슈에 코멘트
gh issue comment 123 --body "Working on this!"
# 이슈 전송 (다른 저장소로)
gh issue transfer 123 owner/other-repo
|
5. GitHub Actions 제어
워크플로우 관리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 워크플로우 목록
gh workflow list
# 워크플로우 실행
gh workflow run build.yml
gh workflow run deploy.yml --ref main
# 입력 매개변수와 함께 실행
gh workflow run deploy.yml -f environment=production -f version=1.2.3
# 워크플로우 비활성화/활성화
gh workflow disable build.yml
gh workflow enable build.yml
# 워크플로우 보기
gh workflow view build.yml
|
실행 내역 관리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| # 실행 목록
gh run list
gh run list --workflow=build.yml
gh run list --status=failure
# 실행 상세 정보
gh run view 123456
# 실행 로그 보기
gh run view 123456 --log
gh run view 123456 --log-failed
# 실행 다시 시도
gh run rerun 123456
gh run rerun 123456 --failed
# 실행 취소
gh run cancel 123456
# 아티팩트 다운로드
gh run download 123456
gh run download 123456 --name build-artifact
# 실행 삭제
gh run delete 123456
|
6. 릴리스 관리
릴리스 생성 및 관리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| # 릴리스 생성
gh release create v1.0.0 --title "Version 1.0.0" --notes "First stable release"
# 파일 첨부
gh release create v1.0.0 ./dist/*.zip --title "Release v1.0.0"
# 릴리스 노트 자동 생성
gh release create v1.0.0 --generate-notes
# 프리릴리스 생성
gh release create v2.0.0-beta.1 --prerelease
# 드래프트 릴리스
gh release create v1.0.0 --draft
# 특정 커밋에서 릴리스
gh release create v1.0.0 --target commit-sha
# 릴리스 목록
gh release list
gh release list --exclude-drafts
# 릴리스 보기
gh release view v1.0.0
# 릴리스 편집
gh release edit v1.0.0 --title "Updated Title"
# 릴리스 삭제
gh release delete v1.0.0 --yes
# 릴리스 다운로드
gh release download v1.0.0
gh release download v1.0.0 --pattern "*.tar.gz"
|
7. Gist 작업
Gist 생성 및 관리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| # 파일에서 Gist 생성
gh gist create file.txt
# 여러 파일로 Gist 생성
gh gist create file1.js file2.py
# 공개 Gist 생성
gh gist create --public file.txt
# 설명 추가
gh gist create file.txt --desc "My code snippet"
# 표준 입력에서 생성
echo "Hello World" | gh gist create
# Gist 목록
gh gist list
gh gist list --public
gh gist list --secret
# Gist 보기
gh gist view GIST_ID
# Gist 편집
gh gist edit GIST_ID
# Gist 삭제
gh gist delete GIST_ID
# Gist 클론
gh gist clone GIST_ID
|
8. 고급 사용법
생산성 향상 팁
graph TB
subgraph "Productivity Tips"
A[🎯 Aliases<br/>명령어 단축]
B[🔄 Scripts<br/>자동화]
C[🔌 API<br/>Direct Access]
D[🧩 Extensions<br/>확장 기능]
end
A --> E[🚀 Faster Workflow]
B --> E
C --> E
D --> E
별칭(Alias) 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 별칭 생성
gh alias set pv 'pr view'
gh alias set prc 'pr create'
gh alias set prm 'pr merge'
gh alias set co 'pr checkout'
# 복잡한 별칭
gh alias set mypr 'pr list --author @me --state open'
gh alias set review-requests 'pr list --search "review-requested:@me"'
# 별칭 목록
gh alias list
# 별칭 삭제
gh alias delete pv
|
API 호출
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| # REST API 호출
gh api /repos/:owner/:repo/issues
gh api /user/repos --paginate
# GraphQL 쿼리
gh api graphql -f query='
query($owner: String!, $name: String!) {
repository(owner: $owner, name: $name) {
stargazerCount
forkCount
}
}
' -f owner='cli' -f name='cli'
# POST 요청
gh api repos/:owner/:repo/issues \
--method POST \
--field title="New Issue" \
--field body="Issue description"
# 헤더 추가
gh api /user --header "Accept: application/vnd.github.v3+json"
# 응답을 파일로 저장
gh api /repos/:owner/:repo/releases/latest > latest-release.json
|
확장 프로그램
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 확장 프로그램 검색
gh extension search
# 확장 프로그램 설치
gh extension install owner/gh-extension
# 설치된 확장 프로그램 목록
gh extension list
# 확장 프로그램 업그레이드
gh extension upgrade gh-extension
gh extension upgrade --all
# 확장 프로그램 제거
gh extension remove gh-extension
# 인기 있는 확장 프로그램들
gh extension install github/gh-copilot
gh extension install dlvhdr/gh-dash
gh extension install mislav/gh-branch
|
9. 자동화 스크립트
PR 자동화 스크립트
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #!/bin/bash
# auto-pr.sh - 자동 PR 생성 스크립트
# 브랜치 생성 및 체크아웃
git checkout -b feature/auto-update
git add .
git commit -m "Automated update"
git push -u origin feature/auto-update
# PR 생성
gh pr create \
--title "Automated Update $(date +%Y-%m-%d)" \
--body "This PR was created automatically by the update script." \
--label "automated" \
--reviewer team-lead \
--assignee @me
# 체크 통과 대기
gh pr checks --watch
# 자동 병합 (체크 통과 시)
gh pr merge --auto --squash
|
이슈 관리 스크립트
1
2
3
4
5
6
7
8
9
10
11
12
13
| #!/bin/bash
# issue-triage.sh - 이슈 자동 분류
# 오래된 이슈에 레이블 추가
gh issue list --state open --json number,createdAt --jq '.[] | select((now - (.createdAt | fromdateiso8601)) > (30 * 24 * 60 * 60)) | .number' | while read -r issue; do
echo "Adding 'stale' label to issue #$issue"
gh issue edit "$issue" --add-label "stale"
done
# 특정 키워드가 있는 이슈 자동 할당
gh issue list --state open --search "bug" --json number --jq '.[].number' | while read -r issue; do
gh issue edit "$issue" --add-assignee bug-team
done
|
릴리스 자동화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #!/bin/bash
# auto-release.sh - 자동 릴리스 스크립트
# 버전 태그 생성
VERSION="v$(date +%Y.%m.%d)"
git tag -a "$VERSION" -m "Release $VERSION"
git push origin "$VERSION"
# 변경 로그 생성
CHANGELOG=$(git log --pretty=format:"- %s" $(git describe --tags --abbrev=0 HEAD^)..HEAD)
# 릴리스 생성
gh release create "$VERSION" \
--title "Release $VERSION" \
--notes "$CHANGELOG" \
--generate-notes \
./dist/*
# Slack 알림 (웹훅 사용)
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"New release $VERSION published!\"}" \
$SLACK_WEBHOOK_URL
|
10. 팁과 트릭
GitHub CLI 베스트 프랙티스
| 팜 | 설명 | 예시 |
| 🎯 별칭 활용 | 자주 사용하는 명령어 단축 | gh alias set co 'pr checkout' |
| 🔍 필터링 | JSON + jq로 원하는 데이터만 추출 | gh pr list --json number,title --jq '.[]' |
| 🔄 자동화 | 반복 작업 스크립트화 | Shell scripts with gh commands |
| 📦 확장 | 커뮤니티 확장 프로그램 설치 | gh extension install |
| 🌐 API 활용 | REST/GraphQL 직접 호출 | gh api |
효율적인 작업 흐름
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 1. 일일 작업 시작
alias daily='gh pr list --author @me && gh issue list --assignee @me'
# 2. PR 빠른 리뷰
alias quick-review='gh pr list --search "review-requested:@me" | head -5'
# 3. 브랜치 정리
gh pr list --state merged --author @me --json headRefName -q '.[].headRefName' | xargs -I {} git push origin :{}
# 4. 이슈를 PR로 연결
gh pr create --body "Fixes #123"
# 5. 여러 저장소 관리
for repo in repo1 repo2 repo3; do
echo "=== $repo ==="
gh pr list --repo owner/$repo
done
|
설정 및 환경 변수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 기본 편집기 설정
gh config set editor vim
# 기본 브라우저 설정
gh config set browser firefox
# Git 프로토콜 설정
gh config set git_protocol ssh
# 프롬프트 비활성화 (스크립트용)
gh config set prompt disabled
# 환경 변수
export GH_TOKEN="your-token"
export GH_HOST="github.enterprise.com"
export GH_REPO="owner/repo"
export GH_BROWSER="chrome"
|
출력 포맷팅
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # JSON 출력
gh pr list --json number,title,author
# JQ로 필터링
gh pr list --json number,title,author --jq '.[] | select(.author.login == "user1")'
# 테이블 형식
gh pr list --limit 5
# 템플릿 사용
gh pr list --template '{{range .}}{{.number}} {{.title}}{{"\n"}}{{end}}'
# CSV 출력
gh issue list --json number,title,state --jq '.[] | [.number, .title, .state] | @csv'
|
11. 문제 해결
트러블슈팅 체크리스트
flowchart TD
A[문제 발생] --> B{어떤 종류?}
B -->|인증| C[gh auth status]
C --> D[gh auth refresh]
B -->|권한| E[토큰 스코프 확인]
E --> F[gh auth refresh -s scope]
B -->|네트워크| G[프록시 설정]
G --> H[HTTP_PROXY 환경변수]
B -->|성능| I[--limit 옵션]
I --> J[--json 필드 선택]
일반적인 문제들
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| 인증 문제:
- gh auth status로 상태 확인
- gh auth refresh로 토큰 갱신
- ~/.config/gh/hosts.yml 확인
권한 문제:
- 토큰 스코프 확인
- gh auth refresh -s "repo,workflow" 로 스코프 추가
프록시 설정:
export HTTP_PROXY=http://proxy.company.com:8080
export HTTPS_PROXY=http://proxy.company.com:8080
Enterprise 서버:
gh auth login --hostname github.company.com
느린 응답:
- --limit 옵션으로 결과 제한
- --json으로 필요한 필드만 요청
|
마무리
GitHub CLI는 개발자의 생산성을 크게 향상시키는 강력한 도구입니다.
핵심 포인트 정리
| 특징 | 설명 | 효과 |
| 💻 CLI 중심 | 터미널에서 모든 작업 | 브라우저 전환 불필요 |
| 🚀 자동화 | 스크립트와 통합 | 반복 작업 제거 |
| ⚡ 속도 | 명령어로 즉시 실행 | 시간 절약 |
| 🔧 확장성 | 확장 프로그램 지원 | 기능 무한 확장 |
| 🌐 API 통합 | REST/GraphQL 직접 호출 | 고급 기능 구현 |
추천 워크플로우
1
2
3
4
5
6
7
8
9
10
11
| # 1. 아침 루틴
alias morning='gh pr list --author @me && gh issue list --assignee @me'
# 2. PR 작업
gh pr create && gh pr merge --auto
# 3. 이슈 관리
gh issue create --template bug.md && gh issue close
# 4. 릴리스
gh release create --generate-notes
|
브라우저와 터미널을 오가며 시간을 낭비하지 마세요. GitHub CLI로 모든 작업을 터미널에서 완료하세요!
다음 편에서는 GitHub의 통계와 인사이트 기능을 활용하는 방법에 대해 알아보겠습니다.
📚 GitHub 마스터하기 시리즈
🌱 기초편 (입문자)
- GitHub 시작하기
- Repository 기초
- Git 기본 명령어
- Branch와 Merge
- Fork와 Pull Request
💼 실전편 (중급자)
- Issues 활용법
- Projects로 프로젝트 관리
- Code Review 잘하기
- GitHub Discussions
- Team 협업 설정
- GitHub Pages
🚀 고급편 (전문가)
- GitHub Actions 입문
- Actions 고급 활용
- Webhooks와 API
- GitHub Apps 개발
- 보안 기능
- GitHub Packages
- Codespaces
- [GitHub CLI] (현재 글)(/posts/github-advanced-08-github-cli/)
- 통계와 인사이트
🏆 심화편 (전문가+)
- Git Submodules & Subtree
- Git 내부 동작 원리
- 고급 브랜치 전략과 릴리스 관리
- GitHub GraphQL API
-