SH_GIT_LOG_FORMAT="\
%C(auto)%h%d
S %C(red)%GS
A %C(green)%an %ae
  %C(green)%ai
C %C(blue)%cn %ce
  %C(blue)%ci
%B"

# add to index
ga() { sh_a__git_add "${@}"; }
sh_a__git_add() {
	git \
		add \
		"${@}"
}

# add all to index
gaa() { sh_a__git_add_all "${@}"; }
sh_a__git_add_all() {
	git \
		add \
		--all \
		"${@}"
}

# add parts of all to index
gaap() { sh_a__git_add_all_patch "${@}"; }
sh_a__git_add_all_patch() {
	git \
		add \
		--all \
		--patch \
		"${@}"
}

# add parts to index
gap() { sh_a__git_add_patch "${@}"; }
sh_a__git_add_patch() {
	git \
		add \
		--patch \
		"${@}"
}

# create a branch
gb() { sh_a__git_branch "${@}"; }
sh_a__git_branch() {
	git \
		branch \
		"${@}"
}

# delete a branch
gbd() { sh_a__git_branch_delete "${@}"; }
sh_a__git_branch_delete() {
	git \
		branch \
		--delete \
		"${@}"
}

# force a branch deletion
gbdf() { sh_a__git_branch_delete_force "${@}"; }
sh_a__git_branch_delete_force() {
	git \
		branch \
		--delete \
		--force \
		"${@}"
}

# list branches
gbl() { sh_a__git_branch_list "${@}"; }
sh_a__git_branch_list() {
	git \
		branch \
		--all \
		--list \
		--verbose \
		--verbose \
		"${@}"
}

# set the link to a remote branch from a local branch
gbsu() { sh_a__git_branch_set_upstream "${@}"; }
sh_a__git_branch_set_upstream() {
	git \
		branch \
		--set-upstream-to \
		"${@}"
}

# switch to a branch or checkout file(s) from a commit
gc() { sh_a__git_checkout "${@}"; }
sh_a__git_checkout() {
	git \
		checkout \
		"${@}"
}

# checkout an orphan branch
gco() { sh_a__git_checkout_orphan "${@}"; }
sh_a__git_checkout_orphan() {
	git \
		checkout \
		--orphan \
		"${@}"
}

# pick a commit
gcp() { sh_a__git_cherry_pick "${@}"; }
sh_a__git_cherry_pick() {
	git \
		cherry-pick \
		"${@}"
}

# abort the commit pick
gcpa() { sh_a__git_cherry_pick_abort "${@}"; }
sh_a__git_cherry_pick_abort() {
	git \
		cherry-pick \
		--abort \
		"${@}"
}

# continue the commit pick
gcpc() { sh_a__git_cherry_pick_continue "${@}"; }
sh_a__git_cherry_pick_continue() {
	git \
		cherry-pick \
		--continue \
		"${@}"
}

# clean untracked files
gcf() { sh_a__git_clean_force "${@}"; }
sh_a__git_clean_force() {
	git \
		clean \
		-d \
		--force \
		"${@}"
}

# redo the last commit with a different message
gcam() { sh_a__git_commit_amend_message "${@}"; }
sh_a__git_commit_amend_message() {
	git \
		commit \
		--amend \
		--message \
		"${@}"
}

# make a root commit
gcem() { sh_a__git_commit_empty_message "${@}"; }
sh_a__git_commit_empty_message() {
	git \
		commit \
		--allow-empty \
		--allow-empty-message \
		--message \
		"${@}"
}

# commit the index
gcm() { sh_a__git_commit_message "${@}"; }
sh_a__git_commit_message() {
	git \
		commit \
		--message \
		"${@}"
}

# configure the user email
gcue() { sh_a__git_config_user_email "${@}"; }
sh_a__git_config_user_email() {
	git \
		config \
		"user.email" \
		"${@}"
}

# configure the user name
gcun() { sh_a__git_config_user_name "${@}"; }
sh_a__git_config_user_name() {
	git \
		config \
		"user.name" \
		"${@}"
}

# differences from last or between commits
gd() { sh_a__git_diff "${@}"; }
sh_a__git_diff() {
	git \
		diff \
		"${@}"
}

# display what is indexed in cache
gdc() { sh_a__git_diff_cached "${@}"; }
sh_a__git_diff_cached() {
	git \
		diff \
		--cached \
		"${@}"
}

# indexed character-level differences
gdcw() { sh_a__git_diff_cached_word "${@}"; }
sh_a__git_diff_cached_word() {
	git \
		diff \
		--cached \
		--word-diff-regex "." \
		"${@}"
}

# differences via external tool
gdt() { sh_a__git_diff_tool "${@}"; }
sh_a__git_diff_tool() {
	git \
		difftool \
		--dir-diff \
		"${@}"
}

# character-level differences
gdw() { sh_a__git_diff_word "${@}"; }
sh_a__git_diff_word() {
	git \
		diff \
		--word-diff-regex "." \
		"${@}"
}

# fetch from the remote repository
gf() { sh_a__git_fetch "${@}"; }
sh_a__git_fetch() {
	git \
		fetch \
		--tags \
		--verbose \
		"${@}"
}

# fetch from remote repository and prune local orphan branches
gfp() { sh_a__git_fetch_prune "${@}"; }
sh_a__git_fetch_prune() {
	sh_a__git_fetch \
		--prune \
		"${@}"
}

# garbage collect all orphan commits
ggc() { sh_a__git_garbage_collect "${@}"; }
sh_a__git_garbage_collect() {
	git \
		reflog \
		expire \
		--all \
		--expire "all" &&
		git \
			gc \
			--aggressive \
			--prune="now"
}

