git alias to delete local and remote

You can make this work just fine. You just need to add a missing '-' at the end of your definition. The '-' will signal to bash that all option processing is done, and anything that comes after becomes a parameter you can reference via $1, $2, etc:

[alias]
     nuke = !sh -c 'git branch -D $1 && git push origin :$1' -

From the command line, switch to another branch, then run the command:

git nuke branch-name

Alternately… If you are unable to add the above to your .gitconfig file for some reason, but have access to the .bashrc, .bash_profile, etc… you can add the following:

git config --global alias.nuke '!sh -c "git branch -D $1 && git push origin :$1" -'

If you create a bin called git-nuke and place it in a directory anywhere on your $PATH, you will achieve the same effect. The advantage with this approach is the ability to write a command with a bit more clarity and robustness.

Example, in my bash profile I have: export PATH="$HOME/.bin:$PATH".

And in ~/.bin/git-nuke, I have:

#!/bin/bash
set -eu

#
# git nuke <branch-name>
#
# Delete a branch (irrespective of its merged status) and
# remove from origin.
#

echo "Nuking $1 ..."

if git show-branch "$1" > /dev/null 2>&1
then
  git branch -D "$1"
else
  echo "No local branch to delete"
fi

git remote prune origin
if git show-branch "origin/$1" > /dev/null 2>&1
then
  echo "Deleting remote $1 ..."
  git push origin ":$1"
else
  echo "No remote branch to delete"
fi

You cannot use $1 in an alias. Create a script called git-nuke somewhere in your path so you have access to proper shell scripting.

You could also just install git-extras. That’s a script compilation that contains the git delete-branch script, which does exactly what you want.