Git Bash Is My Preferred Windows Shell
Updated 2021-April-26

Page contents

News

2021-March-27  Git For Windows v2.31.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.

2021-March-22  Expanded this article’s Launching Git Bash section and moved it to its own page. Check it out at www.ii.com/launching-git-bash.

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

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:

  1. COMMAND.COM

  2. Cygwin

  3. UWIN

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

  5. PowerShell

  6. 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:

  1. 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.

 

Git Bash is not one of Windows' subsystems. When you are in Git Bash, you are still in your regular Windows environment.

 

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, cat,⁠[5] clear, cp, curl, cut, date, diff, dos2unix, file, grep and friends,⁠[6] gunzip, gzip, head, history, jobs, kill, ls, mkdir, mv, mount, nano, od, printenv, ps, pwd, scp, sed, sftp, sort, split, ssh, tail, tar, touch, uname, uniq, vim, wc, which, whoami, and more nix-nux commands are available.

  • 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, figlet, and tree.com[7] — 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 output 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⁠🙀).

 

Managing Git For Windows and Git Bash

Installing

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 like to change 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 newer. Windows Vista was released in 2007 (~14 years ago).

 

Inspecting

To learn about the Git For Windows that you are using, run some or all of the following at a Git Bash⁠[11] command-line prompt:

git --version
git --version --build-options
uname -a

To see what options it was installed with, run the following at a Git Bash prompt:

cat /etc/install-options.txt

 

Updating

To update Git For Windows, run the following at a Git Bash⁠[11] command-line 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 edit these directories).

 

Launching Git Bash

To learn about launching Git Bash in various terminal emulators, including Mintty, ConEmu, and Microsoft’s new Windows Terminal see www.ii.com/launching-git-bash.

Git Bash customizations

Display some of Git Bash’s default settings

Before you customize Git Bash, check out some of its default settings by running the following four commands at a Git Bash command-line prompt.

alias
mount
printenv
set -o

 

~/.bash_profile

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

  1. Launch a Git Bash terminal.

  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-04-26
    
    ## 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`"
    
    ## Do not let me overwrite a file with > redirection
    set -o noclobber
    
    ## Make Backspace key and other things work in VS Code's Terminal emulator
    export TERM=xterm
    ## Or...
    # export TERM=xterm-256color
  4. Save your edits and close the editor.

  5. At the Git Bash prompt, use the following 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, convert it to Unix-format with one of the following commands.

    dos2unix ~/.bash_profile
    nano --unix ~/.bash_profile

    To learn about these commands, run the following commands.

    dos2unix --help
    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. Since I prefer the Solarized Light color scheme, 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.

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

  • You can display a Windows-type path of the current working directory with pwd -W. The format of the path this command displays is sometimes called “mixed type” because it starts with a drive letter, such as C:, and uses forward slashes rather than backslashes as path separators.

 

The start command

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-04-26
## 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.

 

Unicode

If you have issues with non-ASCII Unicode characters, run the following at a Git Bash prompt and make sure each setting includes UTF-8.

locale

Also, you can try to solve the Unicode issues by running the following sequence of chcp.com[7] commands at a Git Bash prompt.

chcp.com
chcp.com 65001
chcp.com

This changes the code page to 65001, which supports UTF-8 encoding.

Nowadays UTF-8 is the standard file encoding of the internet (and of Unicode in general).

 

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 is a system call and must be all lower case.⁠

 

See also

For more about Git Bash, see Infinite Ink’s…

 

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. cat stands for concatenate.😸
6. grep stands for “get regular expression.” Its friends include egrep and fgrep.
7. tree.com and chcp.com are located in /c/windows/system32/ and are on your Git-Bash path. They must be called with the .com file extension.
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.
11. Alternatively, you could use a Powershell or CMD command-line prompt for this command. Because this article is about Git Bash, I suggest using a Git Bash command-line prompt throughout the article. Note that many of the commands discussed in this article must be run from a Git Bash prompt.

Comments & reactions 👍 👎 📝

To comment or react, you must be signed in to GitHub.