# initialize a new repository
gi() { sh_a__git_init "${@}"; }
sh_a__git_init() {
	git \
		init \
		"${@}"
}

# initialize a new bare repository
gib() { sh_a__git_init_bare "${@}"; }
sh_a__git_init_bare() {
	git \
		init \
		--bare \
		"${@}"
}

# log history
gl() { sh_a__git_log "${@}"; }
sh_a__git_log() {
	git \
		log \
		--abbrev=8 \
		--abbrev-commit \
		--format="${SH_GIT_LOG_FORMAT}" \
		--graph \
		"${@}"
}

# log all history
gla() { sh_a__git_log_all "${@}"; }
sh_a__git_log_all() {
	sh_a__git_log \
		--all \
		"${@}"
}

# log all history with patches
glap() { sh_a__git_log_all_patch "${@}"; }
sh_a__git_log_all_patch() {
	sh_a__git_log \
		--all \
		--patch \
		"${@}"
}

# log history with patches
glp() { sh_a__git_log_patch "${@}"; }
sh_a__git_log_patch() {
	sh_a__git_log \
		--patch \
		"${@}"
}

# fast-forward merge to remote branch
gm() { sh_a__git_merge "${@}"; }
sh_a__git_merge() {
	git \
		merge \
		--ff-only \
		"${@}"
}

# abort the current merge commit
gma() { sh_a__git_merge_abort "${@}"; }
sh_a__git_merge_abort() {
	git \
		merge \
		--abort \
		"${@}"
}

# do a merge commit
gmc() { sh_a__git_merge_commit "${@}"; }
sh_a__git_merge_commit() {
	git \
		merge \
		--no-ff \
		--message \
		"${@}"
}

# squash a branch and index its modifications
gms() { sh_a__git_merge_squash "${@}"; }
sh_a__git_merge_squash() {
	git \
		merge \
		--squash \
		"${@}"
}

# merge via external tool
gmt() { sh_a__git_merge_tool "${@}"; }
sh_a__git_merge_tool() {
	git \
		mergetool \
		"${@}"
}

# push to the remote repository
gp() { sh_a__git_push "${@}"; }
sh_a__git_push() {
	git \
		push \
		--tags \
		--verbose \
		"${@}"
}

# delete from the remote repository
gpd() { sh_a__git_push_delete "${@}"; }
sh_a__git_push_delete() {
	git \
		push \
		--delete \
		"${@}"
}

# force the push to the remote repository
gpf() { sh_a__git_push_force "${@}"; }
sh_a__git_push_force() {
	sh_a__git_push \
		--force \
		"${@}"
}

# rebase current branch onto another
grb() { sh_a__git_re_base "${@}"; }
sh_a__git_re_base() {
	git \
		rebase \
		"${@}"
}

# abort current rebase
grba() { sh_a__git_re_base_abort "${@}"; }
sh_a__git_re_base_abort() {
	git \
		rebase \
		--abort \
		"${@}"
}

# continue current rebase
grbc() { sh_a__git_re_base_continue "${@}"; }
sh_a__git_re_base_continue() {
	git \
		rebase \
		--continue \
		"${@}"
}

# force rebase without fast-forward
grbf() { sh_a__git_re_base_force "${@}"; }
sh_a__git_re_base_force() {
	git \
		rebase \
		--force-rebase \
		"${@}"
}

# rebase interactively
grbi() { sh_a__git_re_base_interactive "${@}"; }
sh_a__git_re_base_interactive() {
	git \
		rebase \
		--interactive \
		"${@}"
}

# add a new remote repository
grma() { sh_a__git_re_mote_add "${@}"; }
sh_a__git_re_mote_add() {
	git \
		remote \
		add \
		"${@}"
}

# list remote repositories
grml() { sh_a__git_re_mote_list "${@}"; }
sh_a__git_re_mote_list() {
	git \
		remote \
		--verbose \
		"${@}"
}

# set the location of a remote repository
grmsu() { sh_a__git_re_mote_set_upstream "${@}"; }
sh_a__git_re_mote_set_upstream() {
	git \
		remote \
		set-url \
		"${@}"
}

# show connection to a remote repository
grms() { sh_a__git_re_mote_show "${@}"; }
sh_a__git_re_mote_show() {
	git \
		remote \
		show \
		"${@}"
}

# remove and add removal to index
grm() { sh_a__git_re_move "${@}"; }
sh_a__git_re_move() {
	git \
		rm \
		"${@}"
}

# remove file(s) from index or move current branch pointer
grs() { sh_a__git_re_set "${@}"; }
sh_a__git_re_set() {
	git \
		reset \
		"${@}"
}

# wipe modifications or reset current branch to another commit
grsh() { sh_a__git_re_set_hard "${@}"; }
sh_a__git_re_set_hard() {
	git \
		reset \
		--hard \
		"${@}"
}

# show a commit
gsc() { sh_a__git_show_commit "${@}"; }
sh_a__git_show_commit() {
	git \
		show \
		"${@}"
}

# current state of repository
gs() { sh_a__git_status "${@}"; }
sh_a__git_status() {
	git \
		status \
		--untracked-files="all" \
		"${@}"
}

# tag a commit
gt() { sh_a__git_tag "${@}"; }
sh_a__git_tag() {
	git \
		tag \
		"${@}"
}

# delete a tag
gtd() { sh_a__git_tag_delete "${@}"; }
sh_a__git_tag_delete() {
	git \
		tag \
		--delete \
		"${@}"
}