Why I Bash Git (And Why You Should Too)
Jimmy McBride

Jimmy McBride @jimmymcbride

About: Full Stack Web 🕸️ Android Dev 🤖 Linux Wizard 🧙‍♂️ Crafting cutting-edge apps 🚀 Kotlin & Jetpack enthusiast ✨ Forever learning & evolving 🌱

Location:
Kyle, Texas
Joined:
Nov 1, 2019

Why I Bash Git (And Why You Should Too)

Publish Date: Sep 16 '24
221 56

A lot of people these days use tools like oh-my-zsh that come packed with a ton of helpful features out of the box, including Git shortcuts. And don’t get me wrong—they’re great. But I think it’s really important to understand how things work under the hood. You can slap on all the tools you want, but there’s real value in building your own workflow from the ground up.

If you’re curious about my take on why you should write your own tools, you can check out my thoughts here. But for now, I want to show you how Bash functions and aliases can make Git workflows faster, easier, and just plain better. I hope this post gets you excited to dig into your shell’s rc file and start writing your own custom functions and aliases, not just for Git, but for everything you do!


1. Git Aliases

First up, let’s simplify some of those common Git commands. Here are some aliases I’ve set up to make life a little easier in the terminal. Why type a long command every time when you can shorten it to two letters?

alias gs="git status"    # Show Git status
alias ga="git add ."     # Add all files to the staging area
alias gc="git commit -m" # Commit with a message
alias gp="git push"      # Push the current branch to the remote
alias gl="git pull"      # Pull from the remote branch
alias glog="git log --oneline --graph --all --decorate" # View Git log in one-line format
alias gco="git checkout" # Checkout a branch
alias gcb="git checkout -b" # Create and switch to a new branch
alias gd="git diff --cached" # View the difference of staged changes
alias grh="git reset --hard HEAD" # Hard reset to the latest commit
alias gb="git branch -vv"  # Show branches and last commit in one-line format
alias gf="git fetch --all" # Fetch all remote branches
Enter fullscreen mode Exit fullscreen mode

These aliases shave off seconds, but those seconds add up. Plus, they just feel good to use.


2. Bash Functions for More Complex Git Workflows

Now, let’s kick it up a notch with some custom Bash functions that automate a bit more of your workflow. Functions like these can save you from typing out multiple commands and ensure you don’t miss any steps.

2.1. Create a New Branch and Push It

gnew() {
  git checkout -b "$1"
  git push -u origin "$1"
}
# Usage: gnew branch_name
Enter fullscreen mode Exit fullscreen mode

2.2. Quick Commit and Push

gquick() {
  got add .
  git commit -m "$1"
  git push
}
# Usage: gquick "commit message"
Enter fullscreen mode Exit fullscreen mode

2.3. Rebase Current Branch onto Main

grebase() {
  git fetch
  git rebase origin/main
}
# Usage: grebase
Enter fullscreen mode Exit fullscreen mode

2.4. Undo the Last Commit

gundo() {
  git reset --soft HEAD~1
}
# Usage: gundo
Enter fullscreen mode Exit fullscreen mode

2.5. Squash Commits

gsquash() {
  git reset --soft HEAD~"$1"
  git commit --amend
}
# Usage: gsquash 3 (to squash the last 3 commits)
Enter fullscreen mode Exit fullscreen mode

2.6. Sync Fork with Upstream

gupdate-fork() {
  git fetch upstream
  git checkout main
  git merge upstream/main
  git push origin main
}
# Usage: gupdate-fork
Enter fullscreen mode Exit fullscreen mode

2.7. Interactive Rebase on Previous Commits

grebasei() {
  git rebase -i HEAD~"$1"
}
# Usage: grebasei 3 (to interactively rebase the last 3 commits)
Enter fullscreen mode Exit fullscreen mode

3. General Workflow Enhancers

These final functions enhance general Git workflows to make things even more efficient.

3.1. Show Git Tree

glogtree() {
  git log --graph --oneline --decorate --all
}
# Usage: glogtree
Enter fullscreen mode Exit fullscreen mode

3.2. Reset Branch to Remote

gresetremote() {
  git fetch origin
  git reset --hard origin/"$(git rev-parse --abbrev-ref HEAD)"
}
# Usage: gresetremote
Enter fullscreen mode Exit fullscreen mode

