Git without the terminal

Tool-belt series · Git · VS Code · GUI-first

Git, entirely through
the buttons.

Every Git tutorial is written for people who live in a terminal. You don't, and you don't need to — VS Code's Source Control panel does everything you'll actually do, and the GUI is genuinely better for the two things that matter most: reading a diff before you commit and resolving a merge conflict. This page is the mental model plus the five buttons, with no command line required.

Why bother understanding it at all

You can click Commit and Sync without knowing what they do — right up until something goes sideways, and then you're stuck. The model underneath is genuinely simple: four concepts, five buttons. An hour here means you never again lose work, never again fear a conflict, and can undo almost anything.

Everything below is the GUI. There's a short table at the end mapping each button to the command it runs, purely so that when you paste an error into a chat and something suggests a command, you know which button you already pressed.

01

The mental model — four things, in plain English

Forget the jargon for a moment. Git is a save system for a folder, with the ability to run parallel versions and merge them back. That's genuinely all it is.

Commit

A save point for the whole folder, with a note attached. Not a file save — a snapshot of everything, at a moment, that you can return to. Making one is cheap and you should make lots.

Branch

A parallel version of the folder. You go off, make save points, and the original is untouched the whole time. When you're happy, you merge it back. If you're not, you bin it and nothing was lost.

Remote

The shared copy on GitHub. Your machine has its own complete copy; nothing you do is visible to anyone else until you push. This is why you can experiment freely.

And the fourth: the staging area — the one that confuses everybody

Between "I changed a file" and "I made a save point" there's a middle step: staging. You're saying these particular changes go in this commit. In VS Code it's the + next to each file — the difference between Changes (edited, not included) and Staged Changes (going into the next commit).

Why it exists: you often edit five files and only three belong to the thing you're describing. Staging lets you commit those three with an honest message, and the other two separately. If you never care, VS Code will offer to stage everything for you when you commit — and that's a perfectly reasonable way to work.

The sentence that makes it clickChanges = what you've edited. Staged = what's going into the next save point. Commit = make the save point. Sync = share it. That's the whole flow, and everything else in the panel is a variation on it.
02

The Source Control panel — a guided tour

Third icon down the left-hand activity bar — the one that looks like a branching line. Or Ctrl+Shift+G. Nearly everything lives here.

3 SOURCE CONTROL Message (Ctrl+Enter to commit) ✓ Commit Staged Changes 1 index.html roadmaps M Changes 2 fabric-apps.html M + new-page.html U + 1 Describe what you changed One sentence. "Fix mobile nav" beats "updates". 2 Commit — make the save point Local only. Nothing is shared yet. 3 Staged — going into this commit The − button takes it back out. 4 Changes — edited, not included yet + stages it. ↺ discards it (careful — see §5). 5 Click any filename to see the diff Side-by-side: old on the left, yours on the right. Do this every single time before committing. 6 Letters: M = modified, U = untracked (new), D = deleted, C = conflict ⑂ add-fabric-pages* ↻ 1↑ 0↓ 7 Bottom-left = your branch. Click it to switch or create one.

Illustration of the layout — your VS Code will differ slightly by version and theme, but every element shown is in the same place.

The habit worth building firstCallout 5. Click every changed file and read the diff before you commit. Green is added, red is removed. Ten seconds per file, and it catches the accidental deletion, the debug line you left in, and the file you didn't mean to touch. This one habit is most of what "being careful with Git" means.
03

The daily loop — six clicks, every time

This is the whole workflow. It doesn't get more complicated than this for 95% of what you do.

  1. Start from a fresh copy — Sync Changes

    Before you touch anything, pull down what's changed. The in the bottom-left status bar, or Pull. Starting stale is the number one cause of the conflicts in section 4.

  2. Make a branch — click the branch name, bottom-left

    Click the branch name in the status bar → Create new branch… → type a name like fix-mobile-nav. You're now working in a parallel copy and main is safe no matter what you do.

    Do this every time, even for small things. It costs three seconds and it means you can always abandon an idea cleanly.

  3. Change things — normally

    Edit files, let Claude Code edit files, whatever. Files appear under Changes as you go. Nothing is recorded yet.

  4. Read the diffs, then stage — the + buttons

    Click each file, read the diff, then + to stage it. To stage everything at once, hover Changes and click the + on that header row.

  5. Write a message and hit Commit

    One line describing what changed and why. Your future self reads these when hunting for when something broke — "updates" tells them nothing.

    Still local. Nothing has left your machine yet, and you can still change your mind.

  6. Publish Branch / Sync Changes → then the PR in the browser

    The blue button becomes Publish Branch the first time, then Sync Changes afterwards. Once pushed, GitHub shows a Compare & pull request banner — click it, write a sentence, create the PR, merge it. That's the workflow you're already using.

Commit more often than feels necessaryA commit is a save point you can return to, not a formal statement of completion. Ten small commits with clear messages are far more useful than one giant one at the end — and if something breaks, you can find the exact one that did it.
04

Merge conflicts — what they actually are

The thing everyone dreads, and it's genuinely not that bad once you know what Git is asking you. Worth reading properly, because you hit this every time two branches touch the same card grid.

What's actually happening

Git merges automatically whenever it can. It only stops when two branches changed the same lines of the same file and it can't tell which one you meant. That's the entire cause.

It is not an error, and nothing is broken or lost. Git is asking you one question: "which of these do you want — or both?" You answer, you commit, it's over.

