Awesome Git Addons Overview

:sunglasses: A curated list of add-ons that extend/enhance the git CLI.

🏠 Home · 🔥 Feed · 📮 Subscribe · ❤️ Sponsor · 😺 stevemao/awesome-git-addons · ⭐ 1.9K · 🏷️ Miscellaneous

[ Daily / Weekly / Overview ]

Awesome git addons Awesome

A curated list of add-ons that extend/enhance the git CLI.

$ git bla
Something awesome happens!

“You don’t have to know everything. You simply need to know where to find it when necessary.” (John Brunner)

Inspired by the awesome (⭐326k) list thing.

Note: Some of the commands may not work out of the box. You might need to run a post install script to add aliases or add them manually.

Table of Contents

git-extras (⭐17k)

squash

$ git squash fixed-cursor-styling "Fixed cursor styling"
$ git squash 95b7c52
$ git squash HEAD~3

summary

$ git summary

 project  : git
 repo age : 10 years
 active   : 11868 days
 commits  : 40530
 files    : 2825
 authors  :
 15401    Junio C Hamano                  38.0%
  1844    Jeff King                       4.5%

line-summary

$ git line-summary

 project  : gulp
 lines    : 3900
 authors  :
 1040 Contra                    26.7%
  828 Sindre Sorhus             21.2%

effort

$ git effort

  file                                          commits    active days

  .gitattributes............................... 3          3
  .gitignore................................... 265        226
  .mailmap..................................... 47         40

authors

$ git authors
Contra <[email protected]>
Eric Schoffstall <[email protected]>
Sindre Sorhus <[email protected]>

changelog

$ git changelog
## 3.9.0

- add babel support
- add transpiler fallback support
- add support for some renamed transpilers (livescript, etc)
- add JSCS
- update dependecies (liftoff, interpret)
- documentation tweaks

## 3.8.11

- fix node 0.12/iojs problems
- add node 0.12 and iojs to travis
- update dependencies (liftoff, v8flags)
- documentation tweaks

commits-since

$ git commits-since yesterday
... changes since yesterday
TJ Holowaychuk - Fixed readme

count

$ git count
total 855

create-branch

$ git create-branch development
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/tj/git-extras.git
 * [new branch]      HEAD -> development
Branch development set up to track remote branch development from origin.
Switched to a new branch 'development'

delete-branch

$ git delete-branch integration
Deleted branch integration (was bfb8522).
Deleted remote-tracking branch remote/integration (was bfb8522).
To [email protected]:remote/gulp.git
 - [deleted]         integration

delete-submodule

$ git delete-submodule lib/foo

delete-tag

$ git delete-tag v0.1.1
Deleted tag 'v0.1.1' (was 9fde751)
To https://github.com/tj/git-extras.git
 - [deleted]         v0.1.1

delete-merged-branches

$ git delete-merged-branches
Deleted feature/themes (was c029ab3).
Deleted feature/live_preview (was a81b002).
Deleted feature/dashboard (was 923befa).

fresh-branch

$ git fresh-branch docs
Removing .DS_Store
Removing .editorconfig
Removing .gitignore

guilt

$ git guilt `git log --until="3 weeks ago" --format="%H" -n 1` HEAD
Paul Schreiber                +++++++++++++++++++++++++++++++++++++++++++++(349)
spacewander                   +++++++++++++++++++++++++++++++++++++++++++++(113)
Mark Eissler                  ++++++++++++++++++++++++++

merge-into

$ git merge-into master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
Updating 9fde751..e62edfa
Fast-forward
 234 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 234
Switched to branch 'development'

graft

$ git graft development
Your branch is up-to-date with 'origin/master'.
Merge made by the 'recursive' strategy.
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Deleted branch development (was 64b3563).

alias

$ git alias last "cat-file commit HEAD"
$ git alias
last = cat-file commit HEAD

ignore

$ git ignore build "*.o" "*.log"
... added 'build'
... added '*.o'
... added '*.log'

info

$ git info

    ## Remote URLs:

    origin              [email protected]:sampleAuthor/git-extras.git (fetch)
    origin              [email protected]:sampleAuthor/git-extras.git (push)

    ## Remote Branches:

    origin/HEAD -> origin/master
    origin/myBranch

    ## Local Branches:

    myBranch
    * master

    ## Most Recent Commit:

    commit e3952df2c172c6f3eb533d8d0b1a6c77250769a7
    Author: Sample Author <[email protected]>

    Added git-info command.

    Type 'git log' for more commits, or 'git show <commit id>' for full commit details.

    ## Configuration (.git/config):

    color.diff=auto
    color.status=auto

fork

$ git fork LearnBoost/expect.js

release

$ git release 0.1.0
... releasing 0.1.0
On branch development
Your branch is up-to-date with 'origin/development'.
nothing to commit, working directory clean
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/tj/git-extras.git
   9fde751..e62edfa  master -> master
Counting objects: 1, done.
Writing objects: 100% (1/1), 166 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://github.com/tj/git-extras.git
 * [new tag]         0.1.0 -> 0.1.0
... complete

contrib

$ git contrib visionmedia
visionmedia (18):
  Export STATUS_CODES
  Replaced several Array.prototype.slice.call() calls with Array.prototype.unshift.call()
  Moved help msg to node-repl

