Coisas como command ou sudo não se aplicam magicamente ao restante da linha. (Somente # comentários e time incorporados têm essa mágica.)
Ou seja, se você usar command clear && git diff , ele será primeiro expandido para dois comandos separados: command clear (onde o prefixo "command" é inútil) e git diff (onde for necessário).
A função correta seria:
git() {
if [[ $1 == "diff" ]]; then
clear && command git "$@"
else
command git "$@"
fi
}
Alternativamente:
git() {
if [[ $1 == diff ]]; then
clear
fi
command git "$@"
}
(Use "$@" em ambos os casos, pois você poderá precisar de git diff --cached ou algo assim.)