Developers version control everything — except their presentations. This is insane when you think about it. Presentations evolve. They're given multiple times to different audiences. Colleagues contribute to them. They have a history that matters.
Yet most developers treat presentations like disposable documents. Build it, present it, throw it in a folder, forget about it. When the next conference comes, start over from scratch or dig through cloud storage looking for "that deck I used at JSConf."
Version controlling your slides with Git solves all of this. And it's easier than you think — if you use the right format.
Why Version Control Presentations?
The benefits mirror why we version control code:
- History. See exactly what you said at every conference, meetup, or client meeting. When someone says "can you send me those slides?", you know exactly which version they saw.
- Branching. Give the same talk to different audiences? Branch the deck. Customize slides for a startup audience vs. an enterprise audience without maintaining separate files.
- Collaboration. Someone wants to contribute slides? Pull request. You can review changes, suggest edits, and merge — the same workflow you use for code.
- Rollback. Deleted a slide you shouldn't have? Changed the design and hate it?
git revert. No more hoping auto-save captured the right version. - CI/CD. Automatically build and deploy your presentation when you push to main. Host it on GitHub Pages or Netlify. Share a URL instead of a file.
- Backup. Your slides live in a remote repository. Laptop dies? Clone the repo on a new machine and present in five minutes.
The Format Problem: Why .pptx Doesn't Work With Git
Here's the catch: Git works best with text files. It can diff text, merge text, and show meaningful history for text. Binary files? Git stores them but can't do anything useful with them.
PowerPoint files (.pptx) are ZIP archives containing XML. Technically text, but the XML is machine-generated, deeply nested, and a single-word change produces a diff that's hundreds of lines long. Google Slides files don't even exist as files — they're API objects on Google's servers.
To version control presentations meaningfully, you need a text-based format:
- Markdown — used by Slidev, Marp, and other Markdown-to-slides tools
- HTML — used by Reveal.js, HTML Decks, and raw HTML presentations
- LaTeX — used by Beamer for academic presentations
All three produce meaningful diffs. All three allow real merging. All three make git log tell a useful story.
Setting Up a Presentation Repo
Let's walk through the practical setup. We'll use an HTML presentation as the example, but the workflow applies to Markdown-based tools too.
Step 1: Initialize the repo
mkdir my-talk-2026
cd my-talk-2026
git init
Step 2: Create your presentation file
If you're using HTML Decks, download a template and drop the HTML file in. If you're using Slidev, run npm init slidev@latest. If you're using Reveal.js, set up the project structure.
For a minimal HTML presentation:
my-talk-2026/
├── index.html # Your presentation
├── assets/ # Images, diagrams
│ └── architecture.svg
├── speaker-notes.md # Notes for yourself
├── .gitignore
└── README.md # What this talk is about
Step 3: Create a useful .gitignore
# Dependencies (if using Slidev/Reveal.js with npm)
node_modules/
dist/
# OS files
.DS_Store
Thumbs.db
# Editor files
*.swp
.vscode/
# Build artifacts
*.pdf
Step 4: Make your first commit
git add -A
git commit -m "Initial deck: API Design Patterns talk"
Now push to a remote — GitHub, GitLab, whatever you use:
git remote add origin git@github.com:you/api-patterns-talk.git
git push -u origin main
Congratulations. Your presentation has version control.
Git-Friendly Presentations Out of the Box
HTML Decks templates are single HTML files — perfect for version control. Edit visually, commit to Git, deploy anywhere.
Get a Template →Real Workflows That Use Git for Slides
Workflow 1: Branching for Different Audiences
You're giving the same talk at a startup meetup and an enterprise conference. The core content is the same, but you want different examples and a different CTA slide.
# Create a branch for the enterprise version
git checkout -b enterprise-version
# Modify slides: swap startup examples for enterprise ones
# Change the CTA slide, adjust the intro
git add -A
git commit -m "Customize for Enterprise DevConf"
# Go back to the startup version
git checkout main
# Both versions live in the same repo
git branch
# * main
# enterprise-version
When the core content updates (bug fix in a code sample, updated statistics), you make the change on main and merge into the branch:
git checkout enterprise-version
git merge main
# Resolve any conflicts in the customized slides
git commit
Workflow 2: Collaborative Deck Building
Your team is building a deck together. Instead of emailing files or fighting over Google Slides edit conflicts, use pull requests:
# Colleague clones the repo
git clone git@github.com:team/q4-review.git
# Creates a branch for their section
git checkout -b add-metrics-section
# Adds their slides, commits, pushes
git add -A
git commit -m "Add Q4 metrics section with charts"
git push origin add-metrics-section
# Opens a pull request for review
You review their slides in the PR diff. You can see exactly what they added, suggest changes, and merge when it's ready. This is how engineering teams already work on code — now it works for presentations too.
Workflow 3: CI/CD Deployment
Push to main and your presentation automatically deploys to a URL. Here's a minimal GitHub Actions workflow:
# .github/workflows/deploy.yml
name: Deploy Slides
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./
Now your presentation lives at https://you.github.io/api-patterns-talk/. Share a link instead of attaching a file. The link always points to the latest version.
Workflow 4: Talk History Archive
Tag each presentation with the event name and date:
git tag -a "jsconf-2026-06" -m "Version presented at JSConf 2026"
git push origin --tags
Now you have a permanent record of exactly what you presented at each event. Months later, when someone asks for "those slides from JSConf," you check out the tag:
git checkout jsconf-2026-06
Tips for Clean Presentation Diffs
Not all text formats diff equally well. Here's how to get the most out of Git:
- One sentence per line. For Markdown and HTML content, put each sentence on its own line. This means changing one sentence produces a one-line diff instead of a paragraph-level diff.
- Use SVG for diagrams. SVG files are text-based XML and diff well in Git. PNG and JPG are binary — Git stores them but can't show meaningful changes.
- Keep assets small. If you must include images, optimize them. Large binary files bloat the repo over time. Consider using Git LFS for images larger than 1MB.
- Commit frequently with clear messages. "Add microservices section" is useful. "Update slides" is not. Your future self will thank you.
- Separate content from style. Keep CSS/styling changes in separate commits from content changes. This makes the history easier to navigate.
Which Presentation Format Works Best With Git?
A quick comparison of how different formats play with version control:
- Markdown (Slidev, Marp): Excellent diffs. One file to track. Minimal syntax means changes are easy to read. Best for content-heavy, text-driven presentations.
- HTML (Reveal.js, HTML Decks): Good diffs. HTML is more verbose than Markdown, so diffs are longer, but still meaningful. Best for presentations that need precise layout control or will be deployed as web pages.
- LaTeX (Beamer): Good diffs. Similar to HTML — more verbose, but meaningful. Best for academic presentations with heavy math.
- PowerPoint (.pptx): Terrible diffs. Binary format. Git can store it, but you get zero useful diff information. Avoid if version control matters.
For a comprehensive comparison of developer-friendly formats, check our guide to the best presentation tools for developers.
Common Objections (And Answers)
"This is overkill for a presentation."
Maybe. If you give one presentation per year, this is unnecessary overhead. If you give talks regularly, maintain decks for clients, or collaborate with colleagues on presentations — it pays for itself the second time you need to find an old version or merge someone's changes.
"Non-technical people can't use Git."
True. If your collaborators aren't developers, Git-based workflows won't work for them. Use Google Slides for those situations. This approach is specifically for teams and individuals who already use Git daily.
"I can just use Google Slides version history."
Google Slides version history is a timeline of snapshots. You can't branch. You can't merge. You can't diff. You can't automate deployment. You can't tag specific versions. Git gives you all of these things because presentations deserve the same rigor as code.
"Setting this up takes too long."
It takes 5 minutes. git init, add your presentation file, commit, push. If you already have a text-based presentation format — whether from a conference talk template or a Markdown tool — adding Git is trivial.
Getting Started Today
Here's the minimum viable version control setup:
- Choose a text-based format. Markdown (Slidev or Marp) for simplicity. HTML (Reveal.js or HTML Decks) for control and portability.
- Create a repo.
git initin your presentation directory. - Commit early and often. Each meaningful change gets a commit with a descriptive message.
- Push to a remote. GitHub, GitLab, or whatever you use. Now it's backed up and shareable.
- Deploy automatically. GitHub Pages or Netlify for free hosting. Your slides live at a URL.
That's it. Five steps. Your presentations now have the same version control discipline as your code. No more presentation_final_v3_FINAL.pptx.
Start With a Git-Friendly Template
HTML Decks templates are single HTML files — perfect for Git. Professional design, works everywhere, version controllable from day one. Free template available, full pack for $29.
Get HTML Decks Templates →