Skip to content
Projects

yeonjuan/parse-git-diff has 37 GitHub stars and 7 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-14 17:54 UTC. Last push 2026-10-27.

How these counts are measured

Measured star growth

in 24h
0
in 7 days
Collecting history
in 15 days
Collecting history
in 1 month
Collecting history

Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.

About

parse git diff

Developer Tools

README.md

Original

action status npm version license codecov

parse-git-diff

A parser for git diff.

Installation

npm install parse-git-diff

Demo

See online demo

Usage

import parseGitDiff from 'parse-git-diff'; // import
// or
const parseGitDiff = require('parse-git-diff').default; // require
import parseGitDiff from 'parse-git-diff';

const result = parseGitDiff('... git diff ...');

console.log(result);
// {
//   "type": "GitDiff",
//   "files": [
//     {
//       "type": "AddedFile",
//       "chunks": [
//         {
//           "type": "Chunk",
//           "toFileRange": {
//             "start": 1,
// ...
// }

Options

noPrefix (boolean)

Specifies whether the git diff command is used with the --no-prefix option. (default: false)

// git diff HEAD~3 --no-prefix

const result = parseGitDiff(DIFF, {
  noPrefix: true,
});

Examples

New file diff

Input

diff --git a/newfile.md b/newfile.md
new file mode 100644
index 0000000..aa39060
--- /dev/null
+++ b/newfile.md
@@ -0,0 +1 @@
+newfile

Output

{
  "type": "GitDiff",
  "files": [
    {
      "type": "AddedFile",
      "chunks": [
        {
          "type": "Chunk",
          "toFileRange": {
            "start": 1,
            "lines": 1
          },
          "fromFileRange": {
            "start": 0,
            "lines": 0
          },
          "changes": [
            {
              "type": "AddedLine",
              "lineAfter": 1,
              "content": "newfile"
            }
          ]
        }
      ],
      "path": "newfile.md"
    }
  ]
}
Deleted file diff

Input

diff --git a/newfile.md b/newfile.md
deleted file mode 100644
index aa39060..0000000
--- a/newfile.md
+++ /dev/null
@@ -1 +0,0 @@
-newfile

Output

{
  "type": "GitDiff",
  "files": [
    {
      "type": "DeletedFile",
      "chunks": [
        {
          "type": "Chunk",
          "toFileRange": {
            "start": 0,
            "lines": 0
          },
          "fromFileRange": {
            "start": 1,
            "lines": 1
          },
          "changes": [
            {
              "type": "DeletedLine",
              "lineBefore": 1,
              "content": "newfile"
            }
          ]
        }
      ],
      "path": "newfile.md"
    }
  ]
}
Renamed file diff

Input

diff --git a/newfile.md b/rename.md
similarity index 100%
rename from newfile.md
rename to rename.md

Output

{
  "type": "GitDiff",
  "files": [
    {
      "type": "RenamedFile",
      "pathAfter": "rename.md",
      "pathBefore": "newfile.md",
      "chunks": []
    }
  ]
}
Conflict file diff

Input

diff --cc README.md
index 2445f65,f4b8569..0000000
--- a/README.md
+++ b/README.md
@@@ -8,7 -8,7 +8,11 @@@
  npm install parse-git-diff


++<<<<<<< HEAD
 +## a
