'\" t
.\" Title: git-history
.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
.\" Generator: DocBook XSL Stylesheets vsnapshot
.\" Date: 2026-04-19
.\" Manual: Git Manual
.\" Source: Git 2.54.0
.\" Language: English
.\"
.TH "GIT\-HISTORY" "1" "2026\-04\-19" "Git 2\&.54\&.0" "Git Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
git-history \- EXPERIMENTAL: Rewrite history
.SH "SYNOPSIS"
.sp
.nf
\fBgit\fR \fBhistory\fR \fBreword\fR \fI\fR [\fB\-\-dry\-run\fR] [\fB\-\-update\-refs=\fR(\fBbranches\fR|\fBhead\fR)]
\fBgit\fR \fBhistory\fR \fBsplit\fR \fI\fR [\fB\-\-dry\-run\fR] [\fB\-\-update\-refs=\fR(\fBbranches\fR|\fBhead\fR)] [\fB\-\-\fR] [\fI\fR\&...]
.fi
.sp
.SH "DESCRIPTION"
.sp
Rewrite history by rearranging or modifying specific commits in the history\&.
.sp
THIS COMMAND IS EXPERIMENTAL\&. THE BEHAVIOR MAY CHANGE\&.
.sp
This command is related to \fBgit-rebase\fR(1) in that both commands can be used to rewrite history\&. There are a couple of major differences though:
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\fBgit-history\fR(1)
can work in a bare repository as it does not need to touch either the index or the worktree\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\fBgit-history\fR(1)
does not execute any
\fBgithooks\fR(5)
at the current point in time\&. This may change in the future\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
\fBgit-history\fR(1)
by default updates all branches that are descendants of the original commit to point to the rewritten commit\&.
.RE
.sp
Overall, \fBgit-history\fR(1) aims to provide a more opinionated way to modify your commit history that is simpler to use compared to \fBgit-rebase\fR(1) in general\&.
.sp
Use \fBgit-rebase\fR(1) if you want to reapply a range of commits onto a different base, or interactive rebases if you want to edit a range of commits at once\&.
.SH "LIMITATIONS"
.sp
This command does not (yet) work with histories that contain merges\&. You should use \fBgit-rebase\fR(1) with the \fB\-\-rebase\-merges\fR flag instead\&.
.sp
Furthermore, the command does not support operations that can result in merge conflicts\&. This limitation is by design as history rewrites are not intended to be stateful operations\&. The limitation can be lifted once (if) Git learns about first\-class conflicts\&.
.SH "COMMANDS"
.sp
The following commands are available to rewrite history in different ways:
.PP
\fBreword\fR \fI\fR
.RS 4
Rewrite the commit message of the specified commit\&. All the other details of this commit remain unchanged\&. This command will spawn an editor with the current message of that commit\&.
.RE
.PP
\fBsplit\fR \fI\fR [\fB\-\-\fR] [\fI\fR\&.\&.\&.]
.RS 4
Interactively split up into two commits by choosing hunks introduced by it that will be moved into the new split\-out commit\&. These hunks will then be written into a new commit that becomes the parent of the previous commit\&. The original commit stays intact, except that its parent will be the newly split\-out commit\&.
.sp
The commit messages of the split\-up commits will be asked for by launching the configured editor\&. Authorship of the commit will be the same as for the original commit\&.
.sp
If passed,
\fI\fR
can be used to limit which changes shall be split out of the original commit\&. Files not matching any of the pathspecs will remain part of the original commit\&. For more details, see the
\fIpathspec\fR
entry in
\fBgitglossary\fR(7)\&.
.sp
It is invalid to select either all or no hunks, as that would lead to one of the commits becoming empty\&.
.RE
.SH "OPTIONS"
.PP
\fB\-\-dry\-run\fR
.RS 4
Do not update any references, but instead print any ref updates in a format that can be consumed by
\fBgit-update-ref\fR(1)\&. Necessary new objects will be written into the repository, so applying these printed ref updates is generally safe\&.
.RE
.PP
\fB\-\-update\-refs=\fR(\fBbranches\fR|\fBhead\fR)
.RS 4
Control which references will be updated by the command, if any\&. With
\fBbranches\fR, all local branches that point to commits which are descendants of the original commit will be rewritten\&. With
\fBhead\fR, only the current
\fBHEAD\fR
reference will be rewritten\&. Defaults to
\fBbranches\fR\&.
.RE
.SH "EXAMPLES"
.SS "Split a commit"
.sp
.if n \{\
.RS 4
.\}
.nf
$ git log \-\-stat \-\-oneline
3f81232 (HEAD \-> main) original
bar | 1 +
foo | 1 +
2 files changed, 2 insertions(+)
$ git history split HEAD
diff \-\-git a/bar b/bar
new file mode 100644
index 0000000\&.\&.5716ca5
\-\-\- /dev/null
+++ b/bar
@@ \-0,0 +1 @@
+bar
(1/1) Stage addition [y,n,q,a,d,p,?]? y
diff \-\-git a/foo b/foo
new file mode 100644
index 0000000\&.\&.257cc56
\-\-\- /dev/null
+++ b/foo
@@ \-0,0 +1 @@
+foo
(1/1) Stage addition [y,n,q,a,d,p,?]? n
$ git log \-\-stat \-\-oneline
7cebe64 (HEAD \-> main) original
foo | 1 +
1 file changed, 1 insertion(+)
d1582f3 split\-out commit
bar | 1 +
1 file changed, 1 insertion(+)
.fi
.if n \{\
.RE
.\}
.sp
.SH "GIT"
.sp
Part of the \fBgit\fR(1) suite