repl

$ git repl

git> ls-files
History.md
Makefile

undo

$ git undo
Unstaged changes after reset:
M    package.json
M    readme.md

gh-pages

$ git gh-pages

scp

$ git scp staging HEAD

setup

$ git setup
Initialized empty Git repository in /GitHub/test/gulp/.git/
[master (root-commit) 9469797] Initial commit
 69 files changed, 3900 insertions(+)
 create mode 100644 .editorconfig
 create mode 100644 .gitignore
 create mode 100644 .jscsrc

touch

$ git touch index.js

obliterate

$ git obliterate secrets.json
Rewrite 2357a4334051a6d1733037406ab7538255030d0b (1/981)rm 'secrets.json'
Rewrite b5f62b2746c23150917d346bd0c50c467f01eb03 (2/981)rm 'secrets.json'
Rewrite 3cd94f3395c2701848f6ff626a0a4f883d8a8433 (3/981)rm 'secrets.json'

feature|refactor|bug|chore

$ git feature dependencies
$ git feature finish dependencies
Already up-to-date.
Deleted branch feature/dependencies (was f0fc4c7).
Deleted remote-tracking branch origin/feature/dependencies (was f0fc4c7).
To [email protected]:stevemao/gulp.git
 - [deleted]         feature/dependencies

local-commits

$ git local-commits
commit 5f00a3c1bb71876ebdca059fac96b7185dea5467
Merge: 7ad3ef9 841af4e
Author: Blaine Bublitz <[email protected]>
Date:   Thu Aug 20 11:35:15 2015 -0700

    Merge pull request #1211 from JimiHFord/patch-1

    Update guidelines.md

commit 841af4ee7aaf55b505354d0e86d7fb876d745e26
Author: Jimi Ford <[email protected]>
Date:   Thu Aug 20 11:55:38 2015 -0400

    Update guidelines.md

    fixed typo

archive-file

$ git archive-file
Building archive on branch "master"
Saved to "gulp.v3.9.0-36-g47cb6b0.zip" ( 60K)

missing

$ git missing master
< d14b8f0 only on current checked out branch
> 97ef387 only on master

lock

$ git lock config/database.yml

locked

$ git locked
config/database.yml

unlock

$ git unlock config/database.yml

reset-file

$ git reset-file README.md HEAD^
Reset 'README.md' to HEAD^

pr

$ git pr 226
From https://github.com/tj/git-extras
 * [new ref]       refs/pulls/226/head -> pr/226
Switched to branch 'pr/226'

root

$ git root
/GitHub/git

delta

$ git delta
README.md

merge-repo

$ git merge-repo [email protected]:tj/git-extras.git master .
git fetch [email protected]:tj/git-extras.git master
warning: no common commits
remote: Counting objects: 3507, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 3507 (delta 1), reused 0 (delta 0), pack-reused 3502
Receiving objects: 100% (3507/3507), 821.12 KiB | 286.00 KiB/s, done.
Resolving deltas: 100% (1986/1986), done.
From github.com:tj/git-extras
 * branch            master     -> FETCH_HEAD
Added dir 'git-merge-repo.E95m0gj'
No local changes to save

psykorebase

$ git psykorebase master
$ git psykorebase --continue
$ git psykorebase master feature

gitflow (AVH Edition) (⭐5.4k)

flow init

$ git flow init

Which branch should be used for bringing forth production releases?
   - changelog
   - master
Branch name for production releases: [master]

Which branch should be used for integration of the "next release"?
   - changelog
Branch name for "next release" development: [master]
Production and integration branches should differ.

flow feature

$ git flow feature
$ git flow feature start awesome-feature
$ git flow feature finish awesome-feature
$ git flow feature delete awesome-feature

$ git flow feature publish awesome-feature
$ git flow feature pull remote awesome-feature

flow release

$ git flow release
$ git flow release start awesome-release
$ git flow release finish awesome-release
$ git flow release delete awesome-release

flow hotfix

$ git flow hotfix
$ git flow hotfix start awesome-release
$ git flow hotfix finish awesome-release
$ git flow hotfix delete awesome-release

flow support

$ git flow support

git-up (⭐2.6k)

$ git up
Fetching origin
4.0       fast-forwarding...
changelog ahead of upstream
master    fast-forwarding...
returning to 4.0

hub (⭐23k)

clone

$ git clone schacon/ticgit
> git clone git://github.com/schacon/ticgit.git

$ git clone -p schacon/ticgit
> git clone [email protected]:schacon/ticgit.git

$ git clone resque
> git clone [email protected]/YOUR_USER/resque.git

remote add

$ git remote add rtomayko
> git remote add rtomayko git://github.com/rtomayko/CURRENT_REPO.git

$ git remote add -p rtomayko
> git remote add rtomayko [email protected]:rtomayko/CURRENT_REPO.git

$ git remote add origin
> git remote add origin git://github.com/YOUR_USER/CURRENT_REPO.git

fetch

$ git fetch mislav
> git remote add mislav git://github.com/mislav/REPO.git
> git fetch mislav

$ git fetch mislav,xoebus
> git remote add mislav ...
> git remote add xoebus ...
> git fetch --multiple mislav xoebus

cherry-pick