++=======
+ ## b
++>>>>>>> branch-b

  - [demo](https://yeonjuan.github.io/parse-git-diff/)

Output

{
  "type": "GitDiff",
  "files": [
    {
      "type": "ChangedFile",
      "chunks": [
        {
          "type": "CombinedChunk",
          "fromFileRangeA": {
            "start": 8,
            "lines": 7
          },
          "fromFileRangeB": {
            "start": 8,
            "lines": 7
          },
          "toFileRange": {
            "start": 8,
            "lines": 11
          },
          "changes": [
            {
              "type": "UnchangedLine",
              "lineBefore": 8,
              "lineAfter": 8,
              "content": " npm install parse-git-diff"
            },
            {
              "type": "UnchangedLine",
              "lineBefore": 9,
              "lineAfter": 9,
              "content": " "
            },
            {
              "type": "UnchangedLine",
              "lineBefore": 10,
              "lineAfter": 10,
              "content": " "
            },
            {
              "type": "AddedLine",
              "lineAfter": 11,
              "content": "+<<<<<<< HEAD"
            },
            {
              "type": "UnchangedLine",
              "lineBefore": 11,
              "lineAfter": 12,
              "content": "+## a"
            },
            {
              "type": "AddedLine",
              "lineAfter": 13,
              "content": "+======="
            },
            {
              "type": "AddedLine",
              "lineAfter": 14,
              "content": " ## b"
            },
            {
              "type": "AddedLine",
              "lineAfter": 15,
              "content": "+>>>>>>> branch-b"
            },
            {
              "type": "UnchangedLine",
              "lineBefore": 12,
              "lineAfter": 16,
              "content": " "
            },
            {
              "type": "UnchangedLine",
              "lineBefore": 13,
              "lineAfter": 17,
              "content": " - [demo](https://yeonjuan.github.io/parse-git-diff/)"
            },
            {
              "type": "UnchangedLine",
              "lineBefore": 14,
              "lineAfter": 18,
              "content": " "
            },
            {
              "type": "UnchangedLine",
              "lineBefore": 15,
              "lineAfter": 19,
              "content": " "
            }
          ]
        }
      ],
      "path": "README.md"
    }
  ]
}
New line file diff

Input

diff --git a/rename.md b/rename.md
index aa39060..0e05564 100644
--- a/rename.md
+++ b/rename.md
@@ -1 +1,2 @@
 newfile
+newline

Output

{
  "type": "GitDiff",
  "files": [
    {
      "type": "ChangedFile",
      "chunks": [
        {
          "type": "Chunk",
          "toFileRange": {
            "start": 1,
            "lines": 2
          },
          "fromFileRange": {
            "start": 1,
            "lines": 1
          },
          "changes": [
            {
              "type": "UnchangedLine",
              "lineBefore": 1,
              "lineAfter": 1,
              "content": "newfile"
            },
            {
              "type": "AddedLine",
              "lineAfter": 2,
              "content": "newline"
            }
          ]
        }
      ],
      "path": "rename.md"
    }
  ]
}
Deleted line file diff

Input

diff --git a/rename.md b/rename.md
index 0e05564..aa39060 100644
--- a/rename.md
+++ b/rename.md
@@ -1,2 +1 @@
 newfile
-newline

Output

{
  "type": "GitDiff",
  "files": [
    {
      "type": "ChangedFile",
      "chunks": [
        {
          "type": "Chunk",
          "toFileRange": {
            "start": 1,
            "lines": 1
          },
          "fromFileRange": {
            "start": 1,
            "lines": 2
          },
          "changes": [
            {
              "type": "UnchangedLine",
              "lineBefore": 1,
              "lineAfter": 1,
              "content": "newfile"
            },
            {
              "type": "DeletedLine",
              "lineBefore": 2,
              "content": "newline"
            }
          ]
        }
      ],
      "path": "rename.md"
    }
  ]
}
diff --git a/rename.md b/rename.md
index 0e05564..aa39060 100644
--- a/rename.md
+++ b/rename.md
@@ -1,2 +1 @@
 newfile
-newline
+newline
\ No newline at end of file
diff --git a/rename2.md b/rename2.md
index 0e05564..aa39060 100644
--- a/rename2.md
+++ b/rename2.md
@@ -1,2 +1 @@
 newfile2
-newline2
+newline2
\ No newline at end of file
{
  "type": "GitDiff",
  "files": [
    {
      "type": "ChangedFile",
      "chunks": [
        {
          "type": "Chunk",
          "toFileRange": {
            "start": 1,
            "lines": 1
          },
          "fromFileRange": {
            "start": 1,
            "lines": 2
          },
          "changes": [
            {
              "type": "UnchangedLine",
              "lineBefore": 1,
              "lineAfter": 1,
              "content": "newfile"
            },
            {
              "type": "DeletedLine",
              "lineBefore": 2,
              "content": "newline"
            },
            {
              "type": "AddedLine",
              "lineAfter": 2,
              "content": "newline"
            },
            {
              "type": "MessageLine",
              "content": "No newline at end of file"
            }
          ]
        }
      ],
      "path": "rename.md"
    },
    {
      "type": "ChangedFile",
      "chunks": [
        {
          "type": "Chunk",
          "toFileRange": {
            "start": 1,
            "lines": 1
          },
          "fromFileRange": {
            "start": 1,
            "lines": 2
          },
          "changes": [
            {
              "type": "UnchangedLine",
              "lineBefore": 1,
              "lineAfter": 1,
              "content": "newfile2"
            },
            {
              "type": "DeletedLine",
              "lineBefore": 2,
              "content": "newline2"
            },
            {
              "type": "AddedLine",
              "lineAfter": 2,
              "content": "newline2"
            },
            {
              "type": "MessageLine",
              "content": "No newline at end of file"
            }
          ]
        }
      ],
      "path": "rename2.md"
    }
  ]
}

AST Format

See the types.ts file for all AST formats.

Diffs generated with Git's copy detection (for example, --find-copies-harder) include CopiedFile entries with pathBefore, pathAfter, and chunks. Identical copies have no chunks; edited copies contain the changes relative to the source file. Permission changes are included as oldMode and newMode.

License

MIT