Git Repository Viewer: Commit Graph, Diffs & Blame
A local Git repository’s commit graph, diffs, blame and insights, right in your browser.
Try before you buy.
- Free preview: every count, the newest commits of the graph with their changes and the first rows of every other list (up to 10).
- Locked until you unlock it: download and copy.
- Unlock: Pro pass, ₹179 for 30 days or ₹79 for 1 week, a one-time payment that never renews. Unlock: Pro pass, $5.99 for 30 days or $2.99 for 1 week, a one-time payment that never renews.
Ways to unlock shows how to get the full result.
Printing this result is locked in the free preview.
Open a repository
The folder with the .git folder in it, the .git folder itself or a bare repository. Or drop the folder on this panel.
No folder at hand? Paste git log output
The output of git log --graph --oneline --all for the graph, or of git log --numstat for the insights.
Commits
Commit
Files
| Name | Kind | Size |
|---|
Compare
A branch, a tag, HEAD or a commit id (4 characters or more). The commits each side has that the other lacks, and the files of the second against the merge base, as on a pull request.
Insights
Commits, authors and the punch card cover the whole history. Line counts (churn and hotspots) need a diff of every commit, so they cover the newest ones you choose.
Largest files in the history
Pasted git log
Locked in the free preview. Opens the ways to unlock this result.
Locked in the free preview. Batch runs unlock with a pass.
Locked in the free preview. Query results unlock with a pass.
About the Git Repository Viewer: Commit Graph, Diffs & Blame
Open a Git repository from your computer and read it like a desktop Git client would: the commit graph of every branch and tag with its lanes and merges, each commit with its message, author, parents and the changes of every file side by side or inline, the files at any commit with each file’s history and blame, a comparison of two branches, tags or commits (the commits each side has and the files that differ from the merge base, as on a pull request), insights (commits per author with .mailmap applied, commits per week, a punch card, churn and the files changed most) and the largest files anywhere in the history.
The page reads the repository’s own files, exactly as Git stores them: loose objects, pack files with their deltas, branches, tags and packed-refs. Everything runs in your browser, in a background worker; nothing is uploaded and nothing is written to the folder. No folder at hand? Paste the output of git log --graph or git log --numstat.
Without a pass the result is a free preview: every count in full, the newest commits of the graph with their changes (half of them, up to 10) and the first rows of every other list by the same rule. The rest of the history, the lists in full and the downloads unlock with a Pro pass.
How to use it
- Choose the repository folder (the one with the .git folder in it) or drop it on the page. A ZIP of a cloned folder opens too, and so does the example repository.
- Pick a commit in the graph to read its message and see each changed file side by side or inline. Search finds commits by message, author, branch, tag or id.
- Files shows the tree at any branch, tag or commit; open a file to read it, see the commits that changed it, or blame it line by line.
- Compare two branches, tags or commits: what each one has that the other lacks, and every file that differs from their merge base.
- Insights counts commits per author and per week, draws a punch card and ranks the files changed most; Largest files finds what makes the repository heavy. With a Pro pass you can download the commit list as CSV, a commit or a comparison as a .patch and the insight tables (without a pass the page shows the free preview).
Examples
The example repository: main, feature, origin/main, a merge and the tag v1.0.0
Two lanes that join at “Merge branch 'feature'”, the branch and tag names on their commits, and each commit’s files with their +/− lines and changes side by side
Files → src/app.js → Blame, then History
Each line with the commit and author that last changed it, and the 4 commits that changed the file
Compare origin/main with main
main is 1 commit ahead (Release 1.0.0) and 0 behind; 2 files differ: .mailmap is new and src/app.js gains 2 lines
Common uses
- Reading the history of a project you just cloned without installing a Git client.
- Reviewing what a branch changes before you merge it, file by file.
- Finding who changed a line, and in which commit, from a computer where you cannot install software.
- Seeing who works on a project and when, and which files change most often.
- Finding the large files that make a repository slow to clone.
What the viewer reads, and how
- Objects: loose objects (zlib-compressed, under
objects/) and pack files through their version 2 index, including both kinds of delta Git uses: an offset delta against an earlier object of the same pack and a reference delta against an object named by its id. Only the objects a view needs are read, so a large repository costs only what you look at. - Refs: branches, remote branches and tags as loose files and in
packed-refs, annotated tags followed to their commit, andHEAD(a branch, or a detached commit), as the repository layout describes them. - The graph order is git log’s
--date-order: “Show no parents before all of its children are shown, but otherwise show commits in the commit timestamp order.” The lanes are drawn likegit log --graph: a branch keeps its lane, a merge opens one for its other parent, and lanes join where histories meet. - Authors are merged with the repository’s
.mailmap, which, in Git’s words, is “used to map author and committer names and email addresses to canonical real names and email addresses” (gitmailmap).
Diffs, history and blame
- A commit’s changes are shown against its first parent (for a merge, what the merge brought to that branch), in Git’s unified format with function names in the hunk headers. A file moved without changes shows as a rename; a file moved and edited shows as deleted and added.
- History lists the commits whose version of the file differs from every parent: the commits
git log -- <file>shows, without following renames. - Blame follows each line back through the history to the commit that last changed it, as
git blamedoes; a line it could not follow further (a shallow clone, or the walk’s limit of 5,000 commits) is marked with ^.
Opening a repository
- A folder: choose the repository’s folder, the
.gitfolder itself or a bare repository (project.git). Only the files inside.gitare read; your working files are not opened. Some browsers leave hidden folders such as.gitout of a folder you choose with the button: then choose the.gitfolder itself, or drop the folder on the page. - A ZIP of a cloned folder (the
.gitfolder must be inside it), up to 768 MB per file in the ZIP. GitHub’s “Download ZIP” does not work: “Snapshots don’t contain the entire repository history” (GitHub Docs). Clone the repository instead and open its folder. - Pasted output of
git log --graph --oneline --allshows the graph, andgit log --numstatthe insights, for a repository you can run git in but cannot open here.
Large files and the size of a repository
Largest files measures every version of every file in the newest 20,000 commits, and lists each content once with the newest commit that has it. Every clone downloads all of them, so large binaries slow every clone even after they are deleted. GitHub warns above 50 MiB and “GitHub blocks files larger than 100 MiB”; for larger files it points to Git LFS. Removing a file from the history needs a history rewrite on your own computer, with a tool such as git filter-repo, and everyone who cloned the repository has to clone it again.
Limitations
- Repositories that use SHA-256 object names (extensions.objectFormat = sha256) cannot be read yet. Neither can refs kept in the reftable format: git refs migrate --ref-format=files converts a copy back to loose files with packed-refs.
- Rename detection matches files with exactly the same content only, and a file’s history does not follow renames (git log --follow does).
- Diffs, line counts and blame line up changes without git’s own tie-breaking rules: where a change can be lined up two ways (around blank lines or closing braces), a hunk or a blamed line can differ slightly from what git shows.
- A partial clone (git clone --filter) lacks the objects it did not download, and a shallow clone stops at its boundary: those parts of the history are missing here too. Objects borrowed from another repository through objects/info/alternates are not read.
- Signed commits are shown as signed; the signature is not verified, which would need the signer’s public key.
- The graph holds the newest 200,000 commits; line counts for insights cover the number of commits you choose, and a commit’s line counts cover its first 300 files. Very large repositories can be slow, or too large for the browser’s memory: open a fresh, smaller clone then.
- A linked worktree’s .git is a file that points elsewhere: open the main repository folder. Submodules show as entries pointing at a commit; open each submodule’s own repository to browse it. Files kept in Git LFS show as the small pointer files the repository stores.
Privacy
On this device: nothing is sent
The repository is read in your browser, in a background worker. Nothing is uploaded, stored or written to the folder; closing the page forgets it.
Frequently asked questions
What do I get without a pass?
Without a pass, Git Repository Viewer: Commit Graph, Diffs & Blame shows every count, the newest commits of the graph with their changes and the first rows of every other list (up to 10). Until you unlock it, the result can’t be downloaded or copied. A Pro, Premium or Ultimate pass, a one-time payment that never renews, unlocks the full result. The pricing page lists the passes and their prices.
Is my code uploaded anywhere?
No. The browser hands the page the files you choose, and a background worker on your own device reads them. Nothing is sent to MySmartCoPilot or anyone else, and the folder is never changed.
The page says it found no .git folder. Why?
Some browsers leave hidden folders such as .git out when you choose a folder with the button. Choose the .git folder itself, drop the repository folder on the page instead, or open a ZIP of the folder. GitHub’s Download ZIP has no history in it, so clone the repository first.
Can I open a repository by its GitHub or GitLab URL?
Not directly: clone it with git clone <url>, then open the folder. The page works only with the repository files on your own device, which is also why nothing leaves it.
In which order are the commits listed?
Newest first, and never a parent before its children: git log’s --date-order. Merges and their branches stay in the lanes beside the main line.
What does the free preview show?
Every count in full, the newest commits of the graph with their changes (half of them, up to 10), and the first rows of every other list by the same rule; with one row, the row shows and its figures are masked. The rest and the downloads unlock with a Pro pass.