$ git cherry-pick https://github.com/mislav/REPO/commit/SHA
> git remote add -f --no-tags mislav git://github.com/mislav/REPO.git
> git cherry-pick SHA

$ git cherry-pick mislav@SHA
> git remote add -f --no-tags mislav git://github.com/mislav/CURRENT_REPO.git
> git cherry-pick SHA

$ git cherry-pick mislav@SHA
> git fetch mislav
> git cherry-pick SHA

am

$ git am https://github.com/github/hub/pull/55
[ downloads patch via API ]
> git am /tmp/55.patch

$ git am --ignore-whitespace https://github.com/davidbalbert/hub/commit/fdb9921
[ downloads patch via API ]
> git am --ignore-whitespace /tmp/fdb9921.patch

apply

$ git apply https://gist.github.com/8da7fb575debd88c54cf
[ downloads patch via API ]
> git apply /tmp/gist-8da7fb575debd88c54cf.txt

fork

$ git fork
[ repo forked on GitHub ]
> git remote add -f YOUR_USER [email protected]:YOUR_USER/CURRENT_REPO.git

pull-request

$ git pull-request
[ opens text editor to edit title & body for the request ]
[ opened pull request on GitHub for "YOUR_USER:feature" ]

checkout

$ git checkout https://github.com/github/hub/pull/73
> git remote add -f --no-tags -t feature mislav git://github.com/mislav/hub.git
> git checkout --track -B mislav-feature mislav/feature

merge

$ git merge https://github.com/github/hub/pull/73
> git fetch git://github.com/mislav/hub.git +refs/heads/feature:refs/remotes/mislav/feature
> git merge mislav/feature --no-ff -m 'Merge pull request #73 from mislav/feature...'

create

$ git create
[ repo created on GitHub ]
> git remote add origin [email protected]:YOUR_USER/CURRENT_REPO.git

init

$ git init -g
> git init
> git remote add origin [email protected]:YOUR_USER/REPO.git

push

$ git push origin,staging,qa bert_timeout
> git push origin bert_timeout
> git push staging bert_timeout
> git push qa bert_timeout

browse

$ git browse
> open https://github.com/YOUR_USER/CURRENT_REPO

compare

$ git compare refactor
> open https://github.com/CURRENT_REPO/compare/refactor

submodule

$ git submodule add wycats/bundler vendor/bundler
> git submodule add git://github.com/wycats/bundler.git vendor/bundler

ci-status

$ git ci-status
success

git-deploy (⭐2.1k)

$ git remote add production "[email protected]:/apps/mynewapp"
$ git deploy setup -r "production"
$ git deploy init
$ git push production master

git-cal (⭐1.1k)

68747470733a2f2f7261772e6769746875622e636f6d2f6b34727468696b2f6769742d63616c2f6d61737465722f73637265656e73686f74732f696d67322e706e67

git-hooks (⭐404)

$ git hooks --install
$ git hooks
Git hooks ARE installed in this repository.

Listing User, Project, and Global hooks:
---
/Users/stevemao/.git_hooks:

/GitHub/git-hooks/git_hooks:
commit-msg/signed-off-by     - Checks commit message for presence of Signed-off-by line.
pre-commit/bsd     - Check for the BSD license.

/GitHub/git-hooks/.githooks:

git-imerge (⭐2.7k)

imerge start

$ git imerge start --name=next --goal=merge --first-parent 4.0
Attempting automerge of 1-1...success.
Attempting automerge of 1-29...success.
Attempting automerge of 1-44...success.
Attempting automerge of 1-51...success.

imerge merge

$ git imerge merge 4.0
Attempting automerge of 1-1...success.
Attempting automerge of 1-6...success.
Attempting automerge of 1-9...success.
Attempting automerge of 1-10...success.

imerge rebase

$ git imerge rebase 4.0
The following commits on the to-be-merged branch are merge commits:
    8e4931ae15971a14897cf347ac50b7d7fe125ac4
    d7c772142ce663a20210db73d9ad17cc8d59e0d6
    856df83c77b33029d2ddfb8eecd08efedeadc027

imerge continue

$ git add --all
$ git commit
[imerge/next e442618] imerge 'next': manual merge 10-26
$ git imerge continue
Merge has been recorded for merge 10-26.
Attempting automerge of 10-27...success.
Attempting automerge of 10-42...failure.
Attempting automerge of 10-34...failure.
Attempting automerge of 10-30...success.
Recording autofilled block MergeState('next', tip1='master', tip2='4.0', goal='merge')[18:20,34:58].
Merge is complete!

imerge finish

$ git imerge finish
Previous HEAD position was fcbe161... imerge 'next': automatic merge 19-57
Switched to branch 'next'
[next 23362e6] Merge 4.0 into master (using imerge)
 Date: Wed Sep 2 10:59:56 2015 +1000

imerge diagram

$ git imerge diagram
********************
*????????.?????????|
*????????.?????????|
*????????.?????????|
*????????...-------+
*????????.*|#???????

imerge list

$ git imerge list
* next

imerge init

$ git imerge init --name=next --goal=merge --first-parent 4.0

imerge record

$ git imerge record
Merge has been recorded for merge 10-26.
Attempting automerge of 10-27...success.
Attempting automerge of 10-42...failure.
Attempting automerge of 10-34...failure.

