# 撤销 Git 仓库中的更改

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

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))）中，选择要还原的一个或多个文件，然后从上下文菜单中选择   回滚  ，或按 `Ctrl+Alt+Z` (Windows), `⌘ ⌥ Z` (macOS), `⌘ ⌥ Z` (IntelliJ IDEA Classic (macOS)), `⌘ ⌥ Z` (macOS System Shortcuts), `Ctrl+Alt+Z` (XWin), `Ctrl+Alt+Z` (GNOME), `Ctrl+Alt+Z` (KDE), `Ctrl+Alt+Z` (Emacs), `Ctrl+Alt+Z` (Sublime Text), `⌘ ⌥ Z` (Sublime Text (macOS)), `Ctrl+Alt+Z` (Visual Studio), `⌘ ⌥ Z` (Visual Studio (macOS)), `Ctrl+Alt+Z` (NetBeans), `Ctrl+Alt+Z` (Eclipse), `⌃ ⌥ ⇧ Z` (Eclipse (macOS))。

2. 在打开的对话框中，检查要还原的文件列表。

选中   删除已添加文件的本地副本   复选框，以还原新增文件以及对已修改文件的更改。

所有自上次提交以来对所选文件所做的更改都将被丢弃，并且它们将从活动变更列表中消失。

Procedure: 取消暂存文件

默认情况下，IntelliJ IDEA 会使用 [变更列表](managing-changelists.html) 概念，在此概念下修改的文件会自动暂存。

* 如果文件已经在版本控制之下，并且您不想提交它，您可以：

* [从提交中删除](adding-files-to-version-control.html)：不要在 更改 区域的 提交 工具窗口中选择它。

* [将其移动到另一个更改列表](managing-changelists.html#move-between-changelists)。

* 如果您更习惯于暂存的概念，请在   版本控制 | 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)) 中选择   启用暂存区   选项。

此外，默认情况下，IntelliJ IDEA 建议将每个新创建的文件添加到版本控制中。 您可以在  `设置 | 版本控制 | 确认` 中分别使用   创建文件时  和   当文件被删除时  设置来更改此行为。

Procedure: 撤销上一次提交

IntelliJ IDEA 允许您撤销当前分支中的最后一次提交。

> **Note:**
> 如果提交已推送到受保护的分支，则无法撤销提交，即那些不允许 [force --push](commit-and-push-changes.html#force-push) 的分支（可在   版本控制 | 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 会在您检出时自动将其标记为受保护分支。

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. 在   选择目标更改列表   对话框中，选择将要丢弃的更改将被移动到的更改列表。 您可以从   名称   列表中选择现有更改列表，或者指定新更改列表的名称（默认使用提交消息）。

输入一个可选的注释。 当新的更改列表提交到仓库时，此注释将显示在   注释   文本区域中，该区域位于   提交更改   对话框中。

4. 如果您希望将即将丢弃更改的更改列表设为活动更改列表，请选择   设置为活动   选项。

5. 如果您希望 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)) 中找到您想要还原的提交，右键点击它并从上下文菜单中选择   还原提交  。 此选项也可以通过文件 [History](version-control-tool-window-history-tab.html) 视图中的上下文菜单获得。   提交更改  对话框将会以自动生成的提交信息打开。

> **Note:**
> 如果您在   日志  视图中对选择的多个提交应用此操作，将为每个提交创建一个单独的提交来还原它们。

2. 如果所选的提交包含多个文件，且您只需要还原其中的一些文件，请取消选择您不想更改的文件。

3. 点击   提交  提交一个变更集，将选定文件中的更改还原到此特定提交。

Procedure: 还原所选更改

IntelliJ IDEA 允许您撤销已推送提交中的选定更改，如果此提交包含多个文件而您只需要还原其中的一些文件。

1. 在   日志   视图中选择包含您想要丢弃的更改的提交。

2. 在 [Changed Files](log-tab.html#changedFiles)窗格中，右键点击您想要还原的文件，然后从上下文菜单中选择   还原所选更改  。

这会生成一个新的提交来撤销您想要撤销的更改。

Procedure: 放弃提交

与 [还原一个提交](#revert-commit)不同，后者会反映在分支历史中，您可以在当前分支中丢弃已推送的提交而不留下任何操作痕迹。

> **Warning:**
> 与任何 [重写分支](edit-project-history.html)历史记录的操作一样，丢弃提交需要使用 [强制推送](commit-and-push-changes.html#force-push)，并且无法在受保护的分支上执行（这些可在   版本控制 | 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)) 中进行配置）。

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

Procedure: 从提交中丢弃所选更改

如果您已在多个文件中提交了更改，并希望在推送提交之前回滚其中部分更改，则可以只丢弃这些更改中的一部分，而不是 [丢弃整个提交](#drop-git-commit)。 请注意，被丢弃的更改将被删除。

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. 在右侧的   已更改的文件   窗格中，选择包含您要丢弃的更改的文件，右键点击它们，然后选择   删除所选更改  。

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

Procedure: 将分支重置到特定提交

如果您在一组最近的提交中发现错误并希望重做该部分，您可以将仓库回滚到特定状态。 这是通过将当前分支的 HEAD 重置为指定的提交来完成的（如果您不希望在历史记录中反映此撤消操作，还可以选择重置 index 和 working tree）。

1. 打开   版本控制   工具窗口 `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. 选择您要将 HEAD 移动到的提交，并从上下文菜单中选择   将当前分支重置到此处  。

3. 在打开的   Git Reset  对话框中，选择您希望如何更新工作树和索引，然后点击   重置  ：

* 软 ：所选提交之后的提交中的所有更改都将被暂存（这意味着它们会被移动到 提交 窗口，以便进行查看，并在必要时稍后提交）。

* 混合 ：所做的更改将在选定的提交之后被保留，但不会被暂存以进行提交。

* 困难 ：在所选提交之后所做的所有更改都会被丢弃（包括已暂存和已提交的更改）。

* 保留 ：在选定的提交之后所做的已提交更改将被丢弃，但本地更改将保持不变。

Procedure: 获取文件的先前修订版本

如果您需要还原单个文件而不是丢弃包含多个文件更改的整个提交，您可以返回到该文件的特定版本：

1. 在任意视图中选择所需文件（   项目   工具窗口（ `Alt+1` (Windows), `⌘ 1` (macOS), `⌘ 1` (IntelliJ IDEA Classic (macOS)), `⌘ 1` (macOS System Shortcuts), `Alt+1` (XWin), `Alt+1` (GNOME), `Alt+1` (KDE), `Alt+1` (Emacs), `Alt+1` (Sublime Text), `⌘ 1` (Sublime Text (macOS)), `Ctrl+Alt+L` (Visual Studio), `⌘ ⌥ L` (Visual Studio (macOS)), `Ctrl+1` (NetBeans), `Alt+1` (Eclipse), `Alt+1` (Eclipse (macOS))）、编辑器、   提交   窗口等）。

2. 从主菜单中选择   Git | 选定文件 | 显示历史  ，或从所选内容的上下文菜单中选择   Git | 显示历史  。   历史记录   选项卡已添加到   Git   工具窗口中，显示所选文件的历史记录，并允许您查看和比较其修订版本。

3. 当您确定了想要恢复的修订版本后，请在列表中选择该版本，并从上下文菜单中选择   Get  。

