Chris Oguntolu1k downloadsManage Git repositories with an intuitive UI: interactive commit graph, source control panel, and diff viewer.
Version control for your vault, with an intuitive interface and no terminal required.
Every note you edit is tracked. You can look back at what changed and when, undo a change you regret, and keep a backup copy somewhere safe. The plugin shows all of it as a visual timeline inside Obsidian — point, click, done.
⭐ Like it? If this plugin keeps your notes safe, please give it a star on GitHub and tell a friend who writes in Obsidian. Stars are how other people find it.
Git is a tool that remembers every version of every file. Three ideas cover almost everything you will do:
| Term | What it means for your vault |
|---|---|
| 📸 Commit | A snapshot of your vault at one moment, with a short note about it. Like a save point you can return to. |
| ⬆️ Push | Uploads your snapshots to a backup copy, so they also exist off this computer. |
| ⬇️ Pull | Downloads snapshots you made elsewhere, for example on another computer. |
A typical day needs one habit: write what changed, press Commit, press Push. Everything else in this plugin is there for the moment you want to look back.
If your vault is not a Git repository yet, run the Initialize Git repository command from Obsidian's command palette and the plugin sets one up for you.
Your changed notes, grouped and ready to commit.
The history of your vault as a timeline.
A compact version lives in the sidebar, so you can glance at recent commits without leaving what you were doing.
Pick any note and see only the commits that touched it — including the ones from before you renamed it. Available from the command palette and from the right-click menu in the source control panel.
See exactly what changed in a note: old and new side by side, or as one annotated text. You can stage or undo a single block of changes instead of the whole file.
A shell inside Obsidian, opened in a panel below your note, starting in your vault's folder — for the occasional command that has no button.
Cmd/Ctrl+J, from the terminal ribbon icon, the commit graph
toolbar, or the Open terminal commandgit and everything else act on your notesCmd/Ctrl+F: a bar over the session with a
match counter, Enter and Shift+Enter to step through the matches, toggles for
match case and regular expressions, and Escape to get back to the shell.
Anything selected in the terminal is what the search starts from.zshrc would put it — aliases, environment variables and
functions are there before the first promptIf a shell does not start, the panel says which program it tried to use and what that program printed, with a Try again button next to it. The Check terminal setup command reports the same thing at any time: which search path is in use, which git and which interpreter were found, and what the terminal can do with them. Something still off? Tell me about it.
Available from Obsidian's command palette (Ctrl/Cmd + P).
| Command | What it does |
|---|---|
| Open source control | Opens the sidebar panel |
| Open Git graph | Opens the full history timeline |
| Commit | Jumps to the panel to write a commit |
| Push | Uploads your commits |
| Pull | Downloads commits made elsewhere |
| Fetch | Checks for new commits without applying them |
| Backup: stage all, commit & push | Snapshots and uploads the whole vault in one step |
| Show file history | Shows the history of the note you have open |
| Initialize Git repository | Sets up version control for a vault that has none |
| Set Git identity | Sets the name and email address Git puts on your commits |
| Open terminal | Opens the shell panel in your vault's folder. Cmd/Ctrl+J |
| Find in terminal | Opens the find bar in the terminal you are in. Cmd/Ctrl+F while the terminal has focus |
| New terminal session | Starts another shell alongside the ones already running |
| Check terminal setup | Reports which programs the terminal found and what it can do with them |
Both shortcuts can be changed or cleared under Settings → Hotkeys. Cmd/Ctrl+F
is not a global binding: it belongs to the terminal while the terminal has the
focus, so the editor's own search is untouched everywhere else.
The name and email address Git records on every commit you make. These are not
plugin settings: they are read from git config, showing whichever value
applies here — your global one, or a value set for this vault, which overrides
it.
| Setting | What it does |
|---|---|
| Name | The name recorded as the author of your commits |
| The address recorded alongside it, and what forges match commits to accounts by |
An edit is written for this vault only. Your global config is read, never written: the name every other repository on your computer commits under is not something a vault's settings should change.
Each row carries a badge saying where its value comes from — This vault, Global Git config, or Not set — so an inherited value and one set for these notes are never the same box with nothing to tell them apart. An inherited one also says what an edit will do: give this vault its own value and leave the original alone.
If neither is set anywhere, the plugin offers to set them when it loads, and again if a commit fails for the lack of them. That prompt writes for this vault too. Both are worth having: without them, Git either refuses to commit or invents a name and an address from your computer's user name and hostname — and puts those on your commits, where no Git host can match them to your account.
Where the vault is pushed to and pulled from: its copy on GitHub, GitLab or a
server of your own. Like the identity, this is not a plugin setting but what
git remote holds in this vault, and editing it runs git.
Every remote is one row: its name, which host it is on, and its address in a
field you can edit. Press + to add one — paste the address the host's clone
button gives you, and the name is filled in as origin for the first. An
address that is not one Git can use is refused with the reason, rather than
stored and failing at the first push.
| Setting | Default | What it does |
|---|---|---|
| Commit message | (empty) | Message used by the one-step backup. {{date}} becomes today's date |
| Pull strategy | merge | How downloaded commits are combined with yours |
| Auto-fetch | off | Check the remote for new commits in the background |
| Auto-fetch every | 300s | How often to check. Greyed out while auto-fetch is off |
| Auto-pull | off | Take in what the auto-fetch finds — fast-forward only, and only while there are no local changes or commits. Greyed out while auto-fetch is off |
| Setting | Default | What it does |
|---|---|---|
| Changes layout | tree | Files nested under their folders, or one flat row per file |
| Compact folders | on | Fold folders holding a single subfolder into one row. Tree layout only |
| Default diff view | side by side | Two columns side by side, or one annotated text |
| Only list files Obsidian can open | on | Leave files no Obsidian view can render out of a commit's file list |
| Setting | Default | What it does |
|---|---|---|
| Show nested repositories | off | List folders that are repositories of their own. They cannot be committed together with the rest of the vault |
| Refresh delay | 1000ms | How long to wait after an edit before refreshing |
| Git binary | (auto-detect) | Path to the git the plugin runs. Empty searches the PATH your own shell uses |
| Setting | Default | What it does |
|---|---|---|
| Shell | (auto-detect) | Path to the shell the terminal starts. Empty uses your system default |
| Python | (auto-detect) | Path to the Python 3 behind the terminal's pseudo-terminal. Empty searches for one |
| Pseudo-terminal | Automatic | Which bridge gives the shell a real terminal. Automatic takes the first that works |
| Startup script | (empty) | Shell code run at the start of every session, after your own rc files and before the first prompt |
| Colour new sessions | off | Hand every session you open the next free colour from the palette |
Obsidian lists what a plugin is capable of, so here is what those capabilities are used for:
git command. That is how every action works — it is the same
program you would use in a terminal, run inside your vault's folder only.Nothing leaves your machine unless you press push, and then only to the backup location you set up yourself.
Git History is free and runs entirely on your own computer. If it is useful to you: