在Git中撤销最近的本地提交

在Git中撤销最近的本地提交

技术背景

在使用Git进行版本控制的过程中,我们可能会不小心提交了错误的文件或者内容,但尚未将这些提交推送到远程服务器。这时,就需要撤销这些本地提交,以保证版本历史的准确性。Git提供了多种方法来实现这一目的,下面将详细介绍这些方法。

实现步骤

1. 撤销提交并重新提交

1
2
3
4
5
6
$ git commit -m "Something terribly misguided" # (0: 意外提交)
$ git reset HEAD~ # (1)
# === 如果只想撤销提交,到此为止! ===
[ 按需编辑文件 ] # (2)
$ git add . # (3)
$ git commit -c ORIG_HEAD # (4)
  • git reset HEAD~:该命令用于撤销最后一次提交,同时保留工作树(磁盘上文件的状态)不变。之后需要重新添加文件才能再次提交。
  • git add .:将需要包含在新提交中的文件添加到暂存区。
  • git commit -c ORIG_HEAD:提交更改,重用旧的提交消息。reset 会将旧的 HEAD 复制到 .git/ORIG_HEAD;使用 -c ORIG_HEAD 提交会打开一个编辑器,其中最初包含旧提交的日志消息,并允许编辑。如果不需要编辑消息,可以使用 -C 选项。

2. 其他撤销提交的方法

2.1 git reset --hard

如果你想销毁提交并丢弃任何未提交的更改,可以使用以下命令:

1
git reset --hard HEAD~1

该命令会将 HEAD 指针移动到上一个提交,并将文件重置为该提交时的状态。

2.2 git reset

如果提交只是有一点小问题,你想撤销提交但保留更改以便进行一些编辑后再进行更好的提交,可以使用以下命令:

1
git reset HEAD~1

此命令会将 HEAD 指针移动到上一个提交,但文件保持不变。使用 git status 可以看到之前提交的更改。

2.3 git reset --soft

如果你想撤销提交但保留文件和索引,可以使用以下命令:

1
git reset --soft HEAD~1

该命令不仅会保留文件,还会保留索引。使用 git status 会发现索引中的文件与之前相同。实际上,执行此命令后,你可以直接使用 git commit 重新进行相同的提交。

2.4 恢复已删除的提交

如果你使用 git reset --hard 删除了一个提交,但后来发现需要恢复它,可以使用以下命令:

1
git reflog

该命令会显示你移动过的(部分)提交的 SHA(即哈希值)列表。找到你删除的提交,然后执行以下命令:

1
git checkout -b someNewBranchName shaYouDestroyed

这样就可以恢复该提交。在Git中,提交实际上在大约90天内不会被真正销毁,因此通常可以找回不小心删除的提交。

3. 撤销已推送的提交

如果你已经将提交推送到了远程服务器,那么需要创建一个新的提交来“撤销”之前提交所做的更改:

1
git revert HEAD

之后,你的更改将被撤销并准备好提交:

1
git commit -m 'restoring the file I removed by accident'

核心代码

撤销本地提交

1
2
3
4
5
6
7
8
# 撤销提交并保留更改
git reset HEAD~1

# 撤销提交并丢弃更改
git reset --hard HEAD~1

# 撤销提交并保留文件和索引
git reset --soft HEAD~1

恢复已删除的提交

1
2
3
4
5
# 查看提交记录
git reflog

# 恢复提交
git checkout -b someNewBranchName shaYouDestroyed

撤销已推送的提交

1
2
3
4
5
# 撤销当前HEAD的更改
git revert HEAD

# 提交撤销更改
git commit -m 'restoring the file I removed by accident'

最佳实践

  • 在进行撤销操作之前,建议先使用 git statusgit log 命令查看当前的状态和提交历史,确保操作的准确性。
  • 如果不确定使用 --soft 还是 --hard 选项,建议先使用 --soft 选项,因为如果选择 --hard 选项错误,可能会丢失更改。而选择 --soft 选项错误,可以通过额外的命令实现与 --hard 相同的结果。
  • 如果已经将提交推送到了远程服务器,尽量避免使用 git push origin main --force 命令,因为这会重写历史记录,可能会给其他开发者带来困扰。建议使用 git revert 命令创建一个新的提交来撤销更改。

常见问题

1. git reset --hard 命令导致文件丢失怎么办?

可以使用 git reflog 命令找到被删除的提交的 SHA 值,然后使用 git reset --hard shaYouDestroyed 命令恢复到该提交的状态。

2. 在Windows系统中使用 git reset --soft HEAD^ 命令报错怎么办?

在Windows系统中,需要使用双引号将 HEAD^ 括起来,即 git reset --soft "HEAD^"

3. 如果不小心在错误的分支上进行了提交,该如何处理?

可以使用 git reset --soft HEAD~1 命令撤销提交,然后切换到正确的分支,重新进行提交。

4. 已经将提交推送到了远程服务器,能否使用 git reset 命令撤销提交?

不建议使用 git reset 命令,因为这会重写历史记录,可能会给其他开发者带来困扰。建议使用 git revert 命令创建一个新的提交来撤销更改。


在Git中撤销最近的本地提交
https://119291.xyz/posts/2025-04-15.git-undo-recent-local-commits/
作者
ww
发布于
2025年4月15日
许可协议