Learning Git: my favorite resources
Tags: git, beginners
Published: 2023-01-18 15:40:08

When you're making a pull request, do you ever realize your Git branch has become a **massive pile of disordered and unrelated changes**, but then you don't do anything about it because you're afraid of making an even worse mess by fooling around with Git commands that you **don't understand** or even **know how to undo**?

Me? No, of course not…


![Nervous laughter](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5dw6s5qsnf4g8ba17cau.gif)

Anyway, I've decided to improve my Git skills, and I thought I'd share my favorite learning resources that I found.

## My favorite Git learning resources

These are excerpted from [the new "Git" section](https://github.com/fpsvogel/learn-ruby#git) of my "Learn Ruby" list. *(Yeah I know, Git is not part of Ruby. It's just that I didn't want to create a separate list for general programming skills.)* I keep the list up to date, so unless you're reading this in January 2023, you should check there in case I've found more Git resources.

I made the Git list by (1) scouring the Web for recommended resources, then (2) trying out each one to see if it would be worth going through to the end. In case you're curious about which resources *didn't* make the cut, [here's the commit where they are removed](https://github.com/fpsvogel/learn-ruby/commit/adc0385717160935bf233f98fc7e9686b023e283).

(Just so you know, I'm ***proud*** of that commit. Originally I made separate commits to remove each unwanted resource, interspersed with other unrelated commits. But at the end I used my new Git skills to do an interactive rebase, squashing a bunch of commits into one and re-ordering the unrelated commits to an earlier point in the branch 😎)

Without further ado, here are my favorite Git learning resources so far. They're all free except for the last one.

- **Basics:**
  - [Oh My Git!](https://ohmygit.org/)
  - [Oh Shit, Git!?!](https://ohshitgit.com/)
  - [Git Katas](https://github.com/eficode-academy/git-katas)
- **Intermediate/advanced:**
  - [Pro Git](https://git-scm.com/book)
  - [Thoughtbot - Rebuilding Git in Ruby](https://thoughtbot.com/blog/rebuilding-git-in-ruby)
  - 💲[Building Git](https://shop.jcoglan.com/building-git)

Right now I'm working through Git Katas. After that, and before going through the intermediate/advanced Git resources, I might spend time on other fundamentals ([see below](#reflections-on-the-fundamentals)).

## Git-related VS Code extensions

Until recently I used the [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens) VS Code extension, but then I realized that its only features that I care about are either *finnicky* (popup-on-hover Git blame), *needlessly complicated* (browsing a file's history), or *behind a paywall* (graph visualizer).

So I replaced GitLens with these smaller extensions:

- [Git History Diff](https://marketplace.visualstudio.com/items?itemName=huizhou.githd)
- [Git Blame](https://marketplace.visualstudio.com/items?itemName=waderyan.gitblame) to quickly see the current line's blame in the status bar.
- [Git Graph](https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph) for when your repo is complex enough that `git log --oneline --graph` is hard to decipher.

## Reflections on the fundamentals

Besides the "Git" section, I've added three other sections under a "Fundamental tools" heading:

- [SQL](https://github.com/fpsvogel/learn-ruby#sql)
- [How the internet works](https://github.com/fpsvogel/learn-ruby#how-the-internet-works)
- [Linux / command line](https://github.com/fpsvogel/learn-ruby#linux--command-line)

I'm really enjoying learning these fundamentals. I love Ruby, but it's nice to focus my learning on something else for a change—though I'm still watching [Ruby screencasts](https://github.com/fpsvogel/learn-ruby#ruby-blogs-podcasts-screencasts) whenever my wrists need a break.

In fact, I'm having so much fun that I'm tempted to expand the "Fundamental tools" section, but it's probably best to pick a few technologies and go deep into each, rather than throwing a bunch more stuff in there and making it less likely that I'll go deep into anything.

So, as a compromise, I have a separate ["Expanding my horizons"](https://github.com/fpsvogel/learn-ruby#expanding-my-horizons) section for those times in the future when I want to take a dive into something outside of Ruby or frontend skills.

As I write this, I'm reminded of [a Thoughtbot blog post](https://thoughtbot.com/blog/what-technologies-should-i-learn) about "evergreen skills" (similar to what I've called "fundamental tools") which is worth a read.

I hope my explorations of Git and other fundamentals has been as rewarding for you as it has been for me. Happy learning!