포스트

[이제와서 시작하는 GitHub 마스터하기 - 고급편 #8] GitHub CLI: 터미널에서 GitHub 활용하기

[이제와서 시작하는 GitHub 마스터하기 - 고급편 #8] GitHub CLI: 터미널에서 GitHub 활용하기

들어가며

“이제와서 시작하는 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 마스터하기 시리즈

🌱 기초편 (입문자)

  1. GitHub 시작하기
  2. Repository 기초
  3. Git 기본 명령어
  4. Branch와 Merge
  5. Fork와 Pull Request

💼 실전편 (중급자)

  1. Issues 활용법
  2. Projects로 프로젝트 관리
  3. Code Review 잘하기
  4. GitHub Discussions
  5. Team 협업 설정
  6. GitHub Pages

🚀 고급편 (전문가)

  1. GitHub Actions 입문
  2. Actions 고급 활용
  3. Webhooks와 API
  4. GitHub Apps 개발
  5. 보안 기능
  6. GitHub Packages
  7. Codespaces
  8. [GitHub CLI] (현재 글)(/posts/github-advanced-08-github-cli/)
  9. 통계와 인사이트

🏆 심화편 (전문가+)

  1. Git Submodules & Subtree
  2. Git 내부 동작 원리
  3. 고급 브랜치 전략과 릴리스 관리
  4. GitHub GraphQL API
  5. GitHub Copilot 완벽 활용

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.