乐闻世界logo
搜索文章和话题

How do i undo the most recent local commits in git

7 个月前提问
3 个月前修改
浏览次数53

6个答案

1
2
3
4
5
6

在Git中撤销最近的本地提交,您可以使用几种不同的方法,取决于您想要的结果。下面是两种常用的情况:

1. git reset(不影响工作目录)

如果您想要撤销提交但保留所做的更改以便重新提交,可以使用git reset命令。例如,要撤销最后一次提交并保留更改,可以使用:

bash
git reset --soft HEAD~1
  • --soft 选项意味着更改将保留在暂存区中,您可以编辑这些更改或直接重新提交。
  • HEAD~1 表示当前分支的上一个提交,也就是要撤销的提交。

2. git reset(影响工作目录)

如果您不仅想要撤销提交,还想丢弃所有的更改,可以使用:

bash
git reset --hard HEAD~1
  • --hard 选项会将工作目录中的文件恢复到上一个提交的状态,即撤销所有更改。
  • 同样,HEAD~1 表示当前分支的上一个提交。

注意事项

在使用git reset时要格外小心,因为--hard选项会丢弃所有未提交的更改。这个操作是不可逆的,所以在执行之前请确保不需要保留这些更改。

示例:

假设我不小心提交了一些不应该提交的敏感数据。为了解决这个问题,我可以使用git reset来撤销这次提交:

bash
# 保留更改,撤销提交 git reset --soft HEAD~1 # 或者,丢弃更改,撤销提交 git reset --hard HEAD~1

在执行--soft选项之后,我可以检查和编辑这些敏感文件,删除敏感数据,并重新提交:

bash
# 检查和编辑文件 # ... # 添加更改到暂存区 git add . # 重新提交 git commit -m "Remove sensitive data and redo the commit"

这样,原来的提交被撤销了,敏感数据从历史记录中移除,而我希望保留的更改仍然可以被包含在新的提交中。

最后,值得一提的是,如果已经将这些提交推送到了远程仓库,则需要在重置本地仓库后,使用git push命令的--force选项来覆盖远程仓库中的历史。不过这样做是有风险的,特别是如果其他人已经基于这些提交做了更多工作的情况下:

bash
git push origin <branch_name> --force

在这种情况下,最好先与团队成员沟通,并确保大家知道你将要做的变更。

2024年6月29日 12:07 回复

撤消提交并重做

shell
$ git commit -m "Something terribly misguided" # (0: Your Accident) $ git reset HEAD~ # (1) [ edit files as necessary ] # (2) $ git add . # (3) $ git commit -c ORIG_HEAD # (4)
  1. git reset是负责撤消的命令。它将撤消您的最后一次提交,同时**保持您的工作树(磁盘上文件的状态)不变。**您需要再次添加它们,然后才能再次提交它们。
  2. 工作树文件进行更正。
  3. git add您想要包含在新提交中的任何内容。
  4. 提交更改,重用旧的提交消息。reset将旧头复制到.git/ORIG_HEAD; commitwith-c ORIG_HEAD将打开一个编辑器,其中最初包含旧提交的日志消息并允许您对其进行编辑。如果您不需要编辑消息,则可以使用该-C选项。

或者,要编辑先前的提交(或仅编辑其提交消息)commit --amend会将当前索引中的更改添加到先前的提交。

要删除(而不是恢复)已推送到服务器的提交git push origin main --force[-with-lease],需要重写历史记录。使用它_几乎总是_--force一个坏主意;相反--force-with-lease,正如git 手册中所述:

如果您[重写历史]已经发表,您应该了解重写历史的含义。


进一步阅读

您可以用来git reflog确定要恢复到的提交的SHA-1 。获得此值后,请使用如上所述的命令序列。


HEAD~是相同的HEAD~1。文章git 中的 HEAD 是什么?如果您想取消提交多个提交,这很有帮助。

2024年6月29日 12:07 回复

如果您不知道它是如何工作的,那么撤消提交会有点可怕。但如果你真的理解的话,这实际上是非常容易的。我将向您展示撤消提交的 4 种不同方法。

假设你有这个,其中 C 是你的 HEAD,(F) 是你的文件的状态。