4. Add Aliases and Functions to Your .bashrc or .zshrc

If you want these functions and aliases to persist across terminal sessions, you’ll need to add them to your .bashrc or .zshrc. Here’s how:

  1. Open your shell configuration file:

    nvim ~/.bashrc  # OR ~/.zshrc
    
  2. Paste the aliases and functions into the file.

  3. After saving, refresh your shell:

    source ~/.bashrc  # OR ~/.zshrc
    

These are just some of the ways you can make Git work for you, rather than the other way around. By taking a few minutes to tweak your shell setup, you can save hours of typing and clicking over time. So what about you?

Comments 56 total

  • Joe Constant
    Joe ConstantSep 16, 2024

    "2.3. Rebase Current Branch onto Main"

    Could be made faster if you just did: git rebase origin/main. No need to switch branches at all

    • Samuel Rouse
      Samuel RouseSep 16, 2024

      That wouldn't guarantee you have the latest commits from origin. Git is "lazy" about fetching updates. If you don't specifically checkout and pull, you would rebase to the last state you left main.

      • Jimmy McBride
        Jimmy McBrideSep 16, 2024

        Oh yeah, that's right! Because it's grabbing from local instead of remote. This is why we test things out before making changes ;)

      • Joe Constant
        Joe ConstantSep 17, 2024

        It doesn't pull from local. That's the point of using origin/main instead of just main. You might need to git fetch, but you don't need to switch to main and pull. You can rebase from your other branch

        • Jimmy McBride
          Jimmy McBrideSep 17, 2024

          Yeah, so:

          git fetch
          git rebase origin/main
          
          Enter fullscreen mode Exit fullscreen mode

          should be a lot faster. It's been so long since I've wrote some of these aliases and functions. It's a commands shorter, and it would be faster technically. Tested it out this morning and everything seems like it works like it's supposed to! I appropriate the optimization :) You're correct on that call!

    • Jimmy McBride
      Jimmy McBrideSep 16, 2024

      Thanks for the advice! I'll test it out and update my script. Good catch! 😎

  • Rick Culpepper
    Rick CulpepperSep 16, 2024

    Did you really say that I should build my own tools instead of using someone else's well-crafted solutionl? Oh-my-zsh does all of this and more... who cares if I wrote it myself?

    When I need a car, I go buy one... ready to roll. Do you fire up a smelter in your back yard to create some iron and then stainless steel...???

    In the end, it is only by standing on this shoulders of those who came before us that we can reach new heights.

    • Jimmy McBride
      Jimmy McBrideSep 16, 2024

      I linked to my article about my opinion on building your own tools. I think your arguing against a point I'm not trying to make. I implore you to read it if you'd like a better understanding of my position on this matter. Maybe you could take up this conversation over there! :)

    • 𒎏Wii 🏳️‍⚧️
      𒎏Wii 🏳️‍⚧️Sep 17, 2024

      If your own tools can work like 5% better for you than someone else's tools, and it takes you maybe 5 to 10 minutes to write them, then I say over the course of a programming career the effort is going to more than pay for itself.

  • Christophe Avonture
    Christophe AvontureSep 16, 2024

    For you gnew function : by adding the code below in your ~/.gitconfig, the branch will be automatically created in your repo with the first git push

    [push]
        autoSetupRemote = true
    
    Enter fullscreen mode Exit fullscreen mode

    Using that config, your gnew function is perhaps useless.

    • Jimmy McBride
      Jimmy McBrideSep 16, 2024

      Woa! I've actually never edited my git config like that. Didn't even know it! Will have to check out the configuration options! Very cool.

    • hugomcm
      hugomcmSep 20, 2024

      Hello there! Good to know that there is a .gitconfig setting that does that ;).
      But in some cases, the function is really usefull, for example if you want to create a remote branch with a different name.

      gnew() {
        git checkout -b "$1"
        git push -u origin "$1:ready/$1/$$"
      }
      
      Enter fullscreen mode Exit fullscreen mode
  • kgunnit
    kgunnitSep 17, 2024

    I recommend Oh-my-zsh and their git plugin. There's a good amount of plugins to choose from to create aliases or functions to assist with your workflow.

  • Erick Rodriguez
    Erick RodriguezSep 17, 2024

    you know... I can do what you do with Powershell. and is FASTER than git bash.

    (git for windows is sort of garbage, but zsh is another realm that is for linux or macOs)

    you can do it over here: powershellgallery.com/packages/git...

    • Jimmy McBride
      Jimmy McBrideSep 17, 2024

      I hope people on Windows check this out!

  • Nathan Hedglin
    Nathan HedglinSep 17, 2024

    Agreed! Especially now with AI, it is super easy to create new aliases and scripts.

    Here is my Git config with aliases etc.

    Also, I use Better Branch for pretty branch info

    • 𒎏Wii 🏳️‍⚧️
      𒎏Wii 🏳️‍⚧️Sep 17, 2024
      main = !git checkout main
      
      Enter fullscreen mode Exit fullscreen mode

      This could just be

      main = checkout main
      
      Enter fullscreen mode Exit fullscreen mode

      to make your git config a little less cluttered 😉

  • fritzmark
    fritzmark Sep 17, 2024

    For 2.2 just use git commit -am to get rid of git add ..

    • Jimmy McBride
      Jimmy McBrideSep 17, 2024

      Changed and updated! Thank you very much :)

      • Milan Faltus
        Milan FaltusSep 20, 2024

        Just so you're aware - there is a difference between git add . and git commit -am. git commit -am will not add new files that git is not yet aware of.

        • Jimmy McBride
          Jimmy McBrideSep 20, 2024

          oh, that's actually really good to know! I had never heard of the am command before writing this article.

  • vikas nautiyal
    vikas nautiyalSep 17, 2024

    Pretty cool, I like aliases as they come handy, In my bashrc I source an aliases file wherin I define git co for checkout, git st for git status git cp for cherry-pick, ..etc. I plan to build some Complex Git Workflows soon.

    • Jimmy McBride
      Jimmy McBrideSep 17, 2024

      Bash functions work perfectly for those more complex flows! :)

  • Shahn321
    Shahn321Sep 17, 2024

    Insightful Tutuapp 9Apps

  • FF DEVIL
    FF DEVILSep 17, 2024

    🎉 iPhone 15 Pro Max GIVEAWAY! 🎉

    Know more

  • 𒎏Wii 🏳️‍⚧️
    𒎏Wii 🏳️‍⚧️Sep 17, 2024

    For aliases with longer names, it's better to just use git whatever instead of gwhatever, both to make it easier to remember, easier to read scripts, and easier to search your *sh history.

    If your command is short, you can set up a git alias in your config; prepend them with a ! to run shell commands.

    For longer scripts, if you create a script named git-whatever and have it in your path, you can call git whatever and git will call your script for you. You don't save much typing but that way you don't need to remember if some helper was a git alias or a standalone script.

  • leob
    leobSep 17, 2024

    Yeah I do this too, bash is great, never saw the need for oh-my-zsh ... sometimes "less is more" !

  • WORMSS
    WORMSSSep 17, 2024

    Maybe you will be better off with SmartGit.. What you are considering "complex" is literally the bare basics of git..
    SmartGit will allow you to do proper things with Git that would be useful

    • Jimmy McBride
      Jimmy McBrideSep 17, 2024

      This isn't meant to replace other tools, but from my last blog post, it seems there's a lot people who use git from command line for mostly everything except a few things where they use a so e kind of GUI for diffs and conflicts.

      I will check out SmartGit though! I've heard some things about and would like to see what it has to offer :)

      • WORMSS
        WORMSSSep 17, 2024

        SmartGit makes working with Submodules "a dream".. It's practically magic.
        You have all the command line guru's who scream out their lungs that SubModules are horrible and evil, and should not be used at all costs.. and have invented hundreds of alternatives to submodules.. But it's only horrible to use submodules on the command line.. SmartGit makes them super easy to use.. Especially if you have multiple projects all using the same core code..
        Nowadays people would do it with monorepos, but when we used submodules, it was great having versioned "core" code and versioned "projects"..

        • Jimmy McBride
          Jimmy McBrideSep 17, 2024

          Wow! This def makes it worth checking out. This could be the missing piece to my modular android stack when working on large enterprise projects. Thank you so much! XD

  • Mike Stemle
    Mike StemleSep 17, 2024

    I won’t use any of these samples (git commands are just baked into my brain at this point) but I love that you’re thinking of ways to improve your workflow, and that you’re using your shell to do it.

    • Jimmy McBride
      Jimmy McBrideSep 17, 2024

      The purpose isn't to exactly get people to follow what I do. But rather show people how I solve common problems using the shell. There's so much power at your fingertips. Whatever I can do to inspire people to become less afraid of the beautiful terminal :)

      • Mike Stemle
        Mike StemleSep 17, 2024

        Strong agree. Thanks for spreading the $TERM love.

    • Masud Al Imran
      Masud Al ImranSep 18, 2024

      I will agree with @manchicken too. Over the years git commands kinda got baked into my brain as well. But its nice to see some amazing options. Thanks for sharing.

  • Sanjeev Kumar
    Sanjeev KumarSep 17, 2024

    Nicely explained

  • Ananya Paw 🐾
    Ananya Paw 🐾Sep 17, 2024

    By bash you don't mean "bashing" right?

    • Jimmy McBride
      Jimmy McBrideSep 17, 2024

      No, it's just a play on words. I use bash to write helpful aliases and functions to help improve my git flows in the terminal

  • Adan Rao
    Adan RaoSep 17, 2024

    impressive code and details side-by-side just like roblox mod menu apk free is very learning way ....!!!

  • Donald Gillies
    Donald GilliesSep 17, 2024

    I tell people, "GIT makes hard things possible. It makes easy things possible, too!", LOL. Its the first version control system that requires you to memorize every detail of how its implemented to have a snowball's chance in hell of mastering it. ..

  • Rakib Al Hasan
    Rakib Al HasanSep 18, 2024

    Or use a GUI tool like sourcetree or fork. Really let's you achieve a lot very quickly and in short time. And also, discover many features and abilities of git by exploring the GUI tool - which otherwise we probably would've never actively enquired about.

    Of course, all of this recommended after you have mastered basic Git CLI and know how git works under the hood.

  • Drazen Bebic
    Drazen BebicSep 18, 2024

    Those are some amazing aliases, simple and efficient. Love it. Added them to my .zshrc already :D

    I generally feel like a lot of developers don't know how much easier they can make their lives with a few bash aliases/functions. Here is one of my new all-time favorites which I added today. It recursively deletes a directory with a specific name in your current working directory (use with caution!). I use it to delete all node_modules in a monorepo.

    rmrfd() {
      find . -name "$1" -type d -exec rm -rf {} +
    }
    # Usage: rmrfd node_modules
    
    Enter fullscreen mode Exit fullscreen mode
    • Jimmy McBride
      Jimmy McBrideSep 18, 2024

      Very cool! Now this is what I'm talking about. 😎

  • Jordan Humberto de Souza
    Jordan Humberto de SouzaSep 18, 2024

    Is there a way to "SAVE" those aliases on git bash tho on windows?

    • Jimmy McBride
      Jimmy McBrideSep 20, 2024

      Inside gitbash I think you have a .bashrc in the home directory that you can ad these aliases and functions too :)

      • Jordan Humberto de Souza
        Jordan Humberto de SouzaSep 20, 2024

        It did work for me after I've restarted the git bash. Seems there was some files missing so it created those for me: .bash_profile, .lesshst and .viminfo

        • Jimmy McBride
          Jimmy McBrideSep 20, 2024

          you can run source ~/.bashrc or whatever file your storing your config in to reload the terminal with the new changes.

          I have an alias in my rc file alias reload="source ~/.bashrc && clear" in mine so that I can easily run reload after I've made a change :)

  • Stefano Canepa
    Stefano CanepaSep 19, 2024

    I'm following your approach since I moved from oh-my-zsh to fish.

  • Uğur "vigo" Özyılmazel
    Uğur "vigo" ÖzyılmazelOct 6, 2024

    humble tip:

    When you constantly use custom bash aliases, you tend to forget the actual commands :) And when you switch to a teammate's computer where those aliases don't exist, you feel completely lost :)

  • Chris
    ChrisOct 7, 2024

    A clear, quick write-up, and some useful comments, too. Thanks to everyone who meaningfully contributed!

Add comment