# 编辑 Git 项目历史

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com/zh-cn/help/idea/llms.txt).

Git 允许您编辑项目历史记录。 当您在功能分支上工作并希望在将其 [分享](apply-changes-from-one-branch-to-another.html)给他人之前清理整理，使其符合您的预期时，这会非常有用。 例如，您可以编辑提交信息，将与相同功能相关的较小提交合并，或将包含不相关更改的提交拆分为单独的提交，向先前的提交添加更改，等等。

> **Warning:**
> 除非绝对必要，否则请避免修改有多个贡献者的远程分支的历史记录，例如，如果您不小心推送了一些敏感数据。
>
>
>
> 为防止数据丢失，改写分支历史的更改推送到远程存储库将被拒绝，因此您需要使用 [强制推送](commit-and-push-changes.html#force-push)。
>
>
>
> 无法修改  受保护 分支的历史记录，当  `git push --force`  未被允许时（可在   版本控制 | Git   设置页面 `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS)) 配置受保护分支）。 请注意，如果一个分支在 GitHub 上被标记为受保护，IntelliJ IDEA 在您检出时会自动将其标记为受保护。
>
>
>
> 此外，您不能对不包含在当前签出的分支中的提交执行修改分支历史的操作。

## 编辑提交信息

如果您唯一需要更改的是提交信息，您可以在推送此提交之前编辑它。

Procedure:

1. 在   日志   选项卡的   Git   工具窗口 `Alt+9` (Windows), `⌘ 9` (macOS), `⌘ 9` (IntelliJ IDEA Classic (macOS)), `⌘ 9` (macOS System Shortcuts), `Alt+9` (XWin), `Alt+9` (GNOME), `Alt+9` (KDE), `Alt+9` (Emacs), `Alt+9` (Sublime Text), `⌘ 9` (Sublime Text (macOS)), `Alt+9` (Visual Studio), `⌘ 9` (Visual Studio (macOS)), `Alt+9` (NetBeans), `Alt+9` (Eclipse), `⌘ 9` (Eclipse (macOS)) 中，右键点击您想要编辑消息的提交，然后从上下文菜单中选择   编辑提交消息  ，或按 `F2` (Windows), `F2` (macOS), `F2` (IntelliJ IDEA Classic (macOS)), `F2` (macOS System Shortcuts), `F2` (XWin), `F2` (GNOME), `F2` (KDE), `F2` (Emacs), `F2` (Sublime Text), `F2` (Sublime Text (macOS)), `Ctrl+R, R` (Visual Studio), `F2` (Visual Studio (macOS)), `Ctrl+R` (NetBeans), `Alt+Shift+R` (Eclipse), `F2` (Eclipse (macOS))。

2. 在打开的对话框中，输入新的提交信息并点击   OK  。

> **Note:**
> 提交后，也可以在成功提交通知中点击   编辑提交消息   来修改提交消息。

## 修订本地提交

有时可能会过早提交并忘记添加某些文件，或者发现某个未推送的提交中有错误，想要在不创建单独提交的情况下进行修复。

可以通过使用   修订提交  选项，将  暂存的更改 附加到所选本地提交来实现此操作。 因此，您最终只会有一个提交，而不是两个不同的提交。

Procedure:

1. 在   提交  工具窗口 `Alt+0` (Windows), `⌘ 0` (macOS), `⌘ 0` (IntelliJ IDEA Classic (macOS)), `⌘ 0` (macOS System Shortcuts), `Alt+0` (XWin), `Alt+0` (GNOME), `Alt+0` (KDE), `Alt+0` (Emacs), `Alt+0` (Sublime Text), `⌘ 0` (Sublime Text (macOS)), `Alt+0` (Visual Studio), `Alt+0` (Visual Studio (macOS)), `Alt+0` (NetBeans), `Alt+0` (Eclipse), `⌘ 0` (Eclipse (macOS))中，选择包含想要添加到本地提交中的更改的已修改文件。

2. 选择   修正提交  选项并点击 ![向下图标](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.chevronDownLarge.svg)，以选择要修改的本地提交。

3. 点击   修订提交  。

## 修改任何之前的提交

> **Tip:**
> 有关修订本地提交，请参阅 [修订本地提交](#amend-commit)。

如果需要对已经推送的较早提交添加更改，可以通过使用  `fixup` 或  `squash` 操作来实现。 这两个命令都将  已暂存的更改 附加到所选的提交，但处理提交消息的方式不同：

* `squash` 将新的提交消息添加到原始提交中

* `fixup` 丢弃了新的提交消息，只保留了原始提交的消息

> **Note:**
> 这两个命令都需要 [变基](apply-changes-from-one-branch-to-another.html#rebase-branch)，因为它们会更改提交哈希。

Procedure:

1. 在   提交   工具窗口 `Alt+0` (Windows), `⌘ 0` (macOS), `⌘ 0` (IntelliJ IDEA Classic (macOS)), `⌘ 0` (macOS System Shortcuts), `Alt+0` (XWin), `Alt+0` (GNOME), `Alt+0` (KDE), `Alt+0` (Emacs), `Alt+0` (Sublime Text), `⌘ 0` (Sublime Text (macOS)), `Alt+0` (Visual Studio), `Alt+0` (Visual Studio (macOS)), `Alt+0` (NetBeans), `Alt+0` (Eclipse), `⌘ 0` (Eclipse (macOS)) 中，选择包含您要追加到早期提交的更改的修改文件。

2. 在   日志   选项卡的   Git   工具窗口 `Alt+9` (Windows), `⌘ 9` (macOS), `⌘ 9` (IntelliJ IDEA Classic (macOS)), `⌘ 9` (macOS System Shortcuts), `Alt+9` (XWin), `Alt+9` (GNOME), `Alt+9` (KDE), `Alt+9` (Emacs), `Alt+9` (Sublime Text), `⌘ 9` (Sublime Text (macOS)), `Alt+9` (Visual Studio), `⌘ 9` (Visual Studio (macOS)), `Alt+9` (NetBeans), `Alt+9` (Eclipse), `⌘ 9` (Eclipse (macOS)) 中，右键点击您想要用本地更改修改的提交，然后从上下文菜单中选择   修正   或   压缩到  。

> **Tip:**
> 还可以在   版本控制  工具窗口 `Alt+9` (Windows), `⌘ 9` (macOS), `⌘ 9` (IntelliJ IDEA Classic (macOS)), `⌘ 9` (macOS System Shortcuts), `Alt+9` (XWin), `Alt+9` (GNOME), `Alt+9` (KDE), `Alt+9` (Emacs), `Alt+9` (Sublime Text), `⌘ 9` (Sublime Text (macOS)), `Alt+9` (Visual Studio), `⌘ 9` (Visual Studio (macOS)), `Alt+9` (NetBeans), `Alt+9` (Eclipse), `⌘ 9` (Eclipse (macOS))的   历史记录  标签页 [查看文件历史](investigate-changes.html#file-history)时  `fixup` 或  `squash` 更改你的更改。

3. 如果您选择合并更改，请修改提交信息。

4. 点击   提交  按钮上的箭头并选择   提交和变基  。

## 压缩（合并提交）提交

如果您需要合并任何与相同功能相关的两个提交，您可以将它们压缩为一个，以便获得更简洁的分支历史记录。

Procedure:

1. 在   日志   选项卡的   Git   工具窗口 `Alt+9` (Windows), `⌘ 9` (macOS), `⌘ 9` (IntelliJ IDEA Classic (macOS)), `⌘ 9` (macOS System Shortcuts), `Alt+9` (XWin), `Alt+9` (GNOME), `Alt+9` (KDE), `Alt+9` (Emacs), `Alt+9` (Sublime Text), `⌘ 9` (Sublime Text (macOS)), `Alt+9` (Visual Studio), `⌘ 9` (Visual Studio (macOS)), `Alt+9` (NetBeans), `Alt+9` (Eclipse), `⌘ 9` (Eclipse (macOS)) 中，选择您想要合并为一个的提交，然后从上下文菜单中选择   压缩提交  。

2. 在打开的对话框中，编辑提交信息（默认情况下，它包含了两个提交的信息），然后点击   OK  。

3. 将更改推 `Ctrl+Shift+K` (Windows), `⌘ ⇧ K` (macOS), `⌘ ⇧ K` (IntelliJ IDEA Classic (macOS)), `⌘ ⇧ K` (macOS System Shortcuts), `Ctrl+Shift+K` (XWin), `Ctrl+Shift+K` (GNOME), `Ctrl+Shift+K` (KDE), `Ctrl+Shift+K` (Emacs), `Ctrl+Shift+K` (Sublime Text), `⌘ ⇧ K` (Sublime Text (macOS)), `Ctrl+Shift+K` (Visual Studio), `⌘ ⇧ K` (Visual Studio (macOS)), `Ctrl+Shift+K` (NetBeans), `Ctrl+Shift+K` (Eclipse), `⌘ ⇧ K` (Eclipse (macOS))送至远程分支。

## 放弃提交

可以在当前分支中丢弃已推送的提交，而无需 [创建用于还原更改的额外提交](undo-changes.html#revert-commit)。

Procedure:

* 在   日志   视图中选择您要丢弃的提交，然后从上下文菜单中选择   放弃提交  。

## 提取所选更改

如果您希望将已提交的更改拆分为多个提交，您可以将所选文件中的更改提取到单独的提交中。

Procedure:

1. 在   日志   选项卡（位于   Git   工具窗口 `Alt+9` (Windows), `⌘ 9` (macOS), `⌘ 9` (IntelliJ IDEA Classic (macOS)), `⌘ 9` (macOS System Shortcuts), `Alt+9` (XWin), `Alt+9` (GNOME), `Alt+9` (KDE), `Alt+9` (Emacs), `Alt+9` (Sublime Text), `⌘ 9` (Sublime Text (macOS)), `Alt+9` (Visual Studio), `⌘ 9` (Visual Studio (macOS)), `Alt+9` (NetBeans), `Alt+9` (Eclipse), `⌘ 9` (Eclipse (macOS))）中，选择本地分支，然后选择您要拆分的提交。

2. 在右侧的   已更改的文件   窗格中，选择包含要提取的更改的文件，右键点击这些文件，然后选择   将所选更改提取到单独的提交  。

3. 在打开的对话框中，必要时输入新的提交消息。

结果将会有两个带有新哈希的提交。

> **Tip:**
> 如果要拆分的提交已推送，仍可将其拆分。 不过，您必须要么 [使用强制推送](commit-and-push-changes.html#force-push)（无法在受保护的分支上执行），要么先 [更新项目](sync-with-a-remote-repository.html#update-git-branch)，将本地分支与远程跟踪分支同步，然后推送合并提交。

