#!/usr/bin/env bash current_branch() { git rev-parse --abbrev-ref HEAD } usage() { echo "Usage: git merge-into [src] dest [--ff-only]" } cur_branch=$(current_branch) stashed=0 if [ -n "$(git status --porcelain)" ]; then echo "Local modifications detected, stashing" stashed=1 git stash fi if [ "${!#}" = '--ff-only' ]; then case $# in 2 ) # dest --ff git push "$(git rev-parse --show-toplevel)" "$cur_branch":"$1";; 3 ) git push "$(git rev-parse --show-toplevel)" "$1":"$2";; * ) usage esac else case $# in 1 ) git checkout "$1" git merge "$cur_branch" "$1" && git checkout "$cur_branch" ;; 2 ) git checkout "$2" git merge "$1" "$2" && git checkout "$cur_branch" ;; * ) usage esac fi if [ $stashed -eq 1 ]; then git stash pop; fi