LaTeX Git Version Control like a Pro

No more FINAL_FINAL.tex chaos – tame your .tex, .bib, and graphics with an offline‐only LaTex Git workflow that follows you from MacBook/Windows to Linux, and back again.

A Little Backstory

I first went fully offline with LaTeX when my supervisor warned me that cloud-based editors can be vulnerable, and that my unpublished work deserved better protection. So I ditched Overleaf and installed TeXShop on my MacBook. Suddenly I had to learn to troubleshoot compilation errors by hand, no AI smoothing out my mistakes, so my LaTeX chops grew by leaps and bounds. And the payoff was that if it compiled on my Mac, it compiled for my reviewers, too. No one likes wrestling with “missing package” errors before they even read your text.

Once I’d mastered offline editing, another pain point emerged: version madness. Every draft spawned paper_V1.tex, paper_V2.tex, paper_FINALcopy.tex… you get the picture. And after the peer-review feedback for my first paper rolled in, I was spending half my day comparing the different versions, creating fresh folders, deleting .aux files, zipping up only the sources I wanted, and emailing them off. There had to be a better way!

Turns out, there is. You can use Git entirely offline. No GitHub, no public repos. Just you, your MacBook, and even a portable external drive that you can plug into your uni’s Linux workstation.

Here’s the guide I wish I’d had when I first made the switch.