imerge autofill

$ git imerge autofill
Attempting automerge of 1-1...success.
Attempting automerge of 1-29...success.
Attempting automerge of 1-44...success.

imerge simplify

$ git imerge simplify
Previous HEAD position was 4d19598... imerge 'next': automatic merge 20-57
Switched to branch 'next'
[next 6c308aa] Merge 4.0 into master (using imerge)
 Date: Wed Sep 2 13:37:31 2015 +1000

imerge remove

$ git imerge remove

imerge reparent

$ git imerge reparent
67ebc0e6517ac791de6699453b71d2c7fd81ffcd

git-issue (⭐767)

Initialize issue repository

$ git issue init
Initialized empty Issues repository in /home/dds/src/gi/.issues
$ git issue new -s 'New issue entered from the command line'
Added issue e6a95c9

Create a new issue (opens editor window)

$ git issue new
Added issue 7dfa5b7

List open issues

$ git issue list
7dfa5b7 An issue entered from the editor
e6a95c9 New issue entered from the command line

Add an issue comment (opens editor window)

$ git issue comment e6a95c9
Added comment 8c0d5b3

Add tag to an issue

$ git issue tag e6a9 urgent
Added tag urgent

Add two more tags

$ git issue tag e6a9 gui crash
Added tag gui
Added tag crash

Remove a tag

$ git issue tag -r e6a9 urgent
Removed tag urgent

Assign issue

$ git issue assign e6a9 [email protected]
Assigned to [email protected]

Add issue watcher

$ git issue watcher e6a9 [email protected]
Added watcher [email protected]

List issues tagged as gui

$ git issue list gui
e6a95c9 New issue entered from the command line

Push issues repository to a server

$ git issue git remote add origin [email protected]:dspinellis/gi-example.git
$ git issue git push -u origin master
Counting objects: 60, done.
Compressing objects: 100% (50/50), done.
Writing objects: 100% (60/60), 5.35 KiB | 0 bytes/s, done.
Total 60 (delta 8), reused 0 (delta 0)
To [email protected]:dspinellis/gi-example.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

Clone issues repository from server

$ git issue clone [email protected]:dspinellis/gi-example.git my-issues
Cloning into '.issues'...
remote: Counting objects: 60, done.
remote: Compressing objects: 100% (42/42), done.
remote: Total 60 (delta 8), reused 60 (delta 8), pack-reused 0
Receiving objects: 100% (60/60), 5.35 KiB | 0 bytes/s, done.
Resolving deltas: 100% (8/8), done.
Checking connectivity... done.
Cloned [email protected]:dspinellis/gi-example.git into my-issues

List open issues

$ git issue list
7dfa5b7 An issue entered from the editor
e6a95c9 New issue entered from the command line

Create new issue

$ git issue new -s 'Issue added on another host'
Added issue abc9adc

Push changes to server

$ git issue push
Counting objects: 7, done.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 767 bytes | 0 bytes/s, done.
Total 7 (delta 0), reused 0 (delta 0)
To [email protected]:dspinellis/gi-example.git
   d6be890..740f9a0  master -> master

Show issue added on the other host

$ git issue show 7dfa5b7
issue 7dfa5b7f4591ecaa8323716f229b84ad40f5275b
Author: Diomidis Spinellis <[email protected]>
Date:   Fri, 29 Jan 2016 01:03:24 +0200
Tags:   open

    An issue entered from the editor

    Here is a longer description.

Show issue and comments

$ git issue show -c e6a95c9
issue e6a95c91b31ded8fc229a41cc4bd7d281ce6e0f1
Author: Diomidis Spinellis <[email protected]>
Date:   Fri, 29 Jan 2016 01:03:20 +0200
Tags:   open urgent gui crash
Watchers:       [email protected]
Assigned-to: [email protected]

    New issue entered from the command line

comment 8c0d5b3d77bf93b937cb11038b129f927d49e34a
Author: Diomidis Spinellis <[email protected]>
Date:   Fri, 29 Jan 2016 01:03:57 +0200

    First comment regarding the issue.

Pull in remote changes (on the original host)

$ git issue pull
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 7 (delta 0), reused 7 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.
From github.com:dspinellis/gi-example
   d6be890..740f9a0  master     -> origin/master
Updating d6be890..740f9a0
Fast-forward
 issues/ab/c9adc61025a3cb73b0c67470b65cefc133a8d0/description | 1 +
 issues/ab/c9adc61025a3cb73b0c67470b65cefc133a8d0/tags        | 1 +
 2 files changed, 2 insertions(+)
 create mode 100644 issues/ab/c9adc61025a3cb73b0c67470b65cefc133a8d0/description
 create mode 100644 issues/ab/c9adc61025a3cb73b0c67470b65cefc133a8d0/tags

List open issues

$ git issue list
7dfa5b7 An issue entered from the editor
abc9adc Issue added on another host
e6a95c9 New issue entered from the command line

Sub-command auto-completion

$ git issue [Tab]
assign   clone    comment  git      init     log      pull     show     watcher
attach   close    edit     help     list     new      push     tag

Issue Sha auto-completion

$ git issue show [Tab]
7dfa5b7 - An issue entered from the editor
e6a95c9 - New issue entered from the command line

