GitHub CLI (gh)
Comprehensive reference for GitHub CLI (gh) - work seamlessly with GitHub from the command line.
Version: 2.85.0 (current as of January 2026)
Prerequisites
Installation
macOS
brew install gh
Linux
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
Windows
winget install --id GitHub.cli
Verify installation
gh --version
Authentication
Interactive login (default: github.com)
gh auth login
Login with specific hostname
gh auth login --hostname enterprise.internal
Login with token
gh auth login --with-token < mytoken.txt
Check authentication status
gh auth status
Switch accounts
gh auth switch --hostname github.com --user username
Logout
gh auth logout --hostname github.com --user username
Setup Git Integration
Configure git to use gh as credential helper
gh auth setup-git
View active token
gh auth token
Refresh authentication scopes
gh auth refresh --scopes write:org,read:public_key
CLI Structure
gh # Root command ├── auth # Authentication │ ├── login │ ├── logout │ ├── refresh │ ├── setup-git │ ├── status │ ├── switch │ └── token ├── browse # Open in browser ├── codespace # GitHub Codespaces │ ├── code │ ├── cp │ ├── create │ ├── delete │ ├── edit │ ├── jupyter │ ├── list │ ├── logs │ ├── ports │ ├── rebuild │ ├── ssh │ ├── stop │ └── view ├── gist # Gists │ ├── clone │ ├── create │ ├── delete │ ├── edit │ ├── list │ ├── rename │ └── view ├── issue # Issues │ ├── create │ ├── list │ ├── status │ ├── close │ ├── comment │ ├── delete │ ├── develop │ ├── edit │ ├── lock │ ├── pin │ ├── reopen │ ├── transfer │ ├── unlock │ └── view ├── org # Organizations │ └── list ├── pr # Pull Requests │ ├── create │ ├── list │ ├── status │ ├── checkout │ ├── checks │ ├── close │ ├── comment │ ├── diff │ ├── edit │ ├── lock │ ├── merge │ ├── ready │ ├── reopen │ ├── revert │ ├── review │ ├── unlock │ ├── update-branch │ └── view ├── project # Projects │ ├── close │ ├── copy │ ├── create │ ├── delete │ ├── edit │ ├── field-create │ ├── field-delete │ ├── field-list │ ├── item-add │ ├── item-archive │ ├── item-create │ ├── item-delete │ ├── item-edit │ ├── item-list │ ├── link │ ├── list │ ├── mark-template │ ├── unlink │ └── view ├── release # Releases │ ├── create │ ├── list │ ├── delete │ ├── delete-asset │ ├── download │ ├── edit │ ├── upload │ ├── verify │ ├── verify-asset │ └── view ├── repo # Repositories │ ├── create │ ├── list │ ├── archive │ ├── autolink │ ├── clone │ ├── delete │ ├── deploy-key │ ├── edit │ ├── fork │ ├── gitignore │ ├── license │ ├── rename │ ├── set-default │ ├── sync │ ├── unarchive │ └── view ├── cache # Actions caches │ ├── delete │ └── list ├── run # Workflow runs │ ├── cancel │ ├── delete │ ├── download │ ├── list │ ├── rerun │ ├── view │ └── watch ├── workflow # Workflows │ ├── disable │ ├── enable │ ├── list │ ├── run │ └── view ├── agent-task # Agent tasks ├── alias # Command aliases │ ├── delete │ ├── import │ ├── list │ └── set ├── api # API requests ├── attestation # Artifact attestations │ ├── download │ ├── trusted-root │ └── verify ├── completion # Shell completion ├── config # Configuration │ ├── clear-cache │ ├── get │ ├── list │ └── set ├── extension # Extensions │ ├── browse │ ├── create │ ├── exec │ ├── install │ ├── list │ ├── remove │ ├── search │ └── upgrade ├── gpg-key # GPG keys │ ├── add │ ├── delete │ └── list ├── label # Labels │ ├── clone │ ├── create │ ├── delete │ ├── edit │ └── list ├── preview # Preview features ├── ruleset # Rulesets │ ├── check │ ├── list │ └── view ├── search # Search │ ├── code │ ├── commits │ ├── issues │ ├── prs │ └── repos ├── secret # Secrets │ ├── delete │ ├── list │ └── set ├── ssh-key # SSH keys │ ├── add │ ├── delete │ └── list ├── status # Status overview └── variable # Variables ├── delete ├── get ├── list └── set
Configuration
Global Configuration
List all configuration
gh config list
Get specific configuration value
gh config list git_protocol gh config get editor
Set configuration value
gh config set editor vim gh config set git_protocol ssh gh config set prompt disabled gh config set pager "less -R"
Clear configuration cache
gh config clear-cache
Environment Variables
GitHub token (for automation)
export GH_TOKEN=ghp_xxxxxxxxxxxx
GitHub hostname
export GH_HOST=github.com
Disable prompts
export GH_PROMPT_DISABLED=true
Custom editor
export GH_EDITOR=vim
Custom pager
export GH_PAGER=less
HTTP timeout
export GH_TIMEOUT=30
Custom repository (override default)
export GH_REPO=owner/repo
Custom git protocol
export GH_ENTERPRISE_HOSTNAME=hostname
Authentication (gh auth)
Login
Interactive login
gh auth login
Web-based authentication
gh auth login --web
With clipboard for OAuth code
gh auth login --web --clipboard
With specific git protocol
gh auth login --git-protocol ssh
With custom hostname (GitHub Enterprise)
gh auth login --hostname enterprise.internal
Login with token from stdin
gh auth login --with-token < token.txt
Insecure storage (plain text)
gh auth login --insecure-storage
Status
Show all authentication status
gh auth status
Show active account only
gh auth status --active
Show specific hostname
gh auth status --hostname github.com
Show token in output
gh auth status --show-token
JSON output
gh auth status --json hosts
Filter with jq
gh auth status --json hosts --jq '.hosts | add'
Switch Accounts
Interactive switch
gh auth switch
Switch to specific user/host
gh auth switch --hostname github.com --user monalisa
Token
Print authentication token
gh auth token
Token for specific host/user
gh auth token --hostname github.com --user monalisa
Refresh
Refresh credentials
gh auth refresh
Add scopes
gh auth refresh --scopes write:org,read:public_key
Remove scopes
gh auth refresh --remove-scopes delete_repo
Reset to default scopes
gh auth refresh --reset-scopes
With clipboard
gh auth refresh --clipboard
Setup Git
Setup git credential helper
gh auth setup-git
Setup for specific host
gh auth setup-git --hostname enterprise.internal
Force setup even if host not known
gh auth setup-git --hostname enterprise.internal --force
Browse (gh browse)
Open repository in browser
gh browse
Open specific path
gh browse script/ gh browse main.go:312
Open issue or PR
gh browse 123
Open commit
gh browse 77507cd94ccafcf568f8560cfecde965fcfa63
Open with specific branch
gh browse main.go --branch bug-fix
Open different repository
gh browse --repo owner/repo
Open specific pages
gh browse --actions # Actions tab gh browse --projects # Projects tab gh browse --releases # Releases tab gh browse --settings # Settings page gh browse --wiki # Wiki page
Print URL instead of opening
gh browse --no-browser
Repositories (gh repo)
Create Repository
Create new repository
gh repo create my-repo
Create with description
gh repo create my-repo --description "My awesome project"
Create public repository
gh repo create my-repo --public
Create private repository
gh repo create my-repo --private
Create with homepage
gh repo create my-repo --homepage https://example.com
Create with license
gh repo create my-repo --license mit
Create with gitignore
gh repo create my-repo --gitignore python
Initialize as template repository
gh repo create my-repo --template
Create repository in organization
gh repo create org/my-repo
Create without cloning locally
gh repo create my-repo --source=.
Disable issues
gh repo create my-repo --disable-issues
Disable wiki
gh repo create my-repo --disable-wiki
Clone Repository
Clone repository
gh repo clone owner/repo
Clone to specific directory
gh repo clone owner/repo my-directory
Clone with different branch
gh repo clone owner/repo --branch develop
List Repositories
List all repositories
gh repo list
List repositories for owner
gh repo list owner
Limit results
gh repo list --limit 50
Public repositories only
gh repo list --public
Source repositories only (not forks)
gh repo list --source
JSON output
gh repo list --json name,visibility,owner
Table output
gh repo list --limit 100 | tail -n +2
Filter with jq
gh repo list --json name --jq '.[].name'
View Repository
View repository details
gh repo view
View specific repository
gh repo view owner/repo
JSON output
gh repo view --json name,description,defaultBranchRef
View in browser
gh repo view --web
Edit Repository
Edit description
gh repo edit --description "New description"
Set homepage
gh repo edit --homepage https://example.com
Change visibility
gh repo edit --visibility private gh repo edit --visibility public
Enable/disable features
gh repo edit --enable-issues gh repo edit --disable-issues gh repo edit --enable-wiki gh repo edit --disable-wiki gh repo edit --enable-projects gh repo edit --disable-projects
Set default branch
gh repo edit --default-branch main
Rename repository
gh repo rename new-name
Archive repository
gh repo archive gh repo unarchive
Delete Repository
Delete repository
gh repo delete owner/repo
Confirm without prompt
gh repo delete owner/repo --yes
Fork Repository
Fork repository
gh repo fork owner/repo
Fork to organization
gh repo fork owner/repo --org org-name
Clone after forking
gh repo fork owner/repo --clone
Remote name for fork
gh repo fork owner/repo --remote-name upstream
Sync Fork
Sync fork with upstream
gh repo sync
Sync specific branch
gh repo sync --branch feature
Force sync
gh repo sync --force
Set Default Repository
Set default repository for current directory
gh repo set-default
Set default explicitly
gh repo set-default owner/repo
Unset default
gh repo set-default --unset
Repository Autolinks
List autolinks
gh repo autolink list
Add autolink
gh repo autolink add
--key-prefix JIRA-
--url-template https://jira.example.com/browse/<num>
Delete autolink
gh repo autolink delete 12345
Repository Deploy Keys
List deploy keys
gh repo deploy-key list
Add deploy key
gh repo deploy-key add ~/.ssh/id_rsa.pub
--title "Production server"
--read-only
Delete deploy key
gh repo deploy-key delete 12345
Gitignore and License
View gitignore template
gh repo gitignore
View license template
gh repo license mit
License with full name
gh repo license mit --fullname "John Doe"
Issues (gh issue)
Create Issue
Create issue interactively
gh issue create
Create with title
gh issue create --title "Bug: Login not working"
Create with title and body
gh issue create
--title "Bug: Login not working"
--body "Steps to reproduce..."
Create with body from file
gh issue create --body-file issue.md
Create with labels
gh issue create --title "Fix bug" --labels bug,high-priority
Create with assignees
gh issue create --title "Fix bug" --assignee user1,user2
Create in specific repository
gh issue create --repo owner/repo --title "Issue title"
Create issue from web
gh issue create --web
List Issues
List all open issues
gh issue list
List all issues (including closed)
gh issue list --state all
List closed issues
gh issue list --state closed
Limit results
gh issue list --limit 50
Filter by assignee
gh issue list --assignee username gh issue list --assignee @me
Filter by labels
gh issue list --labels bug,enhancement
Filter by milestone
gh issue list --milestone "v1.0"
Search/filter
gh issue list --search "is:open is:issue label:bug"
JSON output
gh issue list --json number,title,state,author
Table view
gh issue list --json number,title,labels --jq '.[] | [.number, .title, .labels[].name] | @tsv'
Show comments count
gh issue list --json number,title,comments --jq '.[] | [.number, .title, .comments]'
Sort by
gh issue list --sort created --order desc
View Issue
View issue
gh issue view 123
View with comments
gh issue view 123 --comments
View in browser
gh issue view 123 --web
JSON output
gh issue view 123 --json title,body,state,labels,comments
View specific fields
gh issue view 123 --json title --jq '.title'
Edit Issue
Edit interactively
gh issue edit 123
Edit title
gh issue edit 123 --title "New title"
Edit body
gh issue edit 123 --body "New description"
Add labels
gh issue edit 123 --add-label bug,high-priority
Remove labels
gh issue edit 123 --remove-label stale
Add assignees
gh issue edit 123 --add-assignee user1,user2
Remove assignees
gh issue edit 123 --remove-assignee user1
Set milestone
gh issue edit 123 --milestone "v1.0"
Close/Reopen Issue
Close issue
gh issue close 123
Close with comment
gh issue close 123 --comment "Fixed in PR #456"
Reopen issue
gh issue reopen 123
Comment on Issue
Add comment
gh issue comment 123 --body "This looks good!"
Edit comment
gh issue comment 123 --edit 456789 --body "Updated comment"
Delete comment
gh issue comment 123 --delete 456789
Issue Status
Show issue status summary
gh issue status
Status for specific repository
gh issue status --repo owner/repo
Pin/Unpin Issues
Pin issue (pinned to repo dashboard)
gh issue pin 123
Unpin issue
gh issue unpin 123
Lock/Unlock Issue
Lock conversation
gh issue lock 123
Lock with reason
gh issue lock 123 --reason off-topic
Unlock
gh issue unlock 123
Transfer Issue
Transfer to another repository
gh issue transfer 123 --repo owner/new-repo
Delete Issue
Delete issue
gh issue delete 123
Confirm without prompt
gh issue delete 123 --yes
Develop Issue (Draft PR)
Create draft PR from issue
gh issue develop 123
Create in specific branch
gh issue develop 123 --branch fix/issue-123
Create with base branch
gh issue develop 123 --base main
Pull Requests (gh pr)
Create Pull Request
Create PR interactively
gh pr create
Create with title
gh pr create --title "Feature: Add new functionality"
Create with title and body
gh pr create
--title "Feature: Add new functionality"
--body "This PR adds..."
Fill body from template
gh pr create --body-file .github/PULL_REQUEST_TEMPLATE.md
Set base branch
gh pr create --base main
Set head branch (default: current branch)
gh pr create --head feature-branch
Create draft PR
gh pr create --draft
Add assignees
gh pr create --assignee user1,user2
Add reviewers
gh pr create --reviewer user1,user2
Add labels
gh pr create --labels enhancement,feature
Link to issue
gh pr create --issue 123
Create in specific repository
gh pr create --repo owner/repo
Open in browser after creation
gh pr create --web
List Pull Requests
List open PRs
gh pr list
List all PRs
gh pr list --state all
List merged PRs
gh pr list --state merged
List closed (not merged) PRs
gh pr list --state closed
Filter by head branch
gh pr list --head feature-branch
Filter by base branch
gh pr list --base main
Filter by author
gh pr list --author username gh pr list --author @me
Filter by assignee
gh pr list --assignee username
Filter by labels
gh pr list --labels bug,enhancement
Limit results
gh pr list --limit 50
Search
gh pr list --search "is:open is:pr label:review-required"
JSON output
gh pr list --json number,title,state,author,headRefName
Show check status
gh pr list --json number,title,statusCheckRollup --jq '.[] | [.number, .title, .statusCheckRollup[]?.status]'
Sort by
gh pr list --sort created --order desc
View Pull Request
View PR
gh pr view 123
View with comments
gh pr view 123 --comments
View in browser
gh pr view 123 --web
JSON output
gh pr view 123 --json title,body,state,author,commits,files
View diff
gh pr view 123 --json files --jq '.files[].path'
View with jq query
gh pr view 123 --json title,state --jq '"(.title): (.state)"'
Checkout Pull Request
Checkout PR branch
gh pr checkout 123
Checkout with specific branch name
gh pr checkout 123 --branch name-123
Force checkout
gh pr checkout 123 --force
Diff Pull Request
View PR diff
gh pr diff 123
View diff with color
gh pr diff 123 --color always
Output to file
gh pr diff 123 > pr-123.patch
View diff of specific files
gh pr diff 123 --name-only
Merge Pull Request
Merge PR
gh pr merge 123
Merge with specific method
gh pr merge 123 --merge gh pr merge 123 --squash gh pr merge 123 --rebase
Delete branch after merge
gh pr merge 123 --delete-branch
Merge with comment
gh pr merge 123 --subject "Merge PR #123" --body "Merging feature"
Merge draft PR
gh pr merge 123 --admin
Force merge (skip checks)
gh pr merge 123 --admin
Close Pull Request
Close PR (as draft, not merge)
gh pr close 123
Close with comment
gh pr close 123 --comment "Closing due to..."
Reopen Pull Request
Reopen closed PR
gh pr reopen 123
Edit Pull Request
Edit interactively
gh pr edit 123
Edit title
gh pr edit 123 --title "New title"
Edit body
gh pr edit 123 --body "New description"
Add labels
gh pr edit 123 --add-label bug,enhancement
Remove labels
gh pr edit 123 --remove-label stale
Add assignees
gh pr edit 123 --add-assignee user1,user2
Remove assignees
gh pr edit 123 --remove-assignee user1
Add reviewers
gh pr edit 123 --add-reviewer user1,user2
Remove reviewers
gh pr edit 123 --remove-reviewer user1
Mark as ready for review
gh pr edit 123 --ready
Ready for Review
Mark draft PR as ready
gh pr ready 123
Pull Request Checks
View PR checks
gh pr checks 123
Watch checks in real-time
gh pr checks 123 --watch
Watch interval (seconds)
gh pr checks 123 --watch --interval 5
Comment on Pull Request
Add comment
gh pr comment 123 --body "Looks good!"
Comment on specific line
gh pr comment 123 --body "Fix this"
--repo owner/repo
--head-owner owner --head-branch feature
Edit comment
gh pr comment 123 --edit 456789 --body "Updated"
Delete comment
gh pr comment 123 --delete 456789
Review Pull Request
Review PR (opens editor)
gh pr review 123
Approve PR
gh pr review 123 --approve --body "LGTM!"
Request changes
gh pr review 123 --request-changes
--body "Please fix these issues"
Comment on PR
gh pr review 123 --comment --body "Some thoughts..."
Dismiss review
gh pr review 123 --dismiss
Update Branch
Update PR branch with latest base branch
gh pr update-branch 123
Force update
gh pr update-branch 123 --force
Use merge strategy
gh pr update-branch 123 --merge
Lock/Unlock Pull Request
Lock PR conversation
gh pr lock 123
Lock with reason
gh pr lock 123 --reason off-topic
Unlock
gh pr unlock 123
Revert Pull Request
Revert merged PR
gh pr revert 123
Revert with specific branch name
gh pr revert 123 --branch revert-pr-123
Pull Request Status
Show PR status summary
gh pr status
Status for specific repository
gh pr status --repo owner/repo
GitHub Actions
Workflow Runs (gh run)
List workflow runs
gh run list
List for specific workflow
gh run list --workflow "ci.yml"
List for specific branch
gh run list --branch main
Limit results
gh run list --limit 20
JSON output
gh run list --json databaseId,status,conclusion,headBranch
View run details
gh run view 123456789
View run with verbose logs
gh run view 123456789 --log
View specific job
gh run view 123456789 --job 987654321
View in browser
gh run view 123456789 --web
Watch run in real-time
gh run watch 123456789
Watch with interval
gh run watch 123456789 --interval 5
Rerun failed run
gh run rerun 123456789
Rerun specific job
gh run rerun 123456789 --job 987654321
Cancel run
gh run cancel 123456789
Delete run
gh run delete 123456789
Download run artifacts
gh run download 123456789
Download specific artifact
gh run download 123456789 --name build
Download to directory
gh run download 123456789 --dir ./artifacts
Workflows (gh workflow)
List workflows
gh workflow list
View workflow details
gh workflow view ci.yml
View workflow YAML
gh workflow view ci.yml --yaml
View in browser
gh workflow view ci.yml --web
Enable workflow
gh workflow enable ci.yml
Disable workflow
gh workflow disable ci.yml
Run workflow manually
gh workflow run ci.yml
Run with inputs
gh workflow run ci.yml
--raw-field
version="1.0.0"
environment="production"
Run from specific branch
gh workflow run ci.yml --ref develop
Action Caches (gh cache)
List caches
gh cache list
List for specific branch
gh cache list --branch main
List with limit
gh cache list --limit 50
Delete cache
gh cache delete 123456789
Delete all caches
gh cache delete --all
Action Secrets (gh secret)
List secrets
gh secret list
Set secret (prompts for value)
gh secret set MY_SECRET
Set secret from environment
echo "$MY_SECRET" | gh secret set MY_SECRET
Set secret for specific environment
gh secret set MY_SECRET --env production
Set secret for organization
gh secret set MY_SECRET --org orgname
Delete secret
gh secret delete MY_SECRET
Delete from environment
gh secret delete MY_SECRET --env production
Action Variables (gh variable)
List variables
gh variable list
Set variable
gh variable set MY_VAR "some-value"
Set variable for environment
gh variable set MY_VAR "value" --env production
Set variable for organization
gh variable set MY_VAR "value" --org orgname
Get variable value
gh variable get MY_VAR
Delete variable
gh variable delete MY_VAR
Delete from environment
gh variable delete MY_VAR --env production
Projects (gh project)
List projects
gh project list
List for owner
gh project list --owner owner
Open projects
gh project list --open
View project
gh project view 123
View project items
gh project view 123 --format json
Create project
gh project create --title "My Project"
Create in organization
gh project create --title "Project" --org orgname
Create with readme
gh project create --title "Project" --readme "Description here"
Edit project
gh project edit 123 --title "New Title"
Delete project
gh project delete 123
Close project
gh project close 123
Copy project
gh project copy 123 --owner target-owner --title "Copy"
Mark template
gh project mark-template 123
List fields
gh project field-list 123
Create field
gh project field-create 123 --title "Status" --datatype single_select
Delete field
gh project field-delete 123 --id 456
List items
gh project item-list 123
Create item
gh project item-create 123 --title "New item"
Add item to project
gh project item-add 123 --owner-owner --repo repo --issue 456
Edit item
gh project item-edit 123 --id 456 --title "Updated title"
Delete item
gh project item-delete 123 --id 456
Archive item
gh project item-archive 123 --id 456
Link items
gh project link 123 --id 456 --link-id 789
Unlink items
gh project unlink 123 --id 456 --link-id 789
View project in browser
gh project view 123 --web
Releases (gh release)
List releases
gh release list
View latest release
gh release view
View specific release
gh release view v1.0.0
View in browser
gh release view v1.0.0 --web
Create release
gh release create v1.0.0
--notes "Release notes here"
Create release with notes from file
gh release create v1.0.0 --notes-file notes.md
Create release with target
gh release create v1.0.0 --target main
Create release as draft
gh release create v1.0.0 --draft
Create pre-release
gh release create v1.0.0 --prerelease
Create release with title
gh release create v1.0.0 --title "Version 1.0.0"
Upload asset to release
gh release upload v1.0.0 ./file.tar.gz
Upload multiple assets
gh release upload v1.0.0 ./file1.tar.gz ./file2.tar.gz
Upload with label (casing sensitive)
gh release upload v1.0.0 ./file.tar.gz --casing
Delete release
gh release delete v1.0.0
Delete with cleanup tag
gh release delete v1.0.0 --yes
Delete specific asset
gh release delete-asset v1.0.0 file.tar.gz
Download release assets
gh release download v1.0.0
Download specific asset
gh release download v1.0.0 --pattern "*.tar.gz"
Download to directory
gh release download v1.0.0 --dir ./downloads
Download archive (zip/tar)
gh release download v1.0.0 --archive zip
Edit release
gh release edit v1.0.0 --notes "Updated notes"
Verify release signature
gh release verify v1.0.0
Verify specific asset
gh release verify-asset v1.0.0 file.tar.gz
Gists (gh gist)
List gists
gh gist list
List all gists (including private)
gh gist list --public
Limit results
gh gist list --limit 20
View gist
gh gist view abc123
View gist files
gh gist view abc123 --files
Create gist
gh gist create script.py
Create gist with description
gh gist create script.py --desc "My script"
Create public gist
gh gist create script.py --public
Create multi-file gist
gh gist create file1.py file2.py
Create from stdin
echo "print('hello')" | gh gist create
Edit gist
gh gist edit abc123
Delete gist
gh gist delete abc123
Rename gist file
gh gist rename abc123 --filename old.py new.py
Clone gist
gh gist clone abc123
Clone to directory
gh gist clone abc123 my-directory
Codespaces (gh codespace)
List codespaces
gh codespace list
Create codespace
gh codespace create
Create with specific repository
gh codespace create --repo owner/repo
Create with branch
gh codespace create --branch develop
Create with specific machine
gh codespace create --machine premiumLinux
View codespace details
gh codespace view
SSH into codespace
gh codespace ssh
SSH with specific command
gh codespace ssh --command "cd /workspaces && ls"
Open codespace in browser
gh codespace code
Open in VS Code
gh codespace code --codec
Open with specific path
gh codespace code --path /workspaces/repo
Stop codespace
gh codespace stop
Delete codespace
gh codespace delete
View logs
gh codespace logs
--tail 100
View ports
gh codespace ports
Forward port
gh codespace cp 8080:8080
Rebuild codespace
gh codespace rebuild
Edit codespace
gh codespace edit --machine standardLinux
Jupyter support
gh codespace jupyter
Copy files to/from codespace
gh codespace cp file.txt :/workspaces/file.txt gh codespace cp :/workspaces/file.txt ./file.txt
Organizations (gh org)
List organizations
gh org list
List for user
gh org list --user username
JSON output
gh org list --json login,name,description
View organization
gh org view orgname
View organization members
gh org view orgname --json members --jq '.members[] | .login'
Search (gh search)
Search code
gh search code "TODO"
Search in specific repository
gh search code "TODO" --repo owner/repo
Search commits
gh search commits "fix bug"
Search issues
gh search issues "label:bug state:open"
Search PRs
gh search prs "is:open is:pr review:required"
Search repositories
gh search repos "stars:>1000 language:python"
Limit results
gh search repos "topic:api" --limit 50
JSON output
gh search repos "stars:>100" --json name,description,stargazers
Order results
gh search repos "language:rust" --order desc --sort stars
Search with extensions
gh search code "import" --extension py
Web search (open in browser)
gh search prs "is:open" --web
Labels (gh label)
List labels
gh label list
Create label
gh label create bug --color "d73a4a" --description "Something isn't working"
Create with hex color
gh label create enhancement --color "#a2eeef"
Edit label
gh label edit bug --name "bug-report" --color "ff0000"
Delete label
gh label delete bug
Clone labels from repository
gh label clone owner/repo
Clone to specific repository
gh label clone owner/repo --repo target/repo
SSH Keys (gh ssh-key)
List SSH keys
gh ssh-key list
Add SSH key
gh ssh-key add ~/.ssh/id_rsa.pub --title "My laptop"
Add key with type
gh ssh-key add ~/.ssh/id_ed25519.pub --type "authentication"
Delete SSH key
gh ssh-key delete 12345
Delete by title
gh ssh-key delete --title "My laptop"
GPG Keys (gh gpg-key)
List GPG keys
gh gpg-key list
Add GPG key
gh gpg-key add ~/.ssh/id_rsa.pub
Delete GPG key
gh gpg-key delete 12345
Delete by key ID
gh gpg-key delete ABCD1234
Status (gh status)
Show status overview
gh status
Status for specific repositories
gh status --repo owner/repo
JSON output
gh status --json
Configuration (gh config)
List all config
gh config list
Get specific value
gh config get editor
Set value
gh config set editor vim
Set git protocol
gh config set git_protocol ssh
Clear cache
gh config clear-cache
Set prompt behavior
gh config set prompt disabled gh config set prompt enabled
Extensions (gh extension)
List installed extensions
gh extension list
Search extensions
gh extension search github
Install extension
gh extension install owner/extension-repo
Install from branch
gh extension install owner/extension-repo --branch develop
Upgrade extension
gh extension upgrade extension-name
Remove extension
gh extension remove extension-name
Create new extension
gh extension create my-extension
Browse extensions
gh extension browse
Execute extension command
gh extension exec my-extension --arg value
Aliases (gh alias)
List aliases
gh alias list
Set alias
gh alias set prview 'pr view --web'
Set shell alias
gh alias set co 'pr checkout' --shell
Delete alias
gh alias delete prview
Import aliases
gh alias import ./aliases.sh
API Requests (gh api)
Make API request
gh api /user
Request with method
gh api --method POST /repos/owner/repo/issues
--field title="Issue title"
--field body="Issue body"
Request with headers
gh api /user
--header "Accept: application/vnd.github.v3+json"
Request with pagination
gh api /user/repos --paginate
Raw output (no formatting)
gh api /user --raw
Include headers in output
gh api /user --include
Silent mode (no progress output)
gh api /user --silent
Input from file
gh api --input request.json
jq query on response
gh api /user --jq '.login'
Field from response
gh api /repos/owner/repo --jq '.stargazers_count'
GitHub Enterprise
gh api /user --hostname enterprise.internal
GraphQL query
gh api graphql
-f query='
{
viewer {
login
repositories(first: 5) {
nodes {
name
}
}
}
}'
Rulesets (gh ruleset)
List rulesets
gh ruleset list
View ruleset
gh ruleset view 123
Check ruleset
gh ruleset check --branch feature
Check specific repository
gh ruleset check --repo owner/repo --branch main
Attestations (gh attestation)
Download attestation
gh attestation download owner/repo
--artifact-id 123456
Verify attestation
gh attestation verify owner/repo
Get trusted root
gh attestation trusted-root
Completion (gh completion)
Generate shell completion
gh completion -s bash > ~/.gh-complete.bash gh completion -s zsh > ~/.gh-complete.zsh gh completion -s fish > ~/.gh-complete.fish gh completion -s powershell > ~/.gh-complete.ps1
Shell-specific instructions
gh completion --shell=bash gh completion --shell=zsh
Preview (gh preview)
List preview features
gh preview
Run preview script
gh preview prompter
Agent Tasks (gh agent-task)
List agent tasks
gh agent-task list
View agent task
gh agent-task view 123
Create agent task
gh agent-task create --description "My task"
Global Flags
Flag Description
--help / -h
Show help for command
--version
Show gh version
--repo [HOST/]OWNER/REPO
Select another repository
--hostname HOST
GitHub hostname
--jq EXPRESSION
Filter JSON output
--json FIELDS
Output JSON with specified fields
--template STRING
Format JSON using Go template
--web
Open in browser
--paginate
Make additional API calls
--verbose
Show verbose output
--debug
Show debug output
--timeout SECONDS
Maximum API request duration
--cache CACHE
Cache control (default, force, bypass)
Output Formatting
JSON Output
Basic JSON
gh repo view --json name,description
Nested fields
gh repo view --json owner,name --jq '.owner.login + "/" + .name'
Array operations
gh pr list --json number,title --jq '.[] | select(.number > 100)'
Complex queries
gh issue list --json number,title,labels
--jq '.[] | {number, title: .title, tags: [.labels[].name]}'
Template Output
Custom template
gh repo view
--template '{{.name}}: {{.description}}'
Multiline template
gh pr view 123
--template 'Title: {{.title}}
Author: {{.author.login}}
State: {{.state}}
'
Common Workflows
Create PR from Issue
Create branch from issue
gh issue develop 123 --branch feature/issue-123
Make changes, commit, push
git add . git commit -m "Fix issue #123" git push
Create PR linking to issue
gh pr create --title "Fix #123" --body "Closes #123"
Bulk Operations
Close multiple issues
gh issue list --search "label:stale"
--json number
--jq '.[].number' |
xargs -I {} gh issue close {} --comment "Closing as stale"
Add label to multiple PRs
gh pr list --search "review:required"
--json number
--jq '.[].number' |
xargs -I {} gh pr edit {} --add-label needs-review
Repository Setup Workflow
Create repository with initial setup
gh repo create my-project --public
--description "My awesome project"
--clone
--gitignore python
--license mit
cd my-project
Set up branches
git checkout -b develop git push -u origin develop
Create labels
gh label create bug --color "d73a4a" --description "Bug report" gh label create enhancement --color "a2eeef" --description "Feature request" gh label create documentation --color "0075ca" --description "Documentation"
CI/CD Workflow
Run workflow and wait
RUN_ID=$(gh workflow run ci.yml --ref main --jq '.databaseId')
Watch the run
gh run watch "$RUN_ID"
Download artifacts on completion
gh run download "$RUN_ID" --dir ./artifacts
Fork Sync Workflow
Fork repository
gh repo fork original/repo --clone
cd repo
Add upstream remote
git remote add upstream https://github.com/original/repo.git
Sync fork
gh repo sync
Or manual sync
git fetch upstream git checkout main git merge upstream/main git push origin main
Environment Setup
Shell Integration
Add to ~/.bashrc or ~/.zshrc
eval "$(gh completion -s bash)" # or zsh/fish
Create useful aliases
alias gs='gh status' alias gpr='gh pr view --web' alias gir='gh issue view --web' alias gco='gh pr checkout'
Git Configuration
Use gh as credential helper
gh auth setup-git
Set gh as default for repo operations
git config --global credential.helper 'gh !gh auth setup-git'
Or manually
git config --global credential.helper github
Best Practices
Authentication: Use environment variables for automation
export GH_TOKEN=$(gh auth token)
Default Repository: Set default to avoid repetition
gh repo set-default owner/repo
JSON Parsing: Use jq for complex data extraction
gh pr list --json number,title --jq '.[] | select(.title | contains("fix"))'
Pagination: Use --paginate for large result sets
gh issue list --state all --paginate
Caching: Use cache control for frequently accessed data
gh api /user --cache force
Getting Help
General help
gh --help
Command help
gh pr --help gh issue create --help
Help topics
gh help formatting gh help environment gh help exit-codes gh help accessibility
References
-
Official Manual: https://cli.github.com/manual/
-
GitHub Docs: https://docs.github.com/en/github-cli
-
REST API: https://docs.github.com/en/rest
-
GraphQL API: https://docs.github.com/en/graphql