Skip to content
| Marketplace
Sign in
Visual Studio Code>Other>Git GoNew to Visual Studio Code? Get it now.
Git Go

Git Go

Pinya

|
235 installs
| (1) | Free
Visual representation of your Git repository, with actions to manage commits, branches, stashes, and tags.
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

Git Go

A beautiful, interactive Git visualization extension for VS Code

Version License VS Code

Transform your Git workflow with an intuitive, feature-rich visual interface

Git Go Demo

✨ Features

Git Go provides a comprehensive visual representation of your Git repository with powerful actions to manage every aspect of your Git workflow:

🌳 Visual Git Graph

  • Interactive commit timeline with branching visualization
  • Real-time updates when Git state changes
  • Infinite scrolling for large repositories
  • Keyboard navigation (↑/↓ arrows when commit is expanded)
  • Floating jump buttons over the bottom right corner - back to the top once the graph is scrolled down, and to the checked out branch while its pill is out of sight

🚀 Big Repositories

Built to stay fast no matter how much history is loaded:

  • Virtualized commit list - only the rows in view are rendered, so scrolling stays smooth and memory stays flat with tens of thousands of commits loaded
  • Windowed graph drawing - only the visible slice of the graph is drawn, with the lines connecting seamlessly across it

🔍 Smart Search & Filtering

  • Search the whole history, not only the pages that happen to be loaded - the search runs on the Git side over the same refs the graph shows
  • Scope a search with author:, file: and hash: prefixes; a plain term matches the message, the author and the hash. Terms are matched literally, so feat/foo, v1.2.3 and file paths work
  • Filter by branches - view specific branches or all at once
  • Toggle visibility of stashes, tags, and remote branches
  • Advanced branch selector with grouping

🌿 Branch Management

  • Create branches from any commit
  • Checkout, rename, delete branches with ease
  • Push/pull operations with upstream tracking
  • Merge and rebase with multiple strategies (fast-forward, squash, etc.)
  • Abort a merge, rebase, or cherry-pick from a toolbar button that only appears while one is in progress
  • Force push with safety options (force-with-lease)
  • Remote branch operations - checkout, fetch, merge, delete

📦 Stash Operations

  • Create stashes with optional messages and untracked files
  • Apply, pop, or drop stashes
  • Create a branch from a stash, from its context menu or by dragging it - the branch starts at the commit the stash was made from, is checked out, and the stash is applied onto it and dropped on success
  • View stash contents and file changes
  • Visual stash indicators in the graph, kept visible even when the commit the stash was made on is no longer reachable from any ref

🏷️ Tag Management

  • Create and delete tags from any commit
  • Push tags to remotes
  • View tag details and associated commits
  • Visual tag indicators in the commit graph

🪾 Worktree Support

  • Worktree indicators on branches checked out in other worktrees
  • Create worktrees from any local branch, with a configurable path template
  • Open worktrees in a new window or the current one
  • Remove worktrees with optional force and branch deletion
  • Worktree list in the toolbar showing main, current, locked, and missing worktrees
  • Full support for working inside a linked worktree, including live graph updates

📂 Multiple Repositories

  • Repositories in subfolders are found too, not just the folder that is open, so a workspace holding several clones needs no reopening
  • Repository selector in the toolbar, left of the branch selector, appearing as soon as there is more than one repository to choose from
  • Per repository state so each one remembers its own selection of branches and hidden remotes
  • Submodules stay out of the list, since they belong to the repository that declares them
  • Always reachable from the status bar, which says so plainly when neither the folder nor its subfolders hold a repository

🔄 Commit Operations

  • Cherry-pick commits with origin tracking options
  • Revert commits safely
  • Undo the last action on the current branch - commit, amend, merge, rebase, cherry-pick, revert, reset or pull - from a toolbar button that names what it will undo, or with Ctrl+Z / Cmd+Z, moving the branch back to where the reflog says it was
  • Never undo pushed history by default, since the button and its shortcut are hidden once the branch tip is on its upstream, so an undo cannot leave you needing a force push
  • Reset the current branch to any commit, soft, mixed or hard
  • Edit a commit message from its context menu or by dragging the commit
  • Compare two commits or refs The changed files appear in a panel beside the graph
  • View detailed commit information including:
    • File changes and diffs
    • The full commit message, subject and body
    • Author details, plus the committer when it differs from the author

🕘 Reflog Panel