git-lfs (⭐13k)

$ git lfs track "*.mp3"
Tracking *.mp3

$ git lfs track "*.zip"
Tracking *.zip

$ git lfs track
Listing tracked paths
    *.mp3 (.gitattributes)
    *.zip (.gitattributes)

$ git lfs untrack "*.zip"
Untracking *.zip

$ git lfs track
Listing tracked paths
    *.mp3 (.gitattributes)

git-now (⭐182)

$ git now
[master 1bd9ce8] [from now] 2015/08/27 10:39:10
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git log
commit 1bd9ce878a76140f7db95afd9cfd4d7befbc7243
Author: Steve Mao <[email protected]>
Date:   Thu Aug 27 10:39:10 2015 +1000

    [from now] 2015/08/27 10:39:10

    diff --git a/package.json b/package.json
    index 8768569..540523a 100644
    --- a/package.json
    +++ b/package.json
    @@ -1,7 +1,7 @@
     {
       "name": "gulp",
       "description": "The streaming build system",
    -  "version": "3.9.0",
    +  "version": "3.10.0",
       "homepage": "http://gulpjs.com",
       "repository": "gulpjs/gulp",
       "author": "Fractal <[email protected]> (http://wearefractal.com/)",

git-plus (⭐196)

multi

$ git multi
--------------------------------------------------------------------------------
Executing git status -s
--------------------------------------------------------------------------------
chalk:
     M package.json

gulp:
     D index.js

relation

$ git relation origin/4.0
HEAD and origin/4.0 DIVERGED, common point is 657213a52d5e9c19b85df6a42f76341a98c08ae8

Commits from 657213a52d5e9c19b85df6a42f76341a98c08ae8 to HEAD:
Error retrieving log 657213a52d5e9c19b85df6a42f76341a98c08ae8..HEAD

old-branches

$ git old-branches -d 10
Branch 4.0 is older than 10 days (139.86)!

recent

$ git recent
      3.64 days: master
     11.63 days: dev

git-test (⭐203)

$ git test -v
4.0 ^origin/4.0 ^origin/master will test        2 commits
iter commit  tree    result
0000 57af4b0 f5ef0d8 pass (cached)
0001 10ed389 434370f pass

legit (⭐5.7k)

branches

$ git branches
   4.0                        (published)
   development                (unpublished)
   everything-is-not-awesome  (published)
*  master                     (published)
   old-master                 (published)

sync

$ git sync
Pulling commits from the server.
First, rewinding head to replay your work on top of it...
Fast-forwarded 4.0 to origin/4.0.
Pushing commits to the server.

switch

$ git switch master
Saving local changes.
Saved working directory and index state On developement: Legit: stashing before switching branches.
HEAD is now at f0fc4c7 Merge branch 'development'
Switching to master.
Your branch is up-to-date with 'origin/master'.
Restoring local changes.
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   package.json

no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{0} (86f5dc9066ff9f69c01c77e2f5a55643ad19f8f2)

publish

$ git publish
   4.0                        (published)
   changelog                  (published)
   everything-is-not-awesome  (published)
*  master                     (unpublished)
Branch None not found, using current branch master
Publishing master.
Branch master set up to track remote branch master from origin.

unpublish

$ git unpublish master
Unpublishing master.

git-when-merged (⭐431)

$ git when-merged a2c9e695ecf3600f21fa731e705fd1a0503632d9
refs/heads/master                      5a2ec1b1a6633f830bd4a2b1daab578c062e6975
$ git when-merged HEAD
refs/heads/master                      Commit is directly on this branch.

git-playback (⭐131)

$ git playback README.md

git-branch-status (⭐30)

$ git branch-status
 4.0       [57 ahead and 38 behind master]    [up to date with origin/4.0]
 master    [current branch]                   [1 ahead of origin/master]

git-open (⭐3.3k)

$ git open
> open https://github.com/REMOTE_ORIGIN_USER/CURRENT_REPO/tree/CURRENT_BRANCH

$ git open upstream
> open https://github.com/REMOTE_UPSTREAM_USER/CURRENT_REPO/tree/CURRENT_BRANCH

$ git open upstream master
> open https://github.com/REMOTE_UPSTREAM_USER/CURRENT_REPO/tree/master

git-my (⭐34)

$ git my

+------------------------------------------------------------------------------+
| your name's remote branches in git@repo:repopath/reponame.git                |
+------------------------------------------------------------------------------+

   local copy?  in master?  branch name
  ................[merged]. EC-242
  .....[local]....[merged]. commonjs-lazyload
  .....[local]............. enqueue-gpt
  ......................... defunct-ios-app-nag
  .....[local]............. factor-bundles

git-ink (⭐18)

$ git ink

• enqueue-gpt ........................................... 2015-08-31
• factor-bundles ........................................ 2015-10-14
    - Pull out more modules into node_modules
    - Works but does not provide any gains
• hbsfy ................................................. 2015-10-21
✓ master ................................................ 2015-10-22
• nda-ads4 .............................................. 2015-10-22
• remove-equalize_content_height ........................ 2015-10-21
• remove-exorcise ....................................... 2015-10-21
    - Need to DRY up exorcise function
    - Does not map properly when uglified
    - Need to undo postCSS mapping changes
• rm-convert_dates-order ................................ 2015-10-22
• sass-lint ............................................. 2015-10-14
    - module does not work

recursive-blame (⭐69)

$ git recursive-blame version package.json

Commit: 247479d017f138c26be27c64a0ce27f5f21fc0af
Author: Jeff Cross <[email protected]>
Date:   Tue Oct 13 15:58:13 2015 -0700 (7 weeks ago)
Path:   package.json
Match:  1 of 1

    chore(release): bump angular version to alpha.42

1) {
2)   "name": "angular",
3)   "version": "2.0.0-alpha.42",
4)   "branchPattern": "2.0.*",
5)   "description": "Angular 2 - a web framework for modern web apps",
6)   "homepage": "https://github.com/angular/angular",
7)   "bugs": "https://github.com/angular/angular/issues",

