I do not like to retype fish every time I start terminal. I want fish on by default. How can I set fish shell as my default shell on a Mac?
From Terminal:
Add Fish to /etc/shells, which will require an administrative password:
sudo echo /usr/local/bin/fish >> /etc/shells
Make Fish your default shell with chsh:
chsh -s /usr/local/bin/fish
From System Preferences:
User and Groups → ctrl-click on Current User → Advanced Options...
Change Login shell to /usr/local/bin/fish

Press OK, log out and in again
On macOS Mojave I had to do the following (using zsh as an example):
brew install zsh
sudo sh -c "echo $(which zsh) >> /etc/shells"
chsh -s $(which zsh)
You can use chsh to change a user's shell.
Run the following code, for instance, to change your shell to Zsh
chsh -s /bin/zsh
As described in the manpage, and by Lorin, if the shell is not known by the OS, you have to add it to its known list: /etc/shells.
How to get the latest version of bash on modern macOS (tested on Mojave).
brew install bash
which bash | sudo tee -a /etc/shells
chsh -s $(which bash)
Then you are ready to get vim style tab completion which is only available on bash>=4 (current version in brew is 5.0.2
# If there are multiple matches for completion, Tab should cycle through them
bind 'TAB':menu-complete
# Display a list of the matching files
bind "set show-all-if-ambiguous on"
# Perform partial completion on the first Tab press,
# only start cycling full results on the second Tab press
bind "set menu-complete-display-prefix on"
When in the terminal, open the terminal preferences using Command+,.
On the Setting Tab, select one of the themes, and choose the shell tab on the right.
You can set the autostart command fish.
The only thing that worked for me was a combination of all these methods.
First I had to add fish to the /etc/shells file
Then I ran chsh -s /usr/local/bin/fish
Finally, I typed Command+, and added /usr/local/bin/fish to the default path there
Only after I had done all three things did fish start popping up as the default for new terminal windows.