Git Bash Is My Preferred Windows Shell

Page contents

News

2021-February-9  Git for Windows 2.30.1 released. To keep up with releases of Git for Windows, which includes Git Bash and the mintty terminal emulator, see github.com/git-for-windows/git/releases or twitter.com/@GitForWindows.

2020-November-18  Published this evolving article.⁠[1]

About shells

A shell is a layer or interface between you and an operating system. There are a lot of command-line shells for Windows, including:

  • COMMAND.COM

  • Cygwin

  • UWIN

  • cmd.exe, which is also known as CMD (pronounced “cee em dee”) and Command Prompt

  • PowerShell

  • WSL Bash, which is also known as “Bash on Ubuntu on Windows” and “Bash on Windows’ Subsystem for Linux”⁠[2]

Over the years, I’ve used all six of the above Windows shells. I recently installed Git for Windows and now I can add a seventh shell to the list of Windows shells that I’ve used:

  • Git Bash

About bash

Bash is a an acronym for “Bourne again shell” and it is a command-line shell that was created for Unix-like systems. Details are at wikipedia.org/wiki/Bash_(Unix_shell).

What is Git Bash

Git Bash is a Windows command-line shell that is packaged with Git for Windows. It emulates⁠[3] the bash shell that is familiar to nix-nux users.

💡
Git Bash is useful even if you do not use git.

 

Why I Prefer Git Bash

I like Git Bash because…

  • I’m more comfortable with bash commands than CMD or PowerShell commands (because I’ve been using Bourne shell (sh) and friends for more than 30 years).

  • It’s easy to install.

  • It has a small footprint.

  • It installs a Git Bash Here command that is available when right-clicking on a folder in Windows File Explorer.

  • I can pipe the output of commands through the less pager, which is better than the more pager.⁠[4]

  • In addition to less, many other bash commands⁠[5] are available including cat,⁠[6] clear, curl, cut, date, dos2unix, file, grep and friends,⁠[7] gunzip, gzip, head, history, jobs, mkdir, mount, nano, printenv, ps, pwd, scp, sed, sftp, ssh, tail, tar, touch, uname, uniq, vim, wc, and which.

  • I can view built-in help for a bash command with, for example, less --help or pwd --help.

  • Almost any app that’s on my path, for example hugo and figlet, can be launched either within a Git Bash script or at a Git Bash command prompt (possibly with the help of winpty).[8]

  • I can write bash or sh⁠[9] scripts and…

    • my Windows environment variables are available,

    • and I do not have to worry about WSL file system issues[10] because Git Bash uses the regular Windows file system (but be aware that Git Bash uses forward-slash-delimited paths to refer to the Windows file system).

  • I can use redirection (with, for example, >) to create a file that is UTF-8 Unicode text rather than Little-endian UTF-16 Unicode text, with CRLF line terminators (which is the CMD and PowerShell default encoding⁠🙀).

  • It has helpful discussion groups, for example github.com/git-for-windows/git/discussions, stackoverflow.com/questions/tagged/git-bash, stackoverflow.com/questions/tagged/git-for-windows, and superuser.com/questions/tagged/git-bash.

 

Installing Git Bash

To install Git Bash, install Git For Windows, which you can download from either…

Think carefully about what options you choose during the installation. If you are a power user, the defaults are probably not what you want. For example, I changed the default install directory, which is C:\Program Files\Git\, to C:\Program Files\GitForWindows\ because this helps me remember the full name of the app in this directory.

Git For Windows requires Windows Vista or later. Windows Vista was released in 2007 (~14 years ago).

 

Updating Git Bash

To see what version of Git for Windows you are using, run the following at a Git Bash prompt:

git --version

To update Git for Windows, run the following at a Git Bash prompt:

git update-git-for-windows

When you update Git for Windows…

  • Your home (~) directory should be preserved, but to be safe, back it up before you update.

  • Your Git Bash /etc/ and other root-level Git Bash directories will not  be preserved (and ideally you should not have edited these directories).

 

Launching Git Bash