shell
(F) A-B-C master

选项1:git reset --hard

您想要销毁提交 C 并丢弃所有未提交的更改。你做这个:

shell
git reset --hard HEAD~1

结果是:

shell
(F) A-B master

现在 B 是 HEAD。因为您使用了--hard,所以您的文件将重置为提交 B 时的状态。

选项2:git reset

也许提交 C 并不是一场灾难,只是有点偏离。您想要撤消提交,但保留更改以进行一些编辑,然后再进行更好的提交。从这里重新开始,以 C 为 HEAD:

shell
(F) A-B-C master

这样做,省略--hard

shell
git reset HEAD~1

在这种情况下,结果是:

shell
(F) A-B-C master

在这两种情况下,HEAD 只是指向最新提交的指针。当你执行 a 时git reset HEAD~1,你告诉 Git 将 HEAD 指针向后移动一次提交。但是(除非您使用--hard)您将保留文件原样。现在git status显示您已签入 C 的更改。您没有丢失任何东西!

选项 3:git reset --soft

对于最轻微的接触,您甚至可以撤消您的提交,但保留您的文件和索引

shell
git reset --soft HEAD~1

这不仅不会影响您的文件,甚至会影响您的_索引_。当您这样做时git status,您将看到索引中的文件与以前相同。事实上,在执行此命令之后,您可以执行git commit并且会重做刚刚进行的相同提交。

选项 4:您已这样做git reset --hard并且需要取回该代码

还有一件事:假设您像第一个示例一样**销毁了一个提交,**但后来发现您毕竟需要它?运气不好,对吧?

不行,_还是有_办法找回来的。输入这个

shell
git reflog

您将看到您移动过的(部分)提交SHA(即哈希值)列表。找到您销毁的提交,然后执行以下操作:

shell
git checkout -b someNewBranchName shaYouDestroyed

您现在已经恢复了该提交。Git 中的提交实际上在大约 90 天内不会被销毁,因此您通常可以返回并挽救您不想删除的提交。

2024年6月29日 12:07 回复

有两种方法可以“撤消”上次提交,具体取决于您是否已经公开提交(推送到远程存储库):

如何撤消本地提交

假设我在本地提交,但现在我想删除该提交。

shell
git log commit 101: bad commit # Latest commit. This would be called 'HEAD'. commit 100: good commit # Second to last commit. This is the one we want.

要将所有内容恢复到上次提交之前的状态,我们需要reset之前的提交HEAD

shell
git reset --soft HEAD^ # Use --soft if you want to keep your changes git reset --hard HEAD^ # Use --hard if you don't care about keeping the changes you made

现在git log将显示我们的最后一次提交已被删除。

如何撤消公共提交

如果您已经公开提交,您将需要创建一个新的提交,它将“恢复”您在先前提交(当前 HEAD)中所做的更改。

shell
git revert HEAD

您的更改现在将被还原并准备好提交:

shell
git commit -m 'restoring the file I removed by accident' git log commit 102: restoring the file I removed by accident commit 101: removing a file we don't need commit 100: adding a file that we need

有关更多信息,请查看_Git 基础知识 - 撤销操作_。

2024年6月29日 12:07 回复

添加/删除文件以按照您想要的方式进行操作:

shell
git rm classdir git add sourcedir

然后修改提交:

shell
git commit --amend

之前的错误提交将被编辑以反映新的索引状态 - 换句话说,就像您从一开始就没有犯过错误一样。

请注意,只有在尚未推送时才应该执行此操作。如果您已推送,那么您只需正常提交修复即可。

2024年6月29日 12:07 回复

这将添加一个新的提交,该提交将删除添加的文件。

shell
git rm yourfiles/*.class git commit -a -m "deleted all class files in folder 'yourfiles'"

或者您可以重写历史记录以撤消上次提交。

警告:此命令将永久删除对您提交的文件(以及任何其他文件)的修改.java,并从工作目录中删除所有更改:

shell
git reset --hard HEAD~1

to会将hard resetHEAD-1的工作副本设置为错误提交之前的提交状态。

2024年6月29日 12:07 回复

你的答案