The Essential GitHub CLI Commands

The Essential GitHub CLI Commands

Camille Clarret

Last September, GitHub launched GitHub CLI 1.0 and brought GitHub to the terminal.

GitHub CLI is GitHub command-line interface. It brings pull requests, issues, and other GitHub concepts to the terminal next to where you are already working with Git and your code — according to its documentation.

In this article, you will find basic and useful commands that you need to know to enjoy your journey on the terminal.

Before starting to use GitHub CLI, you need to have a GitHub account and link Git to it. You can set up Git with this documentation and getting started with GitHub here.

Getting Started

First, open your terminal and pick a project. To get help with any command, use the help command:

$ gh help [command] [flags]

There are five core commands and a few more additionals ones. This post will focus on gist, issue, repo (repository), and pr (pull request).

Managing Gists

Gists allow you to share code, notes, and snippets quickly with other people — publicly or privately. You can take advantage of this feature in GitHub CLI.

To create your gist from the file in your current folder:

$ gh gist create
- Creating gist
✓ Created gist

You can share the printed link with anyone so they can read your gist. Your gist is private by default. If you want to create a public gist, use the --public flag:

$ gh gist create --public
- Creating gist
✓ Created gist

You can list all your gist:

$ gh gist list
4b5ba0b5daabf386ee01bc37ab667e58	 1 file public about 1 hour ago
4b5ba0b5daabf386ee01bc37ab667e59	 1 file secret about 2 hour ago

You can also apply filters on this list using the --limit int argument (default to 10) along with the --public and --secret flags.

You can display a specific gist from its ID or URL:

$ gh gist view 4b5ba0b5daabf386ee01bc37ab667e58
  - name: automatic merge for main when CI passes and 2 reviews
      - "#approved-reviews-by>=2"
      - check-success=Travis CI - Pull Request
      - base=main
        method: merge

Finally, you can delete a specific gist using its ID or URL:

$ gh gist delete 4b5ba0b5daabf386ee01bc37ab667e58

Managing Issues

Issues are suitable for collecting user feedback, report software bugs, and organizing tasks you'd like to accomplish in a repository. Here is how to manage your issues in GitHub CLI.

Creating an issue:

$ gh issue create --title "Is it a bug?" --body "the behavior’s description"
Creating issue in CamClrt/MergifySuperRepository

Listing all the repository’s issues:

$ gh issue list
Showing 1 of 1 open issue in CamClrt/MergifySuperRepository
#1  Is it a bug?    about 2 minutes ago

Using different flags, you can apply filters on this list. You can even open your browser with --web to list the issue(s) as well.

Displaying the status of your issues:

$ gh issue status
Relevant issues in CamClrt/MergifySuperRepository
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  Is it a bug?    about 3 minutes ago

Finally, closing an issue:

$ gh issue close 1
✓ Closed issue #1 (Is it a bug?)

Managing Repositories

Repositories are the basis of everything regarding developing projects, sharing code, and discussing them with contributors or colleagues. Here is how to manage your repositories in GitHub CLI.

Create a public repository:

$ gh repo create MergifySuperRepository
? Visibility Public
? This will create the "MergifySuperRepository" repository on GitHub. Continue? Yes
✓ Created repository CamClrt/MergifySuperRepository on GitHub
? Create a local project directory for "CamClrt/MergifySuperRepository"? Yes
Initialized empty Git repository in /Users/cam/Documents/sandbox/MergifySuperRepository/.git/
✓ Initialized repository in "MergifySuperRepository"

Thanks to the interactive interface, you can determine if your future repository will be private or public, created in the current directory or not, without opening a browser.

Cloning or forking repositories with GitHub CLI are also accessible as child's play.

$ gh repo clone Mergifyio/mergify-engine
Cloning into 'mergify-engine'...
remote: Enumerating objects: 56847, done.
remote: Counting objects: 100% (3416/3416), done.
remote: Compressing objects: 100% (849/849), done.
remote: Total 56847 (delta 2393), reused 3148 (delta 2202), pack-reused 53431
Receiving objects: 100% (56847/56847), 227.99 MiB | 16.25 MiB/s, done.
Resolving deltas: 100% (38429/38429), done.
Updating files: 100% (686/686), done.

Forking a repository:

