#!/bin/sh USAGE="[-a] [-r] [-m] [-t] [-n] [-b ] " LONG_USAGE="git-resurrect attempts to find traces of a branch tip called , and tries to resurrect it. Currently, the reflog is searched for checkout messages, and with -r also merge messages. With -m and -t, the history of all refs is scanned for Merge into other/Merge into (respectively) commit subjects, which is rather slow but allows you to resurrect other people's topic branches." OPTIONS_KEEPDASHDASH= OPTIONS_STUCKLONG= OPTIONS_SPEC="\ git resurrect $USAGE -- b,branch= save branch as instead of a,all same as -l -r -m -t k,keep-going full rev-list scan (instead of first match) l,reflog scan reflog for checkouts (enabled by default) r,reflog-merges scan for merges recorded in reflog m,merges scan for merges into other branches (slow) t,merge-targets scan for merges of other branches into n,dry-run don't recreate the branch" . git-sh-setup search_reflog () { sed -ne 's~^\([^ ]*\) .* checkout: moving from '"$1"' .*~\1~p' \ < "$GIT_DIR"/logs/HEAD } search_reflog_merges () { git rev-parse $( sed -ne 's~^[^ ]* \([^ ]*\) .* merge '"$1"':.*~\1^2~p' \ < "$GIT_DIR"/logs/HEAD ) } oid_pattern=$(git hash-object --stdin /dev/null; then printf "** Restoring $new_name to " git --no-pager log -1 --pretty=tformat:"%h %s" $newest git branch $new_name $newest else printf "Most recent: " git --no-pager log -1 --pretty=tformat:"%h %s" $newest echo "** $new_name already exists, doing nothing" fi