Next action [r,n,p,c,d,q,?]? r

Commit: bb9d299b3860f6d579192828451ccd7ace70e1d8
Author: Igor Minar <[email protected]>
Date:   Tue Oct 13 12:28:03 2015 -0700 (7 weeks ago)
Path:   package.json
Match:  1 of 1

    chore(release): bump angular version to alpha.41

1) {
2)   "name": "angular",
3)   "version": "2.0.0-alpha.41",
4)   "branchPattern": "2.0.*",
5)   "description": "Angular 2 - a web framework for modern web apps",
6)   "homepage": "https://github.com/angular/angular",
7)   "bugs": "https://github.com/angular/angular/issues",

hyper-blame

$ git hyper-blame -i 3ddda43c ipsum.txt
c6eb3bfa (lorem 2014-08-11 23:15:57 +0000  1) LOREM IPSUM DOLOR SIT AMET, CONSECTETUR
134200d1 (lorem 2014-04-10 08:54:46 +0000 2*) ADIPISCING ELIT, SED DO EIUSMOD TEMPOR
a34a1d0d (ipsum 2014-04-11 11:25:04 +0000 3*) INCIDIDUNT UT LABORE ET DOLORE MAGNA
134200d1 (lorem 2014-04-10 08:54:46 +0000 4*) ALIQUA. UT ENIM AD MINIM VENIAM, QUIS
c6eb3bfa (lorem 2014-08-11 23:15:57 +0000  5) NOSTRUD EXERCITATION ULLAMCO LABORIS
0f0d17bd (dolor 2014-06-02 11:31:48 +0000 6*) NISI UT ALIQUIP EX EA COMMODO CONSEQUAT.

git-word-blame

$ git word-blame README.md
results in /tmp/word-blame-output/
 - author_stats.tsv
 - commit_stats.tsv
 - word-blame-by-commit.html
 - word-blame-by-author.html
 - text-output

git word-blame on this README

git-fire (⭐4.3k)

$ git fire
Switched to a new branch '[email protected]'
On branch [email protected]
nothing to commit, working directory clean
Counting objects: 2, done.
Writing objects: 100% (2/2), 168 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To [email protected]:maochenyan/fire.git
 * [new branch]      [email protected] -> [email protected]
Branch [email protected] set up to track remote branch [email protected] from origin.


Leave building!

Git Town (⭐2.5k)

git hack

$ git hack my-branch
[main] git fetch --prune --tags

[main] git rebase origin/main

[main] git branch my-branch main

[main] git checkout my-branch

git sync

$ git sync
[my-branch] git fetch --prune --tags

[my-branch] git checkout main

[main] git rebase origin/main

[main] git checkout my-branch

[my-branch] git merge --no-edit main

[my-branch] git push -u origin my-branch
 * [new branch]      my-branch -> my-branch
Branch 'my-branch' set up to track remote branch 'my-branch' from 'origin'.

git new-pull-request

$ git new-pull-request
[my-branch] git fetch --prune --tags

[my-branch] git checkout main

[main] git rebase origin/main

[main] git checkout my-branch

[my-branch] git merge --no-edit origin/my-branch

[my-branch] git merge --no-edit main

open <url to create pull request for current branch>

git ship

[my-branch] git fetch --prune --tags

[my-branch] git checkout main

[main] git rebase origin/main

[main] git checkout my-branch

[my-branch] git merge --no-edit origin/my-branch

[my-branch] git merge --no-edit main

[my-branch] git checkout main

[main] git merge --squash my-branch

[main] git commit
 1 file changed, 2 insertions(+)

[main] git push

[main] git push origin :my-branch
 - [deleted]         my-branch

[main] git branch -D my-branch
Deleted branch my-branch (was 55cb0f7).

git-blame-someone-else (⭐11k)

$ git blame-someone-else 'Steve Mao <[email protected]>' 2efb4e3a061a2e8aaa58033e9c13c3e0e5fcde4b
Steve Mao  is now the author of 2efb4e3. You're officially an asshole.

diff-so-fancy (⭐17k)

$ git dsf

diff-highlight vs diff-so-fancy

git-stats (⭐6.4k)

git-secret (⭐3.7k)

git secret init

$ git secret init
'.gitsecret/' created.

git secret tell

$ git secret tell [email protected]
done. [email protected] added as a person who knows the secret.
cleaning up...

git secret add

$ git secret add hideme.txt
1 items added.

git secret list

