- Included Scripts
- Useful git aliases
- Installing
- Other useful git stuff
- Miscellaneous Tips
- Contributing
- Thanks
git-extra-commands is a ZSH plugin that packages some extra git
helper scripts I've found. This collection (and the scripts that I wrote in it) is licensed with the Apache Version 2 license.
However, some of the scripts in this collection came from other sources and may have different licensing - if they do, their license information is included inline in the script source.
This collection doesn't actually require ZSH, but packaging it as a ZSH plugin makes it more convenient for people using a ZSH framework to use this collection.
If you wrote one of these scripts and want it removed from this collection, please either make a PR and/or file an issue against the repo and I will remove it.
Script | Original Source | Description |
---|---|---|
git-add-username-remote |
Ryan Tomayko's dotfiles | Adds a remote for the current repository for the given github username. |
git-age |
Kristoffer Gronlund's wiki | A git-blame viewer, written using PyGTK. |
git-attic |
Leah Neukirchen's blog | Displays a list of deleted files in your repo. The output is designed to be copy and pasted: Pass the second field to git show to display the file contents, or just select the hash without ^ to see the commit where removal happened. |
git-big-file |
Mislav Marohnić's dotfiles | Show files in the repo larger than a threshold size. |
git-branch-name |
Joe Block [email protected] | Prints the current branch name in automation-friendly format. |
git-branch-rebaser |
Vengada Rangaraju [email protected] | Kicks off an interactive rebase of all the commits on your branch. Including pushed commits, so be careful. |
git-change-author |
Michael Demmer in jut-io/git-scripts | Change one author/email in the history to another. |
git-change-log |
John Wiegley's git-scripts | Transform git log output into a complete Changelog for projects that haven't been maintaining one. |
git-changes |
Michael Markert's dotfiles | List authors in the repo in descending commit-count order. |
git-checkout-pr |
Based on gist.github.com/gnarf/5406589 | Check out a PR locally |
git-churn |
Gary Bernhardt's dotfiles | Show which files are getting changed most often in the repository. |
git-clone-subset |
Rodrigo Silva (MestreLion) [email protected] | Uses git clone and git filter-branch to remove from the clone all files but the ones requested, along with their associated commit history. |
git-comma |
Leah Neukirchen's blog | Adds and commits a file in one command |
git-conflicts |
Seth Messer's bits and bobs repo | Show files with conflicts |
git-copy-branch-name |
Zach Holman's dotfiles | Copy the current branch's name to the clipboard (macOS Only). |
git-credit |
Zach Holman's dotfiles | Quicker way to assign credit to another author on the latest commit. |
git-current-branch |
Joe Block [email protected] | Prints the name of the current branch, mainly useful in automation scripts. |
git-cut-branch |
Ryan Tomayko's dotfiles | Create a new branch pointed at HEAD and reset the current branch to the head of its tracking branch |
git-delete-local-merged |
From a deleted post by @tekkub | Delete all local branches that have been merged into HEAD. |
git-delete-merged-branches |
? | Purges all branches that have been merged to a target branch (defaults to branches merged to master). |
git-delete-tag |
Joe Block [email protected] | Delete a tag, both locally and from the origin remote. |
git-diff-last |
Sebastian Schuberth | Show the last change made to a file in the repository. |
git-divergence |
Gary Bernhardt's dotfiles | Shows differences between local branch and its tracking branch. |
git-edit-conflicts |
Joe Block [email protected] | Edit the files that are marked as conflicted during a merge/rebase in your $EDITOR/$VISUAL . |
git-find-dirty |
Matthew McCullough's scripts repository | |
git-flush |
John Wiegley's git-scripts | Compact your reposistory by dropping all reflogs, stashes, and other cruft that may be bloating your pack files. |
git-force-mtimes |
John Wiegley's git-scripts | Sets mtimes of all files in the reprository their last change date based on git's log. Useful to avoid too new dates after a checkout confusing make or rake . |
git-forest |
Jan Engelhardt | Prints a text-based tree visualisation of your repository. Requires Git.pm |
git-functionlog |
Joe Block [email protected] | Allows you to get a log of a particular function, not a file |
git-git |
Joe Block [email protected] | Typing git git foo will make git do a git foo instead of complaining. |
git-github-open |
? | Open GitHub file/blob page for FILE on LINE. |
git-gitlab-mr |
Noel Cower's gist | Open a merge request on GitLab |
git-history-graph |
? | Pretty git log, single line per commit, with branch graphign |
git-ignored |
? | Show files being ignored by git in the repo. |
git-improved-merge |
Mislav Marohnić's dotfiles | Sophisticated git merge with integrated CI check and automatic cleanup. |
git-incoming |
Michael Markert's dotfiles | Show commits in the tracking branch that are not in the local branch. |
git-lines |
Neil Killeen [email protected] | Gives you a list of author names with the number of lines last updated by that user in files in the current directory tree with the extension specified. |
git-ls-object-refs |
Ryan Tomayko's dotfiles | Find references to an object with SHA1 in refs, commits, and trees. All of them. |
git-maildiff |
Sanjeev Kumar's blogpost | A simple git command to email diff in color to reviewer/ co-worker. |
git-maxpack |
John Wiegley's git-scripts | Compress a repo's pack files as much as possible. |
git-move-commits |
Corey Oordt's git-scripts | git move-commits num-commits correct-branch moves the last n commits to correct-branch (creating it if necessary). |
git-neck |
Leah Neukirchen's blog | Show commits from the HEAD until the first branching point. Companion script for git-trail . |
git-nuke |
Zach Holman's dotfiles | Nukes a branch locally and on the origin remote. |
git-object-deflate |
Ryan Tomayko's dotfiles | Deflate an loose object file and write to standard output. |
git-outgoing |
Michael Markert's dotfiles | Show commits that are on the local branch that have not been pushed to the tracking branch. |
git-overwritten |
Mislav Marohnić's dotfiles | Aggregates git blame information about original owners of lines changed or removed in the '...' diff. |
git-pie-ify |
JeeBak Kim's gist | git pie-ify pattern replacement |
git-plotrepo |
Matthew McCullogh's scripts collection | Uses dot to draw a graph of the repository. |
git-promote |
Trevor's Improving My git Workflow blog post (404 now) | Promotes a local topic branch to a remote tracking branch of the same name. |
git-prune-branches |
Michael Demmer in jut-io/git-scripts | Deletes each fully merged branch after prompting for confirmation, than asks if you want the deleted branches deleted from your upstream remotes. |
git-pruneall |
Ryan Tomayko's dotfiles | Prune branches from specified remotes, or all remotes when no remote is specified. |
git-publish |
Michael Markert's dotfiles | git publish remote [remote-branch] |
git-purge-from-history |
David Underhill’s blog | Permanently delete files or folders from your git repository. |
git-pylint |
Joe Block [email protected] | Runs pylint on any .py files modified or added in the git status output. |
git-rank-contributors |
William Morgan [email protected] | Rummages through the changelog and orders contributors by the size of the diffs they're responsible for. |
git-rebase-authors |
Mislav Marohnić's dotfiles | Adds authorship info to interactive git rebase output |
git-rebase-theirs |
Rodrigo Silva (MestreLion) [email protected] | Resolve rebase conflicts by favoring 'theirs' version. |
git-recently-checkedout-branches |
Mislav Marohnić's dotfiles | Shows timestamp and name of recently checked-out branches in reverse chronological order. |
git-ref-recent |
Y combinator article | Shows the date, branch name, commit hash, and commit subject of branches, from most recently modified to oldest branches. |
git-rel |
Ryan Tomayko's dotfiles | Shows the relationship between the current branch and ref. With no ref, the current branch's remote tracking branch is used. |
git-remote-default-branch |
Mine | Shows the default branch for a specified remote, defaults to origin when no remote is specified. |
git-related |
Mislav Marohnić's dotfiles | Show other files that often get changed in commits that touch <file> . |
git-rename-branches |
Rodrigo Silva (MestreLion) [email protected] | Rename multiple branches that start with a given name. |
git-reset-with-fire |
Joe Block [email protected] | Hard reset the working directory, then zap any files not known to git. |
git-restore-mtime |
Rodrigo Silva (MestreLion) [email protected] | Change mtime of files based on commit date of last change. |
git-rm-deleted-from-repo |
Joe Block [email protected] | Removes files you deleted with rm from the repo for you. |
git-root-directory |
Joe Block [email protected] | Prints the path to the root of the git repository you're in. |
git-run-command-on-revisions |
Gary Bernhardt's dotfiles | Runs a given command over a range of Git revisions. |
git-shamend |
Danielle Sucher's git-shamend blog post | Amends your staged changes as a fixup (keeping the pre-existing commit message) to the specified commit, or HEAD if no revision is specified. |
git-show-overwritten |
Mislav Marohnić's dotfiles | Aggregates git blame information about the original owners of lines changed or removed in the '...' diff. |
git-shrink-repo |
Based on gimbo/gimbo-git.zsh | Shrinks your clone of a git repo. |
git-sp |
A. Schwarz's git-sp | "Simple push", single short command to commit, and push. Use -a flag to add all files to commit. |
git-sr |
Noel Cower's git-sr | Use fzf to switch to a different git ref. |
git-switch-branch |
Andrew Steele's dotfiles | Make it easier to switch to a branch by a substring of its name. More useful if you are good about deleting branches which have been merged upstream and if your branch names include unique identifiers like ticket/issue numbers or feature names. |
git-submodule-rm |
Greg V's dotfiles & Pascal Sommer | Allows you to remove a submodule easily with git submodule-rm path/to/submodule . |
git-tag-and-sign |
? | Create and sign a new tag |
git-thanks |
Mislav Marohnić's dotfiles | List the contributors to a repository in descending commit order, even if their contribution has been completely replaced. |
git-track |
Zach Holman's dotfiles | Sets up your branch to track a remote branch. Assumes you mean origin/localbranchname. |
git-trail |
Leah Neukirchen's blog | Show all branching points in the repo's Git history so you can see how to reach commits in the current branch from other branches. |
git-undelete |
? | Undeletes a file. |
git-undo-push |
? | Undoes your last push to branch $1 of origin |
git-unpushed |
Zach Holman's dotfiles | Show the diff of everything you haven't pushed to the origin remote yet |
git-unreleased |
Mislav Marohnić's dotfiles | Shows git commits since the last tagged version. |
git-up |
Ryan Tomayko's dotfiles | |
git-upstream-sync |
Joe Block [email protected] | Fetches upstream/yourforkname and rebases it into your local fork, then pushes to your origin remote. |
git-what-the-hell-just-happened |
Gary Bernhardt's dotfiles | Show what just happened. |
git-when-merged |
Michael Haggerty git-when-merged | Find when a commit was merged into one or more branches. |
git-where |
Mislav Marohnić's dotfiles | Shows where a particular commit falls between releases. |
git-whoami |
Peter Eisentraut | Shows what username & email you have configured for the repo you're in |
git-winner |
Garry Dolley https://github.com/up_the_irons/git-winner | Shows what authors have made the most commits, both by number of commits and by number of lines changed. |
git-wordiness |
Noel Cower | Shows how wordy people's commit messages are. Useful for shaming the folks who commit atrocities like git commit -m fixup |
git-wtf |
William Morgan [email protected] | git-wtf displays the state of your repository in a readable, easy-to-scan format. It's useful for getting a summary of how a branch relates to a remote server, and for wrangling many topic branches. |
github-open |
Ryan Tomayko's dotfiles |
Here are some helpful aliases for your ~/.gitconfig
alias | Description |
---|---|
ahead-of-master = log --oneline origin/master..HEAD |
Show commits that haven't made it to master yet. |
fetch-pull-requests = fetch origin '+refs/pull/*/head:refs/remotes/origin/pull/*' |
Fetch pull requests from github so you can git checkout pull/123 and test them locally. |
roots = log --all --oneline --decorate --max-parents=0 |
Show the root commits. |
unpushed = log @{u}.. |
Show which commits have not been pushed to the tracking branch and are safe to amend/rebase. |
work-in-progress = rebase -i @{u} |
Starts an interactive rebase of all the commits you haven't pushed yet. Handy for collapsing a bunch of work-in-progress snapshots into logical commits before pushing, without having to worry about accidentally squashing a commit someone else has already referred to. |
- A relatively recent version of
git
. The version ofgit
Apple includes in macOS is very stale. You should reallybrew install git
to get the current version if you're on macOS - if not for features, for security updates. - Python 3+
- Ruby 2.2+
If you're using zgen:
- Add
zgen load unixorn/git-extra-commands
to your.zshrc
along with your otherzgen load
commands. zgen reset && zgen save
If you're using Antigen:
- Add
antigen bundle unixorn/git-extra-commands
to your.zshrc
where you've listed your other plugins. - Close and reopen your Terminal/iTerm window to refresh context and use the plugin. Alternatively, you can run
antigen bundle unixorn/git-extra-commands
in a running shell to haveantigen
load the new plugin.
If you're using oh-my-zsh:
-
In the command line, change to oh-my-zsh's custom plugin directory :
cd ~/.oh-my-zsh/custom/plugins/
-
Clone the repository into a new
git-extra-commands
directory:git clone https://github.com/unixorn/git-extra-commands.git git-extra-commands
-
Edit your
~/.zshrc
and addgit-extra-commands
– same as clone directory – to the list of plugins to enable:plugins=( ... git-extra-commands )
-
Then, restart your terminal application to refresh context and use the plugin. Alternatively, you can source your current shell configuration:
source ~/.zshrc
Nothing here actually requires you to use ZSH or zgen, that's just a convenient distribution method for anyone using a ZSH framework.
If you aren't using any ZSH frameworks, or if you're using bash
, fish
or another shell, do the following steps:
git clone
this repository- Add
cloneDirectory/bin
to your$PATH
in your shell's startup file.
-
awesome-github - Faraz Fallahi maintains a curated list of Github & Git resources.
-
Scott Chacon's Pro Git book is a great resource for getting more out of
git
. -
Zach Dennis has a great blog post - A Git Walkthrough - it's worth reading on it's own, but here are a couple of good sites I found through it:
- gitready.com/ is a great reference which has been collecting information and tips for
git
since 2009. - gitimmersion.com/
- gitready.com/ is a great reference which has been collecting information and tips for
-
There’s a quick Introduction to git on learnxinyminutes.com
-
There's a more detailed
git
tutorial on learnenough.com -
Kate Hudson maintains the git flight rules collection of useful
git
usage tips. -
git-tips/tips is a collection of git tips.
-
Leah Neukirchen wrote a great blog post, A Grab Bag of Git Tricks on
git
that is the source for several scripts in this collection. -
Mislav Marohnić has a good article on git tips on his blog. Several of his
git
scripts are in this collection. -
When you manage to get your
git
working directory in a sad state, you can run into the chicken-egg problem where if you just knew what command toman
, you could dig yourself out of the hole, but if you knew that, you wouldn't be in the bad place anyway. Oh Shit, Git! has a collection of bad situations explained in plain English and how to get yourself out of them. -
Tim Green maintains the excellent Github Cheat Sheet collection of tips and aliases.
-
firstaidgit.io is a searchable selection of the most frequently asked Git questions
-
Git From the Inside Out - A good essay that explains how git works, focusing on the graph structure underpinnings of
git
and how they affect its behavior. -
“Git” it together: Some tips on commit etiquette and best practices for junior developers is a good article explaining some best practices on how to write a good commit message.
-
Git Rebase in Depth is a good tutorial on
git rebase
that covers the common use cases for rebasing. -
Git Submodules Revisted is a good article by Dave Cridland on using submodules in your code.
-
How to Review a Merge Commit - Good article on dealing with reviewing the changes made during a merge.
-
Top ten pull request review mistakes is a great article by Scott Nonnenberg on how to do better code reviews on PRs.
-
A Tidy, Linear Git History - Marcus Geelnard wrote a blog post about the value of a linear commit history.
-
More Productive Git by James Turnbull is a quick tutorial for beginning
git
users. -
Julia Evans wrote a great blog post about Git Exercises.
-
Roger Dudler wrote a good introduction to
git
in his git, the simple guide post. -
Patrick Porto wrote 4 Branching Workflows for git which discusses the pros and cons of four of the more popular
git
workflows. -
Tracking diffs by scoping to file, range, function, method, or class changes in Git is a great article by Susan Potter about making
git
show file-specific diffs, or even function-specific diffs in a language-aware way. -
A Thorough Introduction to Git's Interactive Patch Mode - An introduction on how to stage just parts of your changes to a commit.
- bfg repo-cleaner - Removes large or troublesome blobs like
git filter-branch
does, but faster. - bitbucket-git-helpers - Helper scripts to allow you to create bitbucket PRs from a shell session.
- blackbox - Tom Limoncelli open sourced the tool they use at Stack Exchange to use GPG to store secrets in a
git
repository. - branch-manager - ZSH plugin for branch management
- commit-helper - A python script that helps you write commits following commit conventions.
- diff-so-fancy - Better looking
git
diffs - git ZSH plugin - A replacement for the stock oh-my-zsh
git
plugin. Provides quite a few useful aliases and functions that are more consistent in their naming that the relatively unintuitive ones in the stock plugin. - git-aliases.zsh - Peter Hurford's
git
plugin which you may prefer to thegit
plugin from oh-my-zsh. - git-also - Shows what files are most often committed with a given file in the repository.
- git-amend - Bash script to amend older commits with staged changes.
- git-branch-status - A
git
utility to make managing large number of branches either across many remotes easier. Branch status allows comparing all branches against their upstream or any arbitrary branch to show the number of commit differences. - git-branches - Prints the commit behind/ahead counts for branches.
- git-bump - Hook scripts to automatically bump the version file in a repository
- git-chart - A python script that builds charts from a
git
repository - git-complete-urls - ZSH plugin to enhance
git
tab completion to include in the remotes completion (e.g. fromgit clone
) any URL in the clipboard. - git-cop - Enforces
git
rebase workflow with consistent commits for a clean and easy to read/debug project history. - git-crypt - Enables transparent encryption and decryption of files in a
git
repository. Files which you choose to protect are encrypted when committed, and decrypted when checked out. - git-deploy-s3 - Keeps your
git
repository's assets in sync with Amazon S3. - git-diffall - Provides a directory based diff mechanism for
git
. - git-extend - Extend
git
builtins with command wrappers. - git-fastclone - Think
git clone --recursive
on steroids. If you're doing repeated checkouts of a given repo on a machine (like a ci box), git-fastclone will speed things up considerably. - git-flow-completion - Bash, Fish and ZSH completion support for git-flow
- git-follow - Follow lifetime changes of a pathspec.
- git-graph - creates a Graphviz graph showing the high-level structure of a repository's history.
- git-gutter - Plugin for Sublime Text 2/3 to display the
git
diff in the edit window gutter. - git-it-on.zsh - Another plugin by Peter Hurford that adds a
gitit
command that will open your current directory on github, in your current branch. Also works with private github servers. - git-quick-stats - A simple and efficient way to access various statistics in a
git
repository. - git-repo-updater - Allows you to easily update multiple
git
repositories at once. - git-secrets - Prevents you from committing secrets and credentials into
git
repositories. - git-standup - Recall what you did on the last working day. Can work in a directory full of
git
repos to see a consolidated view of all work in all the repos. - git-stashd - Autostashing daemon for dirty worktrees.
- git-submodule-tools - A collection of scripts that should help make life with
git
submodules easier. - git-sweep - A utility script to remove branches that have been merged to master.
- git-todo - helper script to show all the todo entries in your repo.
- git-up (gem) - Fetch and rebase all locally-tracked remote branches.
- git-up (python) - Python implementation of Aanand's original ruby gem
- git-wayback-machine - A simple script to quickly navigate a project's state through it's
git
history - git_history_visualizer - python script to visualize the history of files in a
git
repository - gitbaby - Helper scripts to manage your
git
repositories - gitgo - Open a GitHub/Gitlab hosted repository in your browser via the command line (macOS only).
- gitsh - An interactive shell for
git
. From within gitsh you can issue anygit
command, even using your local aliases and configuration. - gunstage - There are at least eight ways to unstage files in a
git
repository. This is a command-line shell plugin for undoinggit add
. - hitch - Allows developers to be properly credited when Pair Programming and using
git
. - hub - A command line tool that wraps
git
in order to extend it with extra features and commands that make working with GitHub easier. - igit - Interactively construct
git
commands using fzf. - joe - Generates
.gitignore
files from the command line for you. - mergepbx - Helper script for merging XCode project files.
- switch-git - Easy switching between
git
repositories. Just typesgr <some part of you repo's name>
, press enter and you're there. - xcode-build-scripts - Helper scripts to use with XCode projects.
Many repositories are switching away from using master as the default branch name. You can do git config --global alias.co-default '!'"git checkout \$(git branch -r | awk -F/ '/HEAD/ {print \$NF}')"
to add a co-default alias that will determine what the repository's default branch is for you.
Alternatively, add the following aliases from a tweet by @jnesselr to your .gitconfig
file:
cdef = "!git checkout $(git originhead)"
originhead = "!git remote show origin | grep 'HEAD branch' | cut -d ' ' -f5"
This queries the remote to get the current up to date default branch, so it will work even if the remote's default branch changes after you did your initial checkout.
Do git config --global help.autocorrect 1
git will now try to figure out what you meant, for example:
$ git commt
WARNING: You called a Git command named 'commt', which does not exist.
Continuing in 0.1 seconds, assuming that you meant 'commit'.
git config --global url."https://github".insteadOf git://github
Use ssh
instead of https://
git config --global url."[email protected]:".insteadOf "https://github.com/"
Credit: @grawity & @hansdg1 by way of Kovrinic
- Please include an entry both in the credits section of README.md for any scripts and a credit comment in the script itself in your PRs so authors get their work credited correctly.
- Please use
#!/usr/bin/env interpreter
instead of a direct path to the interpreter, this makes it easier for people to use more recent versions when the ones packaged with their OS (macOS and CentOS, I'm looking at you!) are stale.
Many thanks to all the contributors over the years.
Made with contributors-img.