Opened from the toolbar button beside the undo button, in a panel beside the graph:

  • Everywhere a ref has been, newest first, with a selector to switch between HEAD - which records checkouts too - and any local branch, loading further entries a page at a time
  • A Recoverable badge on the entries no branch or tag reaches any more: the commits an amend, a reset or a rebase left behind, which the graph no longer shows and only the reflog still points at
  • Act on any entry from its context menu - create a branch there (prefilled recovered-<hash>), cherry-pick it, reset the current branch to it, or copy its hash

🌐 Remote Management

  • Add and remove Git remotes
  • Fetch from all remotes or specific ones
  • Push/pull operations to/from remotes
  • Remote branch tracking and management

🐙 GitHub Integration

Shown only when the repository has a github.com remote

  • Open a commit on GitHub from the mark next to its hash, or from its context menu
  • Open a branch or a tag from its context menu - a tag opens its release page, or its tree when it has no release
  • Open a file as it was at that commit, from the mark that appears when the pointer is over it in the file tree
  • Follow #123 in a commit message to that issue or pull request
  • Create a pull request for a local branch that has an upstream, against the branch the remote's HEAD points at

📁 File Operations

  • Browse repository file tree at any commit or stash
  • View file diffs between commits
  • See working directory changes with uncommitted files
  • Stash or discard uncommitted changes from the working directory row
  • Open files in VS Code editor at specific commits, in a split view next to the graph

🧲 Drag and Drop

  • Drop a branch on a branch to merge or rebase, with the default action set in the settings
  • Remote branches work on both ends of a drop - the remote branch is checked out (as its local counterpart) first, then the action runs
  • Drop a commit on a branch to cherry-pick, merge, or revert it
  • Drop a commit on another commit to compare the two
  • Hold over a pill to open every action it accepts instead of taking the default one
  • Drag an item on its own for the actions that need no target - push, delete, fetch into local, edit a commit message, and apply, pop, drop or branch from a stash
  • Refused actions stay visible with the reason, such as a branch checked out in another worktree
  • Auto mode per action, to run it on drop with the values its dialog would have opened with

⚙️ Git Configuration

  • Local and global Git user configuration
  • Override Git user per repository
  • Repository settings panel for quick access
  • Extension configuration through VS Code settings

Themes

Choose from multiple color themes for the commit graph:

Vibrant Theme Spring Theme Ocean Theme Sunset Theme Pastel Theme Coast Theme Cloud Theme Forest Theme Rainbow Theme Earth Theme Float Theme Dusk Theme Coral Theme

Or set the theme to custom and list your own colors in git-go.graph.customColors, up to 16 hex codes cycled through as branches are drawn.

🚀 Getting Started

Installation From VS Code Marketplace:

- Open VS Code
- Go to Extensions (`Ctrl+Shift+X` / `Cmd+Shift+X`)
- Search for "Git Go"
- Click Install

Usage

  1. Open Git Go:

    • Use the Command Palette (Ctrl+Shift+P / Cmd+Shift+P)
    • Run "Git Go - Open Graph"
    • Or click the "Git Go" button in the bottom status bar
  2. Navigate your repository:

    • Browse commits in the visual timeline
    • Click on commits to expand and see details
    • Use the search bar to find specific commits
    • Select branches to filter the view
  3. Perform Git operations:

    • Right-click on commits, branches, stashes, or tags for context menus
    • Drag a branch, commit, tag, or stash onto a branch, or hold over it for more actions
    • Undo the last one from the toolbar button, which names the action it will undo
    • Browse the reflog from the toolbar button beside it, and right-click an entry to get back to a commit no branch points at any more
  4. Keyboard shortcuts:

    • Ctrl+F / Cmd+F focuses the search, Esc clears it
    • Enter / Shift+Enter jump to the next and previous search match
    • ↑ / ↓ move between commits while one is expanded
    • Ctrl+Z / Cmd+Z undoes the last action on the current branch

⚙️ Configuration

Git Go is configured through VS Code settings. Open them with the "Extension Global Settings" button in the Git Go settings panel, or search for git-go in the Settings editor, where every option below appears under its own group.

General

{
    "git-go.autoOpen.enabled": false, // Open Git Go automatically when a window with a git repository starts
    "git-go.autoOpen.pinTab": true, // Pin the Git Go tab when it opens
    "git-go.statusBar.enabled": true, // Show a status bar item that opens Git Go when clicked
    "git-go.file.openInSplitView": true, // Open files and diffs in a split view next to Git Go
    "git-go.fileTree.folderCounts": true, // Show how many changed files each folder holds in the file trees
    "git-go.repo.scanDepth": 3 // How many folder levels below the open folders to look in for repositories
}

Graph