$ git secret list
hideme.txt

git secret hide

$ git secret hide
done. all 1 files are hidden.

git secret reveal

$ git secret reveal

You need a passphrase to unlock the secret key for
user: "Test User <[email protected]>"
2048-bit RSA key, ID #######, created 2015-01-01 (main key ID #######)

gpg: gpg-agent is not available in this session
File `hideme.txt' exists. Overwrite? (y/N) y
done. all 1 files are revealed.

git-secrets (⭐12k)

Prevents you from committing passwords and other sensitive information to a git repository.

TBD - PR Welcome!

git-fixup (⭐247)

$ git diff --cached -U0
diff --git a/README.md b/README.md
index 0c700d1..7a57cef 100644
--- a/README.md
+++ b/README.md
@@ -1330 +1330 @@ $ git secret hide
-done. all 1 files are hidden.
+done. all 3 files are hidden.
$ git fixup 6d623f6525dd94b4aaea6f6ae2e7a59edc39bdb8
24aa3d9c10cc02fe813dc83d1ac792cc2e7d705d [F] add screenshot of git-stats <[email protected]>
6d623f6525dd94b4aaea6f6ae2e7a59edc39bdb8 [L] changed gif with text <[email protected]>

git-recent (⭐972)

$ git recent

git-recent screenshot

git-interactive-rebase-tool (⭐1.6k)

$ git rebase -i master

git-interactive-rebase-tool screenshot

git-fiddle (⭐202)

$ git fiddle -h
git-fiddle

Edit commit meta information during an *interactive* rebase.

`git-fiddle(1)' is a lightweight wrapper around `git-rebase(1)' that
annotates each commit with it's *author* date, the author name, as well
as the commit message. Changes to any of these will then be applied
using an 'exec' script during the git-rebase sequence.

Usage:
  $SCRIPT [--[no-]-fiddle-messages] [args...]

Options:
  --[no-]fiddle-messages Do not edit commit messages. Useful for quick edits
                         to author or date. This value can also be set using
                         `git config fiddle.messages`.
  [args...]              These arguments are passed verbatim to git-rebase.

git-user (⭐45)

# add a work profile for Henry
$ git user add work "Dr. Henry Jekyll" [email protected]
Added profile 'work'

# add a personal profile for Edward
$ git user add home "Edward Hyde" [email protected]
Added profile 'home'

# list out our saved profiles
$ git user list
Global Profile:
  User: Henry <[email protected]>

Saved Profiles:
  home: Edward Hyde <[email protected]>
  work: Dr. Henry Jekyll <[email protected]>

# set the current git repository user to the home profile
$ git user set home
The user for the 'project' repository has been set too 'Edward Hyde <[email protected]>'

# list profiles again, notice how the current repository profile is now set
$ git user
Project Profile:
  Path: /path/to/git/project
  User: Edward Hyde <[email protected]>

Saved Profiles:
  home: Edward Hyde <[email protected]>
  work: Dr. Henry Jekyll <[email protected]>

gitsome (⭐7.6k)

TBD - PR Welcome!

git-hound (⭐310)

TBD - PR Welcome!

git-recall (⭐2.1k)

$ git recall
# By default (without options), the command will display commits from yesterday and
# for the current user.

$ git recall -d 5 -a "Doge"
# Show all Doge's commits from 5 days ago.

$ git recall -d 5 -a "all"
# Show commits of all contributors from 5 days ago.

$ git recall -f
# Fetch commits beforehand.

git-standup (⭐7.6k)

$ git standup
2f50b39c - docs(commit messages): use commitizen to generate Conventional Commits (12 hours ago) <Steve Mao>
9af3600e - fix tests (12 hours ago) <Steve Mao>
7f17ba97 - docs: title case (12 hours ago) <Steve Mao>
a6d6203c - do not scroll when search is open (12 hours ago) <Steve Mao>
53fe681a - chore(pkg): add repo url (12 hours ago) <Steve Mao>
5e952ac0 - subtitle should be generic (13 hours ago) <Steve Mao>
adbc5423 - add ci/cd to readme. (13 hours ago) <Steve Mao>
a1097116 - add versioning to readme (14 hours ago) <Steve Mao>
6b6e7465 - add test coverage (15 hours ago) <Steve Mao>

commitizen (⭐17k)

$ git cz
[email protected], [email protected]


Line 1 will be cropped at 100 characters. All other lines will be wrapped after 100 characters.

? Select the type of change that you're committing: (Use arrow keys)
❯ feat:     A new feature
  fix:      A bug fix
  docs:     Documentation only changes
  style:    Changes that do not affect the meaning of the code (white-space, formatting, missing semi
-colons, etc)
  refactor: A code change that neither fixes a bug nor adds a feature
  perf:     A code change that improves performance
  test:     Adding missing tests or correcting existing tests

git-fresh (⭐507)

TBD - PR Welcome!

git-fs

$ git fs
Mounting readonly filesystem on ./git/fs

git-url

git url

$ cd ~/github/git-url.git
$ git url
Encoding... INPUT is next paragraph:

Protocol:  https
Site:      github.com
Repo:      zdharma/git-url
Revision:  master

gitu://ҝjȩMżEäḝЃȣϟṈӛŀї