$ gh repo fork Mergifyio/react-crisp
✓ Created fork CamClrt/react-crisp
? Would you like to clone the fork? Yes
Cloning into 'react-crisp'...
remote: Enumerating objects: 246, done.
remote: Counting objects: 100% (143/143), done.
remote: Compressing objects: 100% (110/110), done.
remote: Total 246 (delta 84), reused 42 (delta 21), pack-reused 103
Receiving objects: 100% (246/246), 281.45 KiB | 756.00 KiB/s, done.
Resolving deltas: 100% (128/128), done.
Updating upstream
* [new branch]      master     -> upstream/master
✓ Cloned fork

Then, listing the repository of an account:

$ gh repo list CamClrt 
Showing 22 of 22 repositories in @CamClrt
CamClrt/MergifySuperRepository							public 19m
CamClrt/react-crisp React implementation for Crisp public, 			   fork 1h
CamClrt/ 						 private, fork  1h
CamClrt/mergify-engine Engine for Mergify					public, fork   1h

You can filter this list down using the --archived, --no-archived, or --source flags.

Managing Pull Requests

Finally, pull requests could be the most important tool because you use them every day. Pull requests allow collaboration on GitHub. When working on a project with others, pull requests help you proposing your changes without infringing on the production code.

Creating a pull request with a specific title and body:

$ gh pr create --title "feat: my_super_feature" --body "all the details"
? Where should we push the 'other_branch' branch? CamClrt/MergifySuperRepository
Creating pull request for other_branch into main in CamClrt/MergifySuperRepository
864bdab..ef1c1d6  HEAD -> other_branch
Branch 'other_branch' set up to track remote branch 'other_branch' from 'origin'.

Listing all the pull requests in the repository:

$ gh pr list
Showing 6 of 6 open pull requests in Mergifyio/mergify-engine
#2530  chore(deps): bump httptools from 0.1.1 to 0.2.0    dependabot/pip/httptools-0.2.0
#2512  chore(deps): bump websockets from 8.1 to 9.0.1    dependabot/pip/websockets-9.0.1
#2498  feat(squash): add squash command                                CamClrt:MRGFY-284
#2434  chore(deps): bump hyperframe from 5.2.0 to 6.0.1  dependabot/pip/hyperframe-6.0.1
#1978  chore(deps): bump starlette from 0.13.6 to 0.14.2 dependabot/pip/starlette-0.14.2
#1766  chore(deps): bump idna from 2.10 to 3.1                   dependabot/pip/idna-3.1

As mentioned before, this command allows you to apply a large number of filters like --assignee, --base, --label, and more.

Displaying the status of your pull requests:

$ gh pr status
Relevant pull requests in Mergifyio/mergify-engine
Current branch
#2498  feat(squash): add squash command [CamClrt:MRGFY-284]
× 2/11 checks failing
Created by you
#2498  feat(squash): add squash command [CamClrt:MRGFY-284]
× 2/11 checks failing
Requesting a code review from you
You have no pull requests to review

Getting a pull request to inspect it:

$ gh pr checkout 2530
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 813 bytes | 116.00 KiB/s, done.
* [new branch]        dependabot/pip/httptools-0.2.0 -> upstream/dependabot/pip/httptools-0.2.0
Switched to a new branch 'dependabot/pip/httptools-0.2.0'

Displaying Continuous Integration (CI) status for a specific pull request:

$ gh pr checks 1234
X  Queue: Embarked in merge train               
X  Rule: automatic merge from dependabot (queue)
X  docs                                           5m12s
X  heroku                                         1m36s
X  pep8                                           5m11s
X  py39                                           10m13s
X  requirements                                   1m14s
✓  Analyze (python)                               7m19s
✓  CodeQL                                         3s
✓  GitGuardian Security Checks                    1s
✓  Semantic Pull Request                        
✓  Summary                                      
✓  docker                                         2m13s
GitHub CLI has fancy colours

Thanks to GitHub CLI, you will be able to significantly reduce your back and forth between the GitHub graphical interface and your terminal. This comfort and this gain in time will allow you to focus more on what matters most in your daily work life.

Going Further

This article is a short overview of what you can do with GitHub CLI. For more commands, flags, and other pieces of information, you can read the GitHub CLI documentation.

Can you optimize even more your workflow? Definitely, by installing the Mergify app from the GitHub marketplace. Mergify helps you save time by automatically prioritizing, merging, commenting, rebasing, updating, labeling, backporting, closing, and assigning your pull requests.

Leveraging Mergify is a perfect way to optimize even more your GitHub workflow. If you are curious about optimizing your workflow, you should read How Mergify Can Help With GitHub Pull Request Automation.

To use Mergify for free for open-source projects, so sign up here today. If your project isn’t open-source, you can still try it for free for 14 days!