{
    "git-go.graph.theme": "vibrant", // Color palette used for the branches and dots
    "git-go.graph.customColors": [], // Colors used when the theme is 'custom', up to 16 hex codes
    "git-go.graph.rounded": true, // Round the corners of the branches, pills and boxes
    "git-go.graph.showAuthorName": true, // Show the author's name next to each commit's message
    "git-go.graph.remoteAvatars": true, // Show author pictures from the remote, falling back to Gravatar
    "git-go.graph.expandedCommitHeight": 300, // Height in pixels of an expanded commit (200-800)
    "git-go.graph.joinUncommittedChanges": true, // Join the uncommitted changes to the checked out commit with a line
    "git-go.graph.scrollToTopButton": true, // Float a button over the graph that takes it back to the top
    "git-go.graph.scrollToCurrentBranchButton": true // Float a button over the graph that jumps to the checked out branch
}

Both floating buttons sit in the bottom right corner of the graph and fade in and out with whether they have somewhere to take you. Turning one off hides it.

Drag and Drop

{
    "git-go.dragAndDrop.enabled": true, // Drag branches, commits, stashes and tags to act on them
    "git-go.dragAndDrop.branchOnBranch.defaultAction": "merge", // 'merge' | 'rebase' | 'none' on a branch drop
    "git-go.dragAndDrop.holdDelay": 300, // Milliseconds to hold before the extra actions appear
    "git-go.dragAndDrop.hideDelay": 300, // Milliseconds the actions stay once the pointer leaves
    "git-go.dragAndDrop.auto.merge": false, // Merge on drop instead of opening the dialog
    "git-go.dragAndDrop.auto.rebase": false, // Rebase on drop instead of opening the dialog
    "git-go.dragAndDrop.auto.mergeCommit": false, // Merge a commit on drop instead of opening the dialog
    "git-go.dragAndDrop.auto.cherryPick": false, // Cherry-pick on drop instead of opening the dialog
    "git-go.dragAndDrop.auto.push": false, // Push on drop instead of opening the dialog
    "git-go.dragAndDrop.auto.fetchIntoLocal": false // Fetch on drop instead of opening the dialog
}

Each auto option runs the action with the values its dialog would have opened with.

Reflog

{
    "git-go.reflog.enabled": true // Show the reflog browser in the toolbar
}

Turning it off hides the toolbar button, and nothing of the browser is loaded.

Undo

{
    "git-go.undo.enabled": true, // Offer to undo the last action on the current branch
    "git-go.undo.keyboardShortcut": true, // Also reach the undo from Ctrl+Z / Cmd+Z
    "git-go.undo.allowPushed": false, // Offer to undo an action that is already pushed
    "git-go.undo.show.commit": true, // Offer to undo a commit
    "git-go.undo.show.amend": true, // Offer to undo an amend
    "git-go.undo.show.merge": true, // Offer to undo a merge
    "git-go.undo.show.rebase": true, // Offer to undo a rebase
    "git-go.undo.show.cherryPick": true, // Offer to undo a cherry-pick
    "git-go.undo.show.revert": true, // Offer to undo a revert
    "git-go.undo.show.reset": true, // Offer to undo a reset
    "git-go.undo.show.pull": true, // Offer to undo a pull
    "git-go.undo.show.other": true // Offer to undo an action Git Go could not name
}

Each show option covers the button and its shortcut together, so an action turned off here has no undo at all.

By default there is no undo for an action that is already pushed: once the branch tip is contained in its upstream, the button and its shortcut are hidden, because moving the branch back would leave the remote holding commits the branch no longer has, and reconciling them needs a force push. Turn on git-go.undo.allowPushed to be offered it anyway. Undoing a pull is always offered, since it only leaves the branch behind its upstream and pulling again restores it.

Confirmations

{
    "git-go.confirm.merge": true, // Ask before merging a branch or a commit
    "git-go.confirm.rebase": true, // Ask before rebasing onto a branch or a commit
    "git-go.confirm.push": true, // Ask before pushing a branch
    "git-go.confirm.branchDelete": true // Ask before deleting a local branch
}

Turning one off runs the action straight away with the defaults configured below. Deleting a branch on a remote always asks.

Branches

{
    "git-go.branch.create.checkout": true, // Default 'Checkout new branch' when creating a branch
    "git-go.branch.checkout.pullAfterCheckout": false, // Pull from the upstream right after checking out
    "git-go.branch.push.mode": "normal", // Default 'Push Mode': 'normal' | 'force-with-lease' | 'force'
    "git-go.branch.push.setUpstream": true, // Default 'Set upstream' when pushing a branch
    "git-go.branch.delete.force": false, // Default 'Force Delete' when deleting a branch
    "git-go.branch.delete.onRemote": false // Default 'Also delete on the remote' for a tracked branch
}