$ git url -r v1.0
Encoding... INPUT is next paragraph:

Protocol:  https
Site:      github.com
Repo:      zdharma/git-url
Revision:  v1.0

gitu://ŪĪАϔEäḝЃȣϟṈӛŀї

$ git url -q -p lib/common.sh    # -q - quiet, -p - path
gitu://eḶȸṋ0oǗȟЗÛjȩMżEäḝЃȣϟṈӛŀї

$ git url //eḶȸṋ0oǗȟЗÛjȩMżEäḝЃȣϟṈӛŀї
Decoding... OUTPUT is:

Protocol:  https
Site:      github.com
Repo:      zdharma/git-url
Revision:  master
File:      lib/common.sh

https://github.com/zdharma/git-url

git guclone

$ git guclone ŪĪАϔEäḝЃȣϟṈӛŀї
Cloning URL https://github.com/zdharma/git-url for revision v1.0

Cloning into 'git-url'...
remote: Counting objects: 144, done.
remote: Compressing objects: 100% (111/111), done.
remote: Total 144 (delta 71), reused 102 (delta 32), pack-reused 0
Receiving objects: 100% (144/144), 116.43 KiB | 125.00 KiB/s, done.
Resolving deltas: 100% (71/71), done.

Checking out revision/reference v1.0... OK
HEAD is at: 5d10a204, created directory git-url

git-signatures (⭐152)

signatures add --push

$ git signatures add --push v1.0.0
Updated tag 'v1.0.0' (was 4de5afd)
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 906 bytes | 906.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To [email protected]:jsmith/test-signatures
   4b5300d..5b1f2cd  refs/notes/signatures -> refs/notes/signatures
 + 4de5afd...5b1f2cd v1.0.0 -> v1.0.0 (forced update)

signatures verify

$ git signatures verify v1.0.0

signatures verify --min-count 2

$ git signatures verify --min-count 2 v1.0.0
Failed to find enough verified signatures to satisfy: min_count=2

Signature verification could fail simply because your local gnupg
keychain and trustdb does not contain the required keys.

For detailed signature status run:

> git signatures show

signatures show

$ git signatures show v1.0.0
 Public Key ID    | Status     | Trust     | Date                         | Signer Name
=======================================================================================================================
01234567890ABCDEF | VALIDSIG   | ULTIMATE  | Sat Nov 10 13:16:10 EST 2018 | Steve Mao <[email protected]>

git-profile (⭐11)

add a work profile

$ git profile add work
Name: Name Surname
Email: [email protected]
Signing Key:
Profile work added successfully

add a personal profile

$ git profile add home -n "Name Surname" -e [email protected]
Profile home added successfully

list out our saved profiles

$ git profile list
Existing profiles:
work
home

set the current git repository user to the home profile

$ git profile use work

Currently there will be no output in case of success

git-revise (⭐747)

TBD - PR Welcome!

filter-repo (⭐8.2k)

TBD - PR Welcome!

git-jump (⭐201)

Interactive UI and fuzzy-search for Git branches.

git-jump interface demo

git-project

git project open shoppinglist
git project add shoppinglist milk
$ git project board

 Project: shoppinglist
+-----------+------+
|   OPEN    | DONE |
+-----------+------+
| something | love |
+-----------+------+
| coffee    |      |
+-----------+      +
| sugar     |      |
+-----------+      +
| milk      |      |
+-----------+------+
$ git project status

Project: shoppinglist
  0|  ⭐  something
  1|  ⭐  coffee
  2|  ⭐  sugar
  3|  ⭐  milk
  4|  ✅  love

git-branchcut (⭐8)

Delete branches with string pattern

$ git branchcut execute -p "feature/*"
Switched to branch 'main'
Deleted branch feature/test (was 257725f).
Deleted branch feature/impl (was 8120c0b).

Delete branches with day-offset

$ git branchcut execute -o 7
Switched to branch 'main'
Deleted branch bugfix/test (was e2afad6).
Deleted branch too-old-branch (was 1d3f82d).

git-exfiltrate (⭐21)

Break apart large branches into smaller ones

Assume a hypothetical project where you make changes to two software component folders in one feature-branch, you can use this tool to make that two branches with a preserved history for both.

git checkout feature-branch
./git-exfiltrate master feature-branch-extracted "component-folder/*"

The feature-branch-extracted branch will be created with just the contents of component-folder from the feature-branch changes.

*   e01009e  (main)
|
| * ce4ca64  (feature-branch-extracted)
| |  component-folder/1 | 20 +
| * f3bf092
| |  component-folder/1 | 20 +
* | 4b2ebd6
|/
|
| * d4c374e  (feature-branch)
| |  component-folder/1 | 20 +
| |  different-component-folder/2 | 100 -
| * 4724dbb
| |  component-folder/1 | 20 +
| |  different-component-folder/2 | 100 -
|/
* 927799f
* 219e9b2

git-spend (⭐11)

Collect and sum the /spend <duration> directives found in commit messages.

$ git spend sum
3 weeks 2 days 1 hour 37 minutes

Filter by author, range, and more

$ git spend sum --author stevemao --author [email protected] --since tags/v1.0.0
1 week 3 hours

License

CC0

To the extent possible under law, Steve Mao has waived all copyright and related or neighboring rights to this work.