This is exactly what happens when two feature branches each add a card to the same grid in index.html: both edited the same spot, and both changes are wanted. The answer is nearly always both.

⚠ index.html — 1 conflict Resolve in Merge Editor Accept Current Change Accept Incoming Change Accept Both Changes Compare Changes 147148149150 151152153154 155156 <<<<<<< HEAD (Current Change — what's on YOUR branch) <a class="card fabric" href="roadmaps/fabric-7-day.html"> <h2>Fabric in 7 Days</h2></a> ======= <a class="card excel" href="roadmaps/excel-skills.html"> <h2>Copilot Skills in Excel</h2></a> >>>>>>> main (Incoming Change — what's already on main) Both cards belong on the page — so click "Accept Both Changes". The <<<<<<<, ======= and >>>>>>> marker lines vanish automatically. Tidy the blank lines, save, stage the file, and commit. The conflict is over.

Illustration of the inline conflict view. The four blue links appear above every conflict block. Green = your branch, blue = what you're merging in.

Resolving one, click by click

  1. Open the file — it's marked C in Source Control

    VS Code jumps you to the conflict and colours the two competing blocks.

  2. Read both sides and decide

    Current is your branch. Incoming is what you're merging in. Ask plainly: which of these should the file end up with?

  3. Click the answer

    Accept Current, Accept Incoming, or Accept Both. For two cards in a grid, it's Accept Both nearly every time. If neither is right, just edit the text by hand and delete the marker lines yourself — that's completely legitimate.

  4. Check no markers survive

    Search the file for <<<<<<<. If any remain, you missed a conflict further down the file — a big file can have several.

  5. Save, stage, commit

    Staging a conflicted file is how you tell Git it's resolved. Commit, and the merge completes.

The three-way Merge EditorClick Resolve in Merge Editor for a nicer view: your version left, theirs right, the result at the bottom, with checkboxes to include either side. For anything more complicated than two added blocks, use it — it's much easier to see what you're producing.
How to stop having themConflicts come from branches drifting apart. Three habits kill most of them: sync before you start, keep branches short-lived (merge within a day or two), and merge main into your branch if it's been open a while, so you deal with a small conflict now instead of a big one later. Two branches that both edit one shared file for a week will always fight.
05

Undoing things — ranked by how much you'll want them

The real confidence unlock. Once you know you can undo anything, you stop being cautious in the ways that slow you down.

You want to…Do this in the GUISafe?
Throw away edits to one file (not committed) The icon next to the file in Changes No undo — the edits are gone. See below.
Unstage a file The next to it under Staged Changes Totally safe — your edits stay
Fix the message you just wrote CommitUndo Last Commit, retype, commit again Safe if you haven't pushed
Undo a commit that's already pushed Right-click the commit in the Graph / history → Revert Safest option — adds an opposite commit, rewrites nothing
Get back a file version from this morning Open the file → Timeline view at the bottom of Explorer → click a point → copy what you need Read-only browsing — completely safe
Abandon a branch entirely Switch to main, then delete the branch from the branch list Safe — main was never touched
The one genuinely dangerous buttonDiscard Changes (the ) deletes uncommitted work with no way back — Git never had a copy, so there's nothing to restore. VS Code's own local file history sometimes saves you, but don't rely on it. If you're unsure, commit first. A messy commit you delete later is free; lost work isn't.

The safety net worth knowing about

Committed work is extremely hard to lose permanently — Git keeps a log of where every branch has pointed for weeks, so even a "deleted" commit is usually recoverable by someone who knows where to look. Uncommitted work has no such protection.

Which reduces to one rule: commit early, commit messily. Tidy history is a nice-to-have. Not losing an afternoon's work is not.

06

The same buttons, in Fabric

You've already connected a workspace to GitHub, so this will look familiar — Fabric's Git integration is deliberately the same model with fewer buttons.

What the workspace source control panel gives you

  • Source control in the workspace shows changed items with the same status idea — edited here, edited in the repo, or both (which is a conflict).
  • Commit pushes your workspace changes up. Update pulls repo changes down into the workspace. Same push/pull, different words.
  • Branch out to a new workspace is the killer feature and has no VS Code equivalent: it creates a whole isolated workspace from a branch, so you can develop without touching what anyone else is using.
  • PRs still happen on GitHub in the browser — Fabric doesn't do the review step, which is fine, because that's the part the browser is good at.
Where it differs from codeFabric items are serialised into folders of JSON and metadata, so a conflict inside a semantic model is much harder to read than a conflict in HTML. Practical rule: avoid conflicts in Fabric rather than resolving them. One person per item at a time, short-lived branches, update before you start.
07

What each button runs — for translation only

You don't need these. They're here so that when documentation or an AI answer mentions a command, you can map it to the button you already know.

The button you clickWhat it runs
+ on a filegit add file
Commitgit commit -m "your message"
Sync Changesgit pull then git push
Publish Branchgit push -u origin branch-name
Create new branchgit checkout -b branch-name
Switch branchgit checkout branch-name
Discard Changesgit restore file — the irreversible one
Revert (right-click a commit)git revert <commit>
Where the GUI genuinely beats the terminalReading a diff and resolving a conflict. Side-by-side colour and click-to-accept are objectively better than staring at markers in a text file — plenty of people who are fluent in the command line still switch to VS Code for exactly these two jobs. Using the GUI isn't a beginner compromise; for these tasks it's the better tool.
← back to the tool belt