To launch Git Bash…

  • double click the Git Bash shortcut that’s on your Desktop,

  • or right-click on a folder in Windows File Explorer and choose Git Bash Here,

  • or open a Visual Studio Code Terminal (this will work if you have followed the Git Bash instructions at code.visualstudio.com/docs/editor/integrated-terminal#_windows and if $TERM is something like xterm (discussed in the next section).)

If you right-click on the default Desktop Git Bash shortcut and choose Properties, you will see something like the following.

Target: "C:\Program Files\Git\git-bash.exe" --cd-to-home

Start in: %HOMEDRIVE%%HOMEPATH%

You can change these shortcut properties if you like.

 

Git Bash customizations

~/.bash_profile

If ~/.bash_profile exists, the commands in it are run each time you start a Git Bash session. To create and edit this file do the following.

  1. Launch Git Bash.

  2. At the Git Bash command-line prompt, run one of these commands:

    nano ~/.bash_profile
    vim ~/.bash_profile

    Note that the TUI (terminal user interface) editors nano and vim are included in Git Bash and are on your PATH. (If you do not know how to use vim, I recommend that you use nano because, otherwise, it may take you a while to figure out how to exit vim.⁠😆)

  3. Add whatever commands you’d like to this file. Here is an excerpt of my ~/.bash_profile:

    ## Created: 2021-02-28
    
    ## use `gvim filename` to edit filename with GUI Vim
    alias gvim="/C/Windows/gvim.bat"
    
    ## use `cdi` to cd to the Infinite Ink project root
    ## note I set INFINITEINKROOT environment variable via Control Panel
    alias cdi="cd `cygpath $INFINITEINKROOT`"
    
    
    ## make Backspace key and other things work in VS Code's Terminal emulator
    export TERM=xterm
  4. Save your edits and close the editor.

  5. At the Git Bash prompt, use the folowing file command to check the file type.

    file ~/.bash_profile

    This will probably display ASCII text or UTF-8 Unicode text. If either “BOM” or “CRLF line terminators” are mentioned in the output of this file command, you can convert it to Unix-format with the following command.

    nano --unix ~/.bash_profile

    To learn about this and other nano command-line arguments, see the nano man page or run the following.

    nano --help

 

💡
After you change your ~/.bash_profile, I recommend that you close all Git Bash sessions and all Windows File Explorer windows, and then relaunch Git Bash and make sure your new ~/.bash_profile settings worked.

 

alias

To see what aliases are available, run:

alias

On my system, this displays:

alias gvim='/C/Windows/gvim.bat'
alias cdi='cd /c/Users/USERNAME/path/to/infiniteink/project/root'
alias ll='ls -l'
alias ls='ls -F --color=auto --show-control-chars'

The first two aliases are the ones I created above in my ~/.bash_profile. The last two are Git Bash’s default aliases.

💡
Default aliases (and more) are specified in files that are located in the /etc/profile.d/ directory. It is best not to edit files under /etc/ because they might be replaced when Git for Windows is updated.

 

mintty color scheme🌈

The default Git Bash terminal emulator is mintty. I prefer the solarized color scheme so I edited ~/.minttyrc so it includes the following.

ForegroundColour=101,123,131
BackgroundColour=253,246,227
CursorColour=220,50,47

Black=7,54,66
BoldBlack=0,43,54
Red=220,50,47
BoldRed=203,75,22
Green=133,153,0
BoldGreen=88,110,117
Yellow=181,137,0
BoldYellow=101,123,131
Blue=38,139,210
BoldBlue=131,148,150
Magenta=211,54,130
BoldMagenta=108,113,196
Cyan=42,161,152
BoldCyan=147,161,161
White=238,232,213
BoldWhite=253,246,227

This is the contents of the .minttyrc.light file, which is part of github.com/mavnn/mintty-colors-solarized. Thank you Michael Newton (@mavnn) for making this color scheme available on GitHub!

 

mintty font and character set

To change the character set and fonts used in the mintty terminal emulator, right click anywhere in a mintty window or title bar, choose Options, choose Text in the left pane, and then…

  1. Click Select… and choose DejaVu Sans Mono, 10pt (or whatever you prefer) for the font.

  2. Under Character Set, choose UTF-8 (or whatever you prefer).

These and other settings will be appended to the bottom of your ~/.minttyrc file.

 

Git Bash tips

Case insensitivity

Normally Unix-like shells are case sensitive, but Git Bash, in general, is case insensitive.

 

Paths

To view your current path, run the following command, which means “print working directory.”

pwd

To go to your Git Bash home directory, which is also known as ~, run either of the following equivalent commands.

cd
cd ~

On most systems, your Git Bash home directory is…

/c/users/USERNAME/

with USERNAME replaced with your user name.

Note that in Git Bash…

  • The path delimiter is slash (/), which is also known as forward slash.

  • C:\ is mounted as /c/. To list all mounts, run the mount command.

  • You can display the Windows-style path of the current working directory with pwd -W.

 

Start

When you are at a Git Bash prompt, you can launch a file or directory in your system’s default app by using the Start command, which is equivalent to the start command (thanks to case insensitivity). For example, to open the current directory in Windows File Explorer, use this:

start .
      👆
     Notice this dot (.)

To open an HTML file in your default web browser, use something like this:

start ReleaseNotes.html

 

Environment variables

To find out the environment variables available to Git Bash, run:

printenv

This includes the PATH environment variable, which lists the directories that are searched for executables.

 

Scripting

I’d rather write a bash or sh⁠[9] shell script than a Windows batch file to deal with apps, files, and folders that live in my Windows file system. Thanks to Git Bash, It’s easy to do this. (I have learned the hard way that it’s not so easy to do this in WSL.⁠[10])

 

Where to put scripts

When you run printenv, you can see that the ~/bin/ directory (usually /c/users/username/bin/) is on your PATH. This is a reasonable place to put your Git Bash scripts. To create this directory, run this command:

mkdir ~/bin/

 

Example script

One of my scripts is called gvim-winpath and it looks like this:

#!/bin/sh

## Created: 2021-02-28
## Filename: gvim-winpath
## Usage: gvim-winpath "C:\path\to\filename"

/c/windows/gvim.bat `cygpath "$1"`

I use this to launch gvim on a file that is specified using a Windows-style backslash path. To learn about the cygpath command, which is used in this script, run one of the following commands at a Git Bash prompt.

cygpath --help
cygpath --help |less

If you pipe the cygpath --help output to the less pager, you need to know how to use less: The essentials are that within less, you can press Space to page down, press b (for back) to page up, and press q to quit.

 

💡
cygpath is analogous to wslpath, which I use in qutebrowser Tips and Fragments in section 8. Calling a WSL bash script from a Windows userscript🔨.

 

No need to chmod

In most Unix-like shells, you need to chmod +x executables but in Git Bash this is not needed.

 

Case insensitivity exceptions

--help and other command arguments

Arguments to nix-nux commands, in general, are case sensitive. For example, in the following

cygpath --help

The command cygpath is case insensitive and its argument --help is case sensitive. For example, this works:

Cygpath --help

but this does not work:

cygpath --Help

 

exit

To quit Git Bash, you can either click the close-window X in the upper right corner of the terminal window or type the following at the command prompt:

exit

This exit command must be all lower case and does not show up when you run which exit.🤔

 

Endnotes


1. Many Infinite Ink articles, including this one, are evergreen⁠🌲 and regularly updated.
2. It would probably make more sense if WSL were called LSW (Linux Subsystem for/of/on Windows), but it is not because, according to Rich Turner in this tweet, Microsoft “cannot name something leading with a trademark owned by someone else.” Rich’s tweet has inspired me to interpret the WSL acronym as meaning Windows Subsystem for Linux (notice the apostrophe ()).
3. Git Bash uses MSYS2 (Minimal SYStem 2) and MinGW (Minimalist GNU for Windows) to do this emulation.
4. The more command is not included in Git Bash, but the less command, which can do everything more can do (and more), is.
5. Technically these “bash commands” are GNU commands from the MinGW project.
6. cat stands for concatenate.😸
7. grep stands for “get regular expression.” Its friends include egrep and fgrep.
8. When launching an app from Git Bash, it’s sometimes useful to append  & to the end of the command so it will be launched as a background job.
9. bash is “Bourne again shell” and sh is “Bourne shell”.
10. To learn about some problems with WSL, see Windows Subsystem for Linux: The lost potential by Julio Manuel Merino Vidal. Also see the Hacker News comments about that article at news.ycombinator.com/item?id=25154300.

Comments 👍 👎 📝

To comment, you must be signed in to GitHub.