1. Prerequisites

    macOS (Homebrew installed) (I’m pretty sure Windows should work too)

    Linux workstation (any distro, with USB access)

    External drive (formatted HFS+, ext4, or exFAT so both OSs can read/write)

    Basic comfort with the terminal (we’ll keep commands super straightforward!)

    2. 💻 Install Git & latexdiff

    On macOS
    Zsh
    brew install git
    brew install latexdiff
    On Linux
    Zsh
    # Debian/Ubuntu
    sudo apt update
    sudo apt install git latexdiff
    
    # Fedora/CentOS
    sudo dnf install git latexdiff
    

    3. 🎬 Start Your Local Git Repo

    – Create your project folder
    Zsh
    mkdir -p ~/Writing/my-paper
    cd ~/Writing/my-paper
    
    – Initialize it
    Zsh
    git init
    
    – Add your sources
    Zsh
    git add *.tex *.bib images/
    git commit -m "Initial LaTeX skeleton"
    
    – .gitignore

    The .gitignore file tells Git which files or directories it should leave out of version control – things like .aux, .log, or system files (.DS_Store) that you don’t want cluttering your repo. By listing those patterns in .gitignore, you keep your history and shared snapshots clean of build artifacts and temporary files.

    Create a file named .gitignore. Creating and populating a .gitignore is as simple as making a new text file and listing the patterns you want Git to skip.

    Zsh
    touch .gitignore              # makes an empty .gitignore file
    

    You can use any text editor to edit this file, in the terminal or GUI. For example, with nano:

    Zsh
    nano .gitignore

    Then paste in your ignore rules. Save (Ctrl + O), then exit (Ctrl + X).

    Zsh
    # LaTeX build artifacts
    *.aux
    *.log
    *.toc
    *.out
    *.lof
    *.lot
    *.gz
    *.pdf
    
    # macOS metadata
    .DS_Store
    

    Then, tell Git to track that file and ignore everything you listed:

    Zsh
    git add .gitignore
    git commit -m "Ignore build artifacts"
    

    Because your repo only tracks the files you actually need (and ignores all the build junk), any time you share or archive it – whether via git archive, a simple git clone, or a zip of the folder – you’ll get a clean bundle containing just your .tex, .bib, images, and any other source files. Your collaborators never have to wade through .aux or .log files.

    4. ✍️ Your Everyday Editing Workflow

    Edit paper.tex, references.bib, and graphics in TeXShop.

    Decide which files belong in your next checkpoint. Maybe it’s just paper.tex , updated references file, and a graphic.

    Stage changes. You’re telling Git, “Hey, include these exact changes in the next snapshot.” Git collects all the edits you’ve explicitly added into its index (a temporary holding area).

    Zsh
    git add paper.tex references.bib images/fig3.png
    

    Commit your snapshot with a clear message.
    You’re saying, “Okay, Git—take everything in the index right now, bundle it up as a new version, and label it with this message.”

    Zsh
    git commit -m "Clarified methods section; updated Fig. 3"
    

    View history anytime:

    Zsh
    git log --oneline
    

    Quick Shortcuts

    Commit all tracked file edits at once
    If you’ve only modified files Git already knows about (no brand-new files), you can skip the separate add step with:

    Zsh
    git commit -am "Your concise description of what changed"

    The -a flag auto-stages any modified or deleted tracked files before the commit.

    Stage everything – new, changed, or deleted files – in one go.

    Zsh
    git add -A
    git commit -m "Everything up to date"
    

    That’s handy when you want to snapshot “all the things” without naming each file.

      5. 🔍 Seeing “What Changed”

      Plain-Text Diff
      Zsh
      git diff        # your working edits vs. last commit
      git diff --staged  # staged changes vs. last commit
      
      LaTeX-Aware PDF Diff
      Zsh
      latexdiff-vc --git paper.tex > diff.tex
      pdflatex diff.tex
      open diff.pdf   # or xdg-open on Linux
      

      Your resulting PDF highlights insertions in blue and deletions in red – ideal for spotting exactly what has changed between versions.

      6. 🛡️ Back Up on Your External Drive

      We’ll keep a bare Git repo on the drive so you can push/pull from both machines.

      Create a bare repo on your USB drive (e.g. /Volumes/Backup/tex-repo.git):

      Zsh
      cd /Volumes/Backup
      mkdir tex-repo.git
      cd tex-repo.git
      git init --bare
      

      Add it as a remote in your MacBook project:

      Bash
      cd ~/Writing/my-paper
      git remote add usb /Volumes/Backup/tex-repo.git
      git push usb main
      

      On Linux, clone from the drive:

      Bash
      git clone /mnt/backup/tex-repo.git ~/Writing/my-paper
      cd ~/Writing/my-paper
      

      Work & commit on Linux, then:

      Bash
      git push origin main
      

      Back on macOS, update with:

      Zsh
      git pull usb main
      

      7. 📦 Sharing a Clean Snapshot

      When you need to send your supervisors the current source bundle, no .aux files, no .log cruft, just run:

      Zsh
      cd ~/Writing/my-paper
      git archive --format=zip --output=paper-for-review.zip HEAD
      

      That ZIP contains only your tracked .tex, .bib, and images/ folders and nothing else.

      8. 🎯 Tips & Tricks

      – Branch for big rewrites:
      Zsh
      git checkout -b discussion-rewrite
      # …edit…
      git commit -m "Revamped discussion section"
      git checkout main
      git merge discussion-rewrite
      
      Tag milestones:
      Zsh
      git tag -a v1.0 -m "Submitted first draft"
      git push usb --tags
      
      Recover an old file:
      Zsh
      git show HEAD~2:paper.tex > old-intro.tex
      

      Now, you can to track every edit, compare changes, backup your repo, and share polished source bundles with your supervisors, colleagues, or publishers, like a pro! No more “which file was the real FINAL,” and no more manual folder clean-ups before sharing. Now you can focus on the words, and let Git handle the rest. And all of that, offline, in case you are, like me, concerned about safeguarding your intellectual property.

      9. 🖼️ Organizing & Tracking Your Figures

      Keeping all of your graphics in one place, and teaching both Git and LaTeX to find them, makes your workflow smoother.

      Create a dedicated folder

      Markdown
      my-paper/
      ├ paper.tex
      ├ references.bib
      └ images/
          ├ fig1_overview.png
          ├ fig2_results.pdf
          └ diagram.svg
      

      Tell LaTeX where to look.

      In your preamble (before \begin{document}), add:

      LaTeX
      \usepackage{graphicx}
      \graphicspath{{images/}}
      

        Now you can write:

        LaTeX
        \includegraphics[width=0.8\linewidth]{fig2_results.pdf}
        

        without needing images/fig2_results.pdf each time.

        Stage them all at once.

        Whenever you add, update, or delete a graphic, simply:

        Zsh
        git add images/
        git commit -m "Add/update figures"
        

        Git will pick up every new or changed file in images/ in one go.

        Keep names descriptive & version-friendly.

        fig3_experiment1.png instead of image3.png.

        Avoid spaces or special characters.

        If you need a revised version, overwrite the old file (Git still stores the history).

        With this setup, LaTeX compiles seamlessly, Git tracks every figure, and you never have to juggle per-file adds or fight with relative paths again. Your images folder becomes a single source of truth, both for you and for anyone you share your repo with.

        💌 Want More?

        I’d love to hear what tools or setups you’re using! Drop a comment below, shoot me an email, or say hi on YouTube.

        Leave a Reply

        Your email address will not be published. Required fields are marked *