Published October 27, 2019
Updated May 15, 2020
Git Worktree
Demonstrates using Git worktrees for jumping between various contexts without losing or disturbing existing work.
Transcript
# Hello and welcome to the Alchemists Screencasts!
# Today, we'll look at the Git Worktree (https://git-scm.com/docs/git-worktree) command.
# For demonstration purposes, a *demo* project has been created:
cd demo
ls -alhT
# Git Worktree support was added in Git 2.5.0.
# It allows us to work in a linked directory with full capabilities of the main repo.
#
# There are several benefits:
# - Crafting a quick fix without disturbing your current workflow.
# - Temporarily reviewing someone's feature branch.
# - Running separate tests.
# ...etc...
#
# Here's a quick example of working with a detached head:
git worktree add --detach ../demo-detached HEAD
cd ../demo-detached
# Notice my shell prompt no longer contains Git information.
# This happened because we are in a linked Git folder.
# We can verify by inspecting the ".git" file.
cat .git
# We can use full Git features, though:
git status --short --branch
# As well as view branch info, etc...
gbl
# What if we want to work on a feature branch instead of a detached HEAD?
# Here's how:
cd ../demo
git worktree add -b "manual" ../demo-manual master
cd ../demo-manual
# The use of `-b "manual"` is important as this gives us a "manual" branch to work with.
gbl
# Now we can commit work to our "manual" branch as usual:
touch example.txt
git add example.txt
git commit --message "Added example file."
# Great but what happens if we run specs?
rake
# As you can see from the stack dump, our `config/database.yml` is missing.
# This is due to `config/database.yml` being ignored by `.gitignore`.
# We can use my `gwa` shell function to resolve this situation.
# Think of the function as `git worktree` on steroids. 🎉
# Here's the function's source:
cype gwa
# The bulk of this function is dealing with worktree option behavior. Example:
gwa
gwa automated
# The second-to-last line is what makes it powerful!
# Let's zoom in on that line (as the top of the function:
cype gwa | ag --after=1 rsync | head -1
# Here we use `ls-files` + `rsync` to copy the normally ignored/untracked Git files.
# This makes it possible to build a fully functional worktree.
# Here it is in action:
cd ../demo
gwa automated d
direnv allow
# Not only did the function setup the worktree but it moved us into it.
# All via a single command!
# If we run specs, everything works because rsync copied the ignored/untracked files for us:
rake
# Enjoy!
# https://alchemists.io
# ☿ 🜔 🜍 🜂 🜃 🜁 🜄