The Question
I saw a poll pop up in my Mastodon feed:
And my brain snagged on it. Because it reminded me that I developed some preferences, built them into aliases, and then shoved them comfortably below the level of conscious thought. And hey, that hasn't caused a problem for me so far! It's still good to re-evaluate these things from time to time though. So when I need to grab some upstream changes with git, what do I do?
Note: I don't intend this as expert guidance - I am neither expert nor guide.
Simple Case
Situation: My active local branch is behind its upstream counterpart.
I...
- Run
git f
(an alias which in my head means "freshen up"). - Under the covers, this runs a
git pull
and I'm up to date. Yay!
More Complex Case
Situation: I'm working on a branch and want to pull updates in from another branch (typically main
).
I...
- Run
git f main
. - Under the covers, this runs a
git fetch
command that updates my local main branch from its upstream remote, but leaves my current branch alone. - Then depending on the situation, I might:
-
git merge main
(perhaps I'm making minor maintainer edits to a community pull request) -
git rebase main
(it's my own junk and I just want to be updated) -
git rebase -i main
(I've got some fine-tuning to do)
-
Is This Working?
I haven't really interrogated my instincts in a while, so does this flow still work for me?
Yeah, I think so. It tucks most of my "get me up to date" behavior behind a single alias, and deliberately leaves me to make a judgement call in cases where the next step is less certain.
For the record, here's the full picture of what git f
does:
#!/usr/bin/env bash
set -euxo pipefail
if [[ -z "${1:-}" ]]; then
git pull -v
else
git rev-parse --abbrev-ref "${1}"@{upstream} | \
awk '{split ($0,ref,"/"); system("git fetch -v --prune " ref[1] " " ref[2] ":" ref[2]); }'
fi
That else
clause feels a bit weird. But it means when I run git f main
:
- That
git rev-parse
bit finds whichever remote is upstream ofmain
. Let's say that's calledorigin
. - Something like
git fetch origin main:main
updates my localmain
branch, but leaves my active branch alone.-
--prune
does a bit of tidying while we're at it, removing local branches that were tracking remote branches that no longer exist
-
There's undoubtedly a better/smarter way to handle this workflow, express it in bash, or both. Suggestions welcome in the comments!
Top comments (1)
Great article explaining the practical differences between git pull and git fetch! If you're looking for a deeper dive into their technical details and scenarios where each command shines, you might enjoy this related post: Git Pull vs Fetch: What's the Difference? It provides a clear comparison and is perfect for beginners and advanced users alike