Merge

{
    "git-go.merge.fastForwardIfPossible": true, // Default 'Fast forward if possible' when merging
    "git-go.merge.squash": false, // Default 'Squash commits' when merging
    "git-go.merge.noCommit": false, // Default "Don't commit automatically" when merging
    "git-go.merge.commitMessage": "" // Merge commit message, with {source} and {target} placeholders
}

Rebase

{
    "git-go.rebase.ignoreDate": true, // Default 'Ignore date' when rebasing
    "git-go.rebase.autoStash": false // Default 'Autostash uncommitted changes' when rebasing
}

Reword

{
    "git-go.reword.allowPushed": false // Offer to edit the message of a commit that is already pushed
}

Rewording rewrites the commit and everything above it, so a pushed commit needs a force push afterwards.

Cherry-Pick and Revert

{
    "git-go.cherryPick.recordOrigin": false, // Default 'Record origin' when cherry-picking
    "git-go.cherryPick.noCommit": true, // Default "Don't commit automatically" when cherry-picking
    "git-go.revert.noCommit": true // Default "Don't commit automatically" when reverting
}

Reset and Discard

{
    "git-go.reset.mode": "mixed", // Default reset mode: 'soft' | 'mixed' | 'hard'
    "git-go.reset.discardUntrackedFiles": true, // Delete untracked files when discarding all changes
    "git-go.reset.discardUntrackedDirectories": true // Delete untracked directories when discarding all changes
}

Stashes

{
    "git-go.stash.includeUntracked": true, // Default 'Include untracked files' when creating a stash
    "git-go.stash.reinstateIndex": false // Restore which files were staged when applying or popping
}

Tags

{
    "git-go.tag.type": "annotated", // 'annotated' | 'lightweight' tags created from the tag dialog
    "git-go.tag.push.allRemotes": false, // Preselect every remote when pushing a tag
    "git-go.tag.delete.onRemotes": false // Preselect the remotes that already have the tag when deleting it
}

Remotes

{
    "git-go.remote.defaultRemote": "origin", // Remote preselected when pushing a branch or a tag
    "git-go.remote.fetch.onOpen": false, // Fetch from every remote when Git Go opens
    "git-go.remote.fetch.prune": false, // Delete remote-tracking branches that are gone from the remote
    "git-go.remote.fetch.checkout": true, // Default 'Checkout branch after fetch' when fetching into a local branch
    "git-go.remote.fetch.forceFetch": false, // Default 'Force fetch' when fetching into a local branch
    "git-go.remote.fetch.confirmOnlyIfForceNeeded": false // Only ask when the fetch has to be forced
}

Worktrees

{
    "git-go.worktree.defaultPath": "../{repo}.worktrees/{branch}", // Where new worktrees are created
    "git-go.worktree.openBehavior": "ask", // 'ask' | 'newWindow' | 'currentWindow' when opening a worktree
    "git-go.worktree.create.openAfterCreate": true, // Default 'Open after creating' when creating a worktree
    "git-go.worktree.remove.force": false, // Default 'Force Remove' when removing a worktree
    "git-go.worktree.remove.deleteBranch": false // Default 'Also delete branch' when removing a worktree
}

GitHub

{
    "git-go.github.commitLinks": true, // Open a commit on GitHub from its hash and its context menu
    "git-go.github.refLinks": true, // Open a branch or a tag on GitHub from its context menu
    "git-go.github.fileLinks": true, // Open a file on GitHub, as it was at that commit, from the file tree
    "git-go.github.issueLinks": true, // Link [#123](https://github.com/CarlesRojas/git-go/issues/123) in a commit message to that issue
    "git-go.github.createPullRequest": true // Open GitHub's pull request form for a branch with an upstream
}

These only take effect when the repository has a github.com remote: origin when it is one, and otherwise the first remote that is.

🔧 Requirements

  • VS Code version 1.116.0 or higher
  • Git installed and available in PATH
  • A Git repository in your workspace

🤝 Contributing

Contributions are welcome! Please feel free to submit issues, feature requests, or pull requests.

📄 License

This project is licensed under the MIT License - see the LICENSE.md file for details.

🙏 Acknowledgments

  • Inspired by the excellent Git Graph extension
  • Built with modern web technologies and the VS Code Extension API

Report Bug · Request Feature · Contribute

  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
  • Your Privacy Choices
  • Consumer Health Privacy
© 2026 Microsoft