-
-
Save chrismccoy/8775224 to your computer and use it in GitHub Desktop.
# alias to edit commit messages without using rebase interactive | |
# example: git reword commithash message | |
reword = "!f() {\n GIT_SEQUENCE_EDITOR=\"sed -i 1s/^pick/reword/\" GIT_EDITOR=\"printf \\\"%s\\n\\\" \\\"$2\\\" >\" git rebase -i \"$1^\";\n git push -f;\n}; f" | |
# sort list of git repos with gh cli | |
gh repo list --limit 300 --json name -q '.[].name' | sort | |
# count total commits in a repo | |
git rev-list --all --count | |
# edit all commit messages | |
git rebase -i --root | |
# clone all your repos with gh cli tool | |
gh repo list --json name -q '.[].name' | xargs -n1 gh repo clone | |
# List all files in a folder in a git repository by last commit date | |
git ls-tree --name-only HEAD | while read filename; do echo "$(git log -1 --format="%ci " -- $filename) $filename"; done | sort -r | |
# zip up an archive of each commit | |
for i in `git log --format=%H`; do git archive $i --format=zip -o $i.zip; done | |
# zip up an archive of each commit | |
git rev-list --all | while read h; do git archive --format zip -o $h.zip $h; done | |
# zip up an archive of each commit with number of commit added to hash | |
git rev-list --all --reverse | while read h; do git archive --format=zip -o commit$((i=i+1))-$h.zip $h; done | |
# List all files in a folder in a git repository by last commit date | |
git ls-tree --name-only HEAD foldername/ | while read filename; do echo "$(git log -1 --format="%ci " -- $filename) $filename"; done | sort -r | |
# plot commits per hour | |
git log --format=format:'%ai' --all | cut -d " " -f 2 | cut -d ":" -f 1 | sort | uniq -c | gnuplot -e "set output 'commits-per-hour.png'; set term png truecolor giant; set ylabel 'Commits'; set grid y; set boxwidth 0.9 relative; set style fill transparent solid 1.0 noborder; plot '-' using 1:xtic(2) with boxes lc rgb'green' notitle;" | |
# list all tags | |
git fetch --all --tags --prune | |
# sort git tags by date | |
git for-each-ref --sort=taggerdate --format '%(tag)_,,,_%(taggerdate:raw)_,,,_%(taggername)_,,,_%(subject)' refs/tags | awk 'BEGIN { FS = "_,,,_" } ; { t=strftime("%Y-%m-%d %H:%M",$2); printf "%-20s %-18s %-25s %s\n", t, $1, $4, $3 }' | |
# delete all local tags, and update with list of remote tags | |
git tag -l | xargs git tag -d && git fetch -t | |
# get list of all author's emails of the repo | |
git log --format="%ae" | uniq | |
# shortform git commands | |
alias g='git' | |
# show contents of all git objects in a git repo | |
find .git/objects/ -type f \| sed 's/\.git\/objects\/\///' | sed 's/\///g' | xargs -n1 -I% echo echo "%" \$\(git cat-file -p "%"\) \0 | xargs -n1 -0 sh -c | |
# push all branches to all remotes | |
git remote | xargs -L1 git push --all | |
# count lines of .js code in a repo | |
git ls-files | grep \\.js$ | xargs wc -l | |
# pretty tab'd git log | |
git log --graph --pretty="tformat:%h*(%ar)*<%an>*%d %s" $* | sed -Ee 's/(^[^<]*) ago\)/\1)/' | sed -Ee 's/(^[^<]*), [[:digit:]]+ .*months?\)/\1)/' | column -s '*' -t | cat | |
# change author of all git repos | |
git filter-branch -f --env-filter "GIT_AUTHOR_NAME='yourname'; GIT_AUTHOR_EMAIL='[email protected]'; GIT_COMMITTER_NAME='yourname'; GIT_COMMITTER_EMAIL='[email protected]';" HEAD; | |
# stage only deleted files | |
git ls-files --deleted | xargs git add | |
# scan repo for dangerous Amazon Web Service IDs | |
git ls-tree --full-tree -r --name-only HEAD | xargs egrep -w '[A-Z0-9]{20}' | |
# remove .DS_Store from the repository | |
find . -name .DS_Store -exec git rm --ignore-unmatch --cached {} + | |
# push current branch | |
git push origin "$(git branch|grep '\*'|tr -d '* \n')" | |
# git remote all remotes except origin | |
git remote -v | grep "(fetch)" | sed -e 's#[[:blank:]].*##g' | grep -v "origin" | xargs -n 1 git remote rm | |
# print all git repos for a user | |
curl -s https://api.github.com/users/wordpress/repos?per_page=1000 | grep git_url |awk '{print $2}'| sed 's/"\(.*\)",/\1/' | |
# print all git repos for a user | |
curl -s https://api.github.com/users/wordpress/repos?per_page=1000 | jq -r '.[].git_url' | |
# show GIT Remote Origin for each immediate subfolder | |
find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && echo '{}' && git config --get remote.origin.url" \; | |
# find all git repositories and perform a pull operation on them. | |
find . -name ".git" -type d -exec bash -c "echo '{}' && cd '{}'/.. && git pull" \; | |
# print your list of commits this month for a repo | |
git log --since='last month' --author="$(git config user.name)" --oneline | |
# print the url for the current repo | |
git remote -v | sed -n '/github.com.*push/{s/^[^[:space:]]\+[[:space:]]\+//;s|[email protected]:|https://github.com/|;s/\.git.*//;p}' | |
# pull in remote changes for the current repository and all its submodules | |
git pull; git submodule foreach git pull origin master | |
# get a list of all commit messages for a repo | |
git log --pretty=format:'%s' | |
# pull all git repos to current version | |
find . -name .git -type d -execdir git pull -v | |
# pull all git repos to currenrt version | |
find $(git rev-parse --show-toplevel 2> /dev/null) -name .git -type d -execdir git pull; | |
# find the nearest parent branch of the current git branch | |
git show-branch -a | grep '\*' | grep -v `git rev-parse --abbrev-ref HEAD` | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//' | |
# push changes to an empty git repository for the first time | |
git push --set-upstream origin master | |
# delete first 10 branches of remote excluding master | |
git branch -a | grep "remotes/origin" | grep -v master | sed 's/^[ *]*//' | sed 's/remotes\/origin\///' | head -n10 | sed 's/^/git push origin :/' | |
# Remove + and - from start of diff lines | |
git diff --color | sed "s/^\([^-+ ]*\)[-+ ]/\\1/" | less -r | |
# clear out git hooks | |
find .git/hooks -type l -exec rm {} \; && find .githooks -type f -exec ln -sf ../../{} .git/hooks/ \; | |
# remove untracked files in a git repository | |
git status -su | cut -d' ' -f2- | tr '\n' '\0' | xargs -0 rm | |
# get most modified files and counts | |
git log --all -M -C --name-only --format='format:' "$@" | sort | grep -v '^$' | uniq -c | sort | awk 'BEGIN {print "count\tfile"} {print $1 "\t" $2}' | sort -g | |
# Locally checkout all remote branches of a repository | |
git branch -r | cut -d '/' -f2 | grep -Ev '( |master)' | xargs -Ibranch git checkout -b branch origin/branch | |
# Open current Git repository URL | |
open `git remote -v | awk '/fetch/{print $2}' | sed -Ee 's#(git@|git://)#http://#' -e 's@com:@com/@'`| head -n1 | |
# Remove Git from current project | |
find . -name '.git' -exec rm -rf {} \; | |
# Remove all new files | |
for file in $(git status | grep "new file" | sed "s/#\tnew file://"); do git rm --cached $file; done | |
# Delete all remote branches | |
for remote_branch in $(git ls-remote); do if [[ $remote_branch =~ .*(feature/MAGENTA-([0-9|^130]).+).* ]]; then git push origin :${BASH_REMATCH[1]}; fi; done | |
# Removes all local branch | |
for branch in $(git branch | grep "feature/MAGENTA-"); do git branch -D $branch; done | |
# get list of followers from github username | |
curl -s https://api.github.com/users/username/followers | grep '\"login\"' | sed -e's/[,|"|:]//g' | awk '{print $(NF)}' | sort | |
# git commit random alias | |
git config --global alias.commit-random '!git commit -m "$(curl -s http://whatthecommit.com/index.txt)"' | |
usage: git commit-random | |
# get list of users public repos | |
curl "https://api.github.com/users/usernamehere/repos?type=owner&sort=updated" -s | sed -En 's|"name": "(.+)",|\1|p' | tr -d ' ' | |
# count relevant lines of shell code in a git repo | |
egrep -v '^\s*($|#)' $(git grep -l '#!/bin/.*sh' *) | wc -l | |
# push all remotes | |
for i in `git remote`; do git push $i; done; | |
# cherry pick range of commits, starting from the tip of 'master', into 'preview' branch | |
git rev-list --reverse --topo-order master... | while read rev; do git checkout preview; git cherry-pick $rev || break; done | |
# create tracking branches for all remote branches | |
git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs; | |
# git reset newly added files | |
for f in `git status | grep new | awk '{print $3}'`; do git reset HEAD $f ; done | |
# git reset newly added files | |
git reset HEAD -- $(git status | awk '/new file:/{print $3}') | |
# pull latest of all submodules | |
git submodule foreach git pull origin master | |
# show a git log with offsets relative to HEAD | |
git log --oneline | nl -v0 | sed 's/^ \+/&HEAD~/' | |
# list offsets from HEAD with git log | |
o=0; git log --oneline | while read l; do printf "%+9s %s\n" "HEAD~${o}" "$l"; o=$(($o+1)); done | less | |
# diff the last 2 commits | |
git diff $(git log --pretty=format:%h -2 --reverse | tr "\n" " ") | |
# reset the last modified time for each file in a git repo to its last commit time | |
git ls-files | while read file; do echo $file; touch -d $(git log --date=local -1 --format="@%ct" "$file") "$file"; done | |
# get author and email of a commit | |
git --no-pager show -s --format='%an <%ae> on %cd' --date=short {commithash} | |
# information about an author by giving it's name or email | |
git log -i -1 --pretty="format:%an <%ae>\n" --author="$1" | |
# List all files ever existed | |
git log --pretty=format: --name-status $@ | cut -f2- | sort -u | |
# commit all changes | |
git add -A && git commit -av | |
# print git commit history | |
git log --oneline --decorate | nl | sort -nr | nl | sort -nr | cut --fields=1,3 | sed 's/([^)]*)\s//g' | |
# print git commit history | |
git log --oneline --decorate | tac | nl | tac | sed 's/([^)]*)\s//g' | |
# find the date of the first commit in a repo | |
git log --pretty=format:'%ad' | tail -1 | |
# delete all local git branches that have been merged | |
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d | |
# delete all git branches except master | |
git branch | egrep -v ^master$ | sed 's/^[ *]*//' | sed 's/^/git branch -D /' | bash | |
# delete all git branches except master | |
git branch | grep -v "master" | sed 's/^[ *]*//' | sed 's/^/git branch -D /' | bash | |
# delete all git branches except master | |
git checkout master; git branch | sed -e '/master/d' -e 's/^/git branch -D /' | bash | |
# export current repo to zip archive | |
git archive -o "${PWD##*/}.zip" HEAD | |
# figure out what pull requests are in your current branch (staging) but not yet in master | |
git log HEAD...origin/master --pretty=oneline | grep pull | |
# remove missing files | |
git ls-files -d -z | xargs -0 git update-index --remove | |
# list authors of a repo | |
git shortlog -sn --all | cut -f2 | cut -f1 -d' ' | |
# remove file from repo history | |
git filter-branch -f --tree-filter 'rm -rf filename.py' HEAD | |
# list repos by username | |
curl "https://api.github.com/users/username/repos?type=owner&sort=updated" -s | sed -En 's|"name": "(.+)",|\1|p' | awk '{print $1}' | |
# fetch all git remotes for a repo | |
git branch -r | awk -F'/' '{print "git fetch "$1,$2}' | xargs -I {} sh -c {} | |
# add a tag | |
git tag -a 1.2 -m "Version 1.2 Stable" | |
# show which branches are tracking what | |
git for-each-ref --format='%(refname:short)' refs/heads/* | while read b; do if r=$(git config --get branch.$b.remote); then m=$(git config --get branch.$b.merge); echo "$b -> $r/${m##*/}"; fi; done | |
# push tags | |
git push --tags | |
# download all files from a gist without git | |
curl -L https://gist.github.com/username/gistid/download | tar -xvz --strip-components=1 | |
# delete a local branch | |
git branch -d branchname | |
# delete a remote branch | |
git push origin --delete branchname | |
# list props for repo | |
git log -i --grep props | egrep -io 'props (to )?[a-z0-9_\-]*' | sed 's/.* //' | sort | uniq -c | sort -k1nr | |
# Undo your last commit, but don't throw away your changes | |
git reset --soft HEAD^ | |
# Delete all local branches that have been merged into HEAD | |
git branch -d `git branch --merged | grep -v '^*' | grep -v 'master' | tr -d '\n'` | |
# credit author on last commit | |
git commit --amend --author "$1 <$2>" -C HEAD | |
# Show the diff of everything you haven't pushed yet. | |
branch=$(git rev-parse --abbrev-ref HEAD) git diff origin/$branch..HEAD | |
# determine current branch | |
git branch | awk '/\*/{print $2}' | |
# check which branches had the latest commits | |
git for-each-ref --sort=-committerdate --format='%(refname:short) %(committerdate:short)' | |
# search all commit messages for a string | |
git rev-list --all | xargs git grep -F 'string' | |
# create a git.io short url | |
curl -s -F "url=http://github.com/twitter" -i http://git.io | sed -n 's/Location:.* //p' | |
# find the most verbs used in commit messages | |
git log --pretty=format:'%s' | cut -d " " -f 1 | sort | uniq -c | sort -nr | |
# find the most verbs used in commit messages | |
git log --oneline | awk '{ print $2; }' | sort | uniq -c | sort -r | |
# get current author and email of the repo | |
git log -1 --pretty="format:%an <%ae>" --author="$1" | |
# verify all packed objects and find the 5 biggest ones | |
git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | |
# delete all tags | |
for t in `git tag` do; git push origin :$t; git tag -d $t; done | |
# compress all repos | |
find . -path '*.git/config' -execdir git gc --aggressive \; | |
# remove .DS_Store from the repository you happen to staging by mistake | |
find . -name .DS_Store -exec git rm --ignore-unmatch --cached {} + | |
# Delete all local branches that have been merged into HEAD. | |
git branch -d `git branch --merged | grep -v '^*' | grep -v 'master' | tr -d '\n'` | |
# Credit an author on the last commit | |
git commit --amend --author "John Doe <[email protected]>" -C HEAD | |
# pretty git log | |
git log --graph --pretty=format:'%Cred%h%Creset %an: %s - %Creset %C(yellow)%d%Creset %Cgreen(%cr)%Creset' --abbrev-commit --date=relative | |
# delete local files that have been removed from git repo | |
git status | grep deleted | awk '{\$1=\$2=\"\"; print \$0}' | perl -pe 's/^[ \t]*//' | sed 's/ /\\\\ /g' | xargs git rm | |
# list all files ever added to a git repo | |
git log --name-status --oneline --all | grep -P "^[A|M|D]\s" | awk '{print $2}' | sort | uniq | |
# get current branch | |
git branch | grep "^*" | sed 's/* //g' | |
# stage manually deleted files | |
git status | grep deleted | sed 's/deleted://g' | sed 's/[#| ]//g' | xargs git rm | |
# show path to the root of the repo | |
git rev-parse --show-toplevel | |
# recommit last commit | |
LAST_MESSAGE=`git log -1 --pretty="format:%s"`; git commit -m "$LAST_MESSAGE" --amend --date "`date`" | |
# Get a list of all TODO/FIXME tasks left to be done in your project | |
alias tasks='grep --exclude-dir=.git -rEI "TODO|FIXME" . 2>/dev/null' | |
# edit your gitignore from anywhere in your repo | |
vim $(git rev-parse --show-toplevel)/.gitignore | |
# simple single-lined git log | |
git log --pretty=oneline --abbrev-commit | |
# Lint Git unstaged PHP files | |
git status -s | grep -o ' \S*php$' | while read f; do php -l $f; done | |
# 100% rollback files to a specific revision | |
git reset --hard <commidId> && git clean -f | |
# Print out the contents of a Git repository (useful for broken repositories) | |
find .git/objects -type f -printf "%P\n" | sed s,/,, | while read object; do echo "=== $obj $(git cat-file -t $object) ==="; git cat-file -p $object; done | |
# Show git branches by date - useful for showing active branches | |
git for-each-ref --sort='-authordate' --format='%(refname)%09%(authordate)' refs/heads | sed -e 's-refs/heads/--' | |
# git log with color and path | |
alias gitlog='git log -10 --graph --date-order -C -M --pretty=format:"%C(yellow)%h%C(reset) - %C(bold green)%ad%C(reset) - %C(dim yellow)%an%C(reset) %C(bold red)>%C(reset) %C(white)%s%C(reset) %C(bold red)%d%C(reset) " --abbrev-commit --date=short' | |
# open (in vim) all modified files in a git repository | |
git status --porcelain | sed -ne 's/^ M //p' | tr '\n' '\0' | tr -d '"' | xargs -0 vim | |
# open (in vim) all modified files in a git repository | |
vim `git status --porcelain | sed -ne 's/^ M //p'` | |
# open (in vim) all modified files in a git repository | |
vim `git status | grep modified | awk '{print $3}'` | |
# open (in vim) all modified files in a git repository | |
vim -p `git --porcelain | awk {print $2}` | |
# stage all manually deleted files | |
for x in `git status | grep deleted | awk '{print $3}'`; do git rm $x; done | |
# generate file list modified since last commit and export to tar file | |
git diff-tree -z -r --no-commit-id --name-only --diff-filter=ACMRT COMMID_HASH | xargs -0 tar -rf list.tar | |
# export unpushed files list | |
git log -z origin/master..master --name-only --pretty="format:" | sort -zu | xargs -0 tar -rf list.tar | |
# Count the lines of each file extenion in a list of files | |
git ls-files | xargs wc -l | awk -F ' +|\\.|/' '{ sumlines[$NF] += $2 } END { for (ext in sumlines) print ext, sumlines[ext] }' | |
# Show git commit history | |
git reflog show | grep '}: commit' | nl | sort -nr | nl | sort -nr | cut --fields=1,3 | sed s/commit://g | sed -e 's/HEAD*@{[0-9]*}://g' | |
# Restore deleted file from GIT repository | |
git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file" | |
# Number of commits per day in a git repo | |
git log | grep Date | awk '{print " : "$4" "$3" "$6}' | uniq -c | |
# Remove git branches that do not have a rmote tracking branch anymore | |
git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d | |
# Remove .git dirs | |
find . -name ".git" -type d -exec rm -rf {} \; | |
# Top Ten of the most active committers in git repositories | |
git shortlog -s | sort -rn | head | |
# git - create a local branch that tracks with the remote branch | |
git checkout -tb mybranch origin/mybranch | |
# Prints per-line contribution per author for a GIT repository | |
git ls-files | xargs -n1 git blame --line-porcelain | sed -n 's/^author //p' | sort -f | uniq -ic | sort -nr | |
# Git Tree Command with color and tag/branch name | |
git log --graph --oneline --all --decorate --color | |
# Open the current project on Github by typing gh | |
git remote -v | grep fetch | sed 's/\(.*github.com\)[:|/]\(.*\).git (fetch)/\2/' | awk {'print "https://github.com/" $1'} | xargs open | |
# Show git branches by date - useful for showing active branches | |
for k in $(git branch | sed /\*/d); do echo "$(git log -1 --pretty=format:"%ct" $k) $k"; done | sort -r | awk '{print $2}' | |
# Update (pull commits from) all submodules | |
git submodule foreach git pull --ff-only origin master | |
# commit message generator - whatthecommit.com | |
curl http://whatthecommit.com/index.txt | |
# Create tarball of files modified in git | |
tar czf git_mods_circa_dec23.tgz --files-from <(git ls-files -m) | |
# Sequential revision numbers in Git | |
git rev-list --reverse HEAD | awk "/$(git log -n 1 --pretty="format:%h")/ {print NR}" | |
# commit message generator - whatthecommit.com | |
curl -s 'http://whatthecommit.com/' | grep '<p>' | cut -c4- | |
# Show git branches by date - useful for showing active branches | |
for k in `git branch|sed s/^..//`;do echo -e `git log -1 --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" "$k" --`\\t"$k";done|sort | |
# git Output remote origin from within a local repository | |
git config --local --get remote.origin.url | |
# delete local *and* remote git repos if merged into local master | |
git branch | cut -c3- | grep -v "^master$" | while read line; do git branch -d $line; done | grep 'Deleted branch' | awk '{print $3;}' | while read line; do git push <target_remote> :$line; done | |
# Using Git, stage all manually deleted files. | |
git add -u | |
# Pull git submodules in parallel using GNU parallel | |
parallel -j4 cd {}\; pwd\; git pull :::: <(git submodule status | awk '{print $2}') | |
# bash script to zip a folder while ignoring git files and copying it to dropbox | |
git archive HEAD | gzip > ~/Dropbox/archive.tar.gz | |
# Push each of your local git branches to the remote repository | |
git push origin --all | |
# Deleting a remote git branch (say, by name 'featureless') | |
git push origin :featureless | |
# git-rm for all deleted files, including those with space/quote/unprintable characters in their filename/path | |
git ls-files -z -d | xargs -0 git rm -- | |
# GIT: list unpushed commits | |
git log --oneline <REMOTE>..<LOCAL BRANCH> | |
# commit message generator - whatthecommit.com | |
lynx -dump -nolist http://whatthecommit.com/|sed -n 2p | |
# commit message generator - whatthecommit.com | |
curl -s http://whatthecommit.com | html2text | sed '$d' | |
# commit message generator - whatthecommit.com | |
curl -s http://whatthecommit.com | sed -n '/<p>/,/<\/p>/p' | sed '$d' | sed 's/<p>//' | |
# telling you from where your commit come from | |
function where(){ COUNT=0; while [ `where_arg $1~$COUNT | wc -w` == 0 ]; do let COUNT=COUNT+1; done; echo "$1 is ahead of "; where_arg $1~$COUNT; echo "by $COUNT commits";};function where_arg(){ git log $@ --decorate -1 | head -n1 | cut -d ' ' -f3- ;} | |
# Show the changed files in your GIT repo | |
git status | perl -F'\s' -nale 'BEGIN { $a = 0 }; $a = 1 if $_ =~ /changed but not updated/i; print $F[-1] if ( $a && -f $F[-1] )' | |
# Search git repo for specified string | |
git grep "search for something" $(git log -g --pretty=format:%h -S"search for something") | |
# Get first Git commit hash | |
git log --pretty=format:%H | tail -1 | |
# Get first Git commit hash | |
git log --format=%H | tail -1 | |
# List all authors of a particular git project | |
git log --format='%aN <%aE>' | awk '{arr[$0]++} END{for (i in arr){print arr[i], i;}}' | sort -rn | cut -d\ -f2- | |
# See all the commits for which searchstring appear in the git diff | |
git log -p -z | perl -ln0e 'print if /[+-].*searchedstring/' | |
# List every file that has ever existed in a git repository | |
git log --all --pretty=format:" " --name-only | sort -u | |
# git pull all repos | |
find ~ -maxdepth 2 -name .git -print | while read repo; do cd $(dirname $repo); git pull; done | |
# Add .gitignore files to all empty directories recursively from your current directory | |
find . \( -type d -empty \) -and \( -not -regex ./\.git.* \) -exec touch {}/.gitignore \; | |
# Display condensed log in a tree-like format. | |
git log --graph --pretty=oneline --decorate | |
# List all authors of a particular git project | |
git log --format='%aN' | sort -u | |
# List all authors of a particular git project | |
git shortlog -s | cut -c8- | |
# Show git branches by date - useful for showing active branches | |
for k in `git branch|sed s/^..//`;do echo -e `git log -1 --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" "$k"`\\t"$k";done|sort | |
# Move all files untracked by git into a directory | |
git clean -n | sed 's/Would remove //; /Would not remove/d;' | xargs mv -t stuff/ | |
# Prints per-line contribution per author for a GIT repository | |
git ls-files | while read i; do git blame $i | sed -e 's/^[^(]*(//' -e 's/^\([^[:digit:]]*\)[[:space:]]\+[[:digit:]].*/\1/'; done | sort | uniq -ic | sort -nr | |
# Prints per-line contribution per author for a GIT repository | |
git ls-files | xargs -n1 -d'\n' -i git-blame {} | perl -n -e '/\s\((.*?)\s[0-9]{4}/ && print "$1\n"' | sort -f | uniq -c -w3 | sort -r | |
# Makes a project directory, unless it exists; changes into the dir, and creates an empty git repository, all in one command | |
gitstart () { if ! [[ -d "$@" ]]; then mkdir -p "$@" && cd "$@" && git init; else cd "$@" && git init; fi } | |
# git Revert files with changed mode, not content | |
git diff --numstat | awk '{if ($1 == "0" && $2 == "0") print $3}' | xargs git checkout HEAD | |
# Show changed files, ignoring permission, date and whitespace changes | |
git diff --numstat -w --no-abbrev | perl -a -ne '$F[0] != 0 && $F[1] !=0 && print $F[2] . "\n";' | |
# Show (only) list of files changed by commit | |
git show --relative --pretty=format:'' --name-only HASH | |
# Stage only portions of the changes to a file. | |
git add --patch <filename> | |
# Show log message including which files changed for a given commit in git. | |
git --no-pager whatchanged -1 --pretty=medium <commit_hash> | |
# search string in _all_ revisions | |
for i in `git log --all --oneline --format=%h`; do git grep SOME_STRING $i; done | |
# git remove files which have been deleted | |
git ls-files -z --deleted | xargs -0 git rm | |
# Show git branches by date - useful for showing active branches | |
for k in `git branch|perl -pe s/^..//`;do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k|head -n 1`\\t$k;done|sort -r | |
# add forgotten changes to the last git commit | |
git commit --amend | |
# git remove files which have been deleted | |
git rm $(git ls-files --deleted) | |
# git diff of files that have been staged ie 'git add'ed | |
git diff --cached | |
# add untracked/changed items to a git repository before doing a commit and/or sending upstream | |
git status|awk '/modified:/ { printf("git add %s\n",$3) }; NF ==2 { printf("git add %s\n",$2) }'|sh | |
# Better git diff, word delimited and colorized | |
git config alias.dcolor "diff --color-words" | |
# Better git diff, word delimited and colorized | |
git diff -U10|dwdiff --diff-input -c|less -R | |
# Better git diff, word delimited and colorized | |
git diff -U10 |wdiff --diff-input -a -n -w $'\e[1;91m' -x $'\e[0m' -y $'\e[1;94m' -z $'\e[0m' |less -R | |
# Count git commits since specific commit | |
git log --pretty=oneline b56b83.. | wc -l | |
# Count git commits since specific commit | |
git log --summary 223286b.. | grep 'Author:' | wc -l | |
# Execute git submodule update in parallel with xargs | |
git submodule status | awk '{print $2}' | xargs -P5 -n1 git submodule update --init | |
# Incorporating a finished feature on develop | |
git checkout develop; git merge --no-ff myfeature | |
# Creating a feature branch | |
git checkout -b myfeature develop | |
# My Git Tree Command! | |
git log --graph --oneline --all | |
# show git logging | |
git log --stat | |
# Create a git archive of the latest commit with revision number as name of file | |
git archive HEAD --format=zip -o `git rev-parse HEAD`.zip | |
# List files under current directory, ignoring repository copies. | |
function have_here { find "${@:-.}" -type d \( -name .git -o -name .svn -o -name .bzr -o -name CVS -o -name .hg -o -name __pycache__ \) -prune -o -type f -print; } | |
# revert the unstaged modifications in a git working directory | |
git diff | git apply --reverse | |
#commit message generator | |
curl -s http://whatthecommit.com/ | tr -s '\n' ' ' | grep -so 'p>\(.*\)</p' | sed -n 's/..\(.*\)..../\1/p' | |
# random git commit message | |
git-random(){ gitRan=$(curl -L -s http://whatthecommit.com/ |grep -A 1 "\"c" |tail -1 |sed 's/<p>//'); git commit -m "$gitRan"; } | |
# rename a branch | |
git branch -m old_branch new_branch | |
# set upstream for existing branch | |
git branch --set-upstream <branch> <remote>/<branch> | |
# checkout remote branch | |
git checkout -b test origin/test | |
# pretty git commit log | |
git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short | |
# make git HEAD same as origin/master | |
git reset --hard origin/master | |
# delete a remote branch | |
git push origin :heads/branch_name | |
# revert uncommited git changes | |
git reset --hard HEAD | |
# add .gitignore to enable add empty directory to git | |
for i in $(find . -type d -regex ``./[^.].*'' -empty); do touch $i"/.gitignore"; done; | |
# list files between git commits | |
git diff --name-only 4ce07ee 7cdf78b | |
# list all branches | |
git branch -a | |
# install a new git repo | |
function gitinstall(){ git init; git remote add origin "$@"; git config branch.master.remote origin; git config branch.master.merge refs/heads/master; git pull;} | |
# git recursive rm | |
git ls-files -d -z | xargs -0 git update-index --remove | |
# undo last git commit | |
git reset --soft HEAD^ | |
# find deleted stashes and other lost commits in git | |
git fsck --no-reflog | awk '/dangling commit/ {print $3}' | |
# git apply patch | |
git format-patch -k --stdout rev1-1..rev2 | git am -k -3 | |
# git cat | |
git cat-file -p $(git ls-tree $1 "$2" | cut -d " " -f 3 | cut -f 1) | |
# list unmerged files | |
git ls-files -u|awk '{print $4}'|sort -u | |
# list added files in the index | |
git diff-index HEAD|awk '{print $5 " " $6}'|sed -n -e's/^A //p' | |
# print number of modified files | |
git status --porcelain | cut -c 1-2 | grep M | wc -l | tr -d " " | |
# show all remote git branches | |
git remote show origin | |
# fancy git prompt | |
parse_git_branch() { | |
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(git::\1)/' | |
} | |
export PS1="\[\033]0;\h \w \$(parse_git_branch) \007\][\[\033[01;35m\]\h \[\033[01;34m\]\w \[\033[31m\]\$(parse_git_branch)\[\033[00m\]]$ " | |
# Recursively remove all untracked files in the tree. | |
git clean -f | |
# throw out all of your changes to existing files, but not new ones | |
git reset --hard | |
# remove file from staging area | |
git rm --cached [file] | |
# see diff of files in staging area | |
git diff --staged | |
# see tracked files | |
git ls-files | |
# see a branch graph | |
git log --graph | |
# see all tags | |
git tag | |
# see list of deleted files | |
git ls-files -d | |
# restore all deleted files | |
git ls-files -d | xargs git checkout -- | |
# view commits not yet pushed to remote | |
git log --branches --not --remotes | |
# difference between two branches | |
git diff --stat --color master..branch | |
# see a list of all objects | |
git rev-list --objects --all | |
# remove file from index | |
git rm --cached filename.txt |
Thanks, very helpful.
thanks
Wow. This is super useful! Thanks
Hello Chris, I am a newbie to Git and to it’s commands. Very helpful commands. I have one requirement where I need to fetch the list of commit ids from the RELEASE branch created by a specific development branch. Assume that the development branch has been checked in multiple times to the RELEASE branch based on multiple requirements. To help me, is there a Git command to fetch the commit id's as per the requirement.
git rev-list --all will get all commit ids
So, I whipped up a little shell script to sort of streamline creating feature branches. I threw this into my bash profile and run it with an alias fb
. feature-brancher.sh
Curious, do any of you have shell scripts to improve productivity? If so, please share a link.
Hello Chris, I am a newbie to Git and to it’s commands. Very helpful commands. I have one requirement where I need to fetch the list of commit ids from the RELEASE branch created by a specific development branch. Assume that the development branch has been checked in multiple times to the RELEASE branch based on multiple requirements. To help me, is there a Git command to fetch the commit id's as per the requirement.