21

这必须很简单,但我在git-scm.

我一直在为一个公共项目做出很多小的承诺,而且我所有的工作都很糟糕。我想删除我所做的一切。有些我刚刚在本地提交,有些我已经推送到'origin master'。

第一次提交(一周前)是bdbad86……最近一次是e82401b……

我只想让所有这些都消失。我试图恢复一个。

git status  
# On branch master  
# You are currently reverting commit e82401b.  
#   (all conflicts fixed: run "git revert --continue")  
#   (use "git revert --abort" to cancel the revert operation)  
  1. 我不知道如何完成此还原。
  2. 我不想单独做每个提交,我想把它们全部吹走。
4

3 回答 3

8

我在这里假设没有其他人在您的工作之间插入提交,并且您的错误提交在 repo 的历史中形成了一个连续的范围。否则你将不得不变得更复杂。假设您的历史记录如下所示:

e82401b - (master, HEAD) My most recent private commit
...
bc2da37 - My first private commit
cf3a183 - (origin/master) My most recent bad public commit
...
292acf1 - My first bad public commit
82edb2a - The last good public commit

我们要做的第一件事是清除您尚未公开的提交。您可以使用以下命令执行此操作(请注意,您的更改将消失,应视为不可恢复):

git reset --hard cf3a183 

等效地(并且更具可读性):

git reset--hard origin/master

现在您对存储库的看法与origin/master. 您现在想要恢复错误的公共更改并将它们作为恢复提交发布。这些说明用于创建单个还原提交。

您可以使用它git revert --no-commit a..b来还原所有从提交之后 a的提交(请注意!)并结束于(包括) commit 的所有提交b。将分阶段进行还原以供您提交。所以,在这里,我们会这样做:

git revert --no-commit 82edb2a..HEAD

或者,等效地:

git revert --no-commit 292acf1^..HEAD

记住,HEAD现在指向与 相同的位置origin/master

运行revert命令后,您现在已将更改暂存并准备好提交,因此只需运行一个简单的git commit -m "Reverting those bad changes I accidentally pushed and made public".

于 2013-12-16T06:02:21.473 回答
5

而不是跑步

git revert --continue

赶紧跑

git commit -m "commit message here"

如果这不起作用,请确保您已暂存了还原中涉及的所有文件。甚至是您还原然后放弃更改的文件。

于 2020-05-21T13:59:45.100 回答
0

这个问题已经得到了正确的回答,但我只想解决 op 问题的第一点——我不知道如何完成这个 reverting。如果您也像我一样陷入恢复状态并来到这里寻找答案。

它可以很简单git revert --continue。但前提是您要还原文件中的一些更改。如果您陷入恢复状态,那很可能是因为您试图恢复创建文件的提交,并且该文件在任何后续提交中都被修改。

举个例子:

1c40cd3 added fileB
4e06828 added fileA
faf29dd (origin/main, origin/HEAD, main) Merged in feature5 (pull request #13)
6e735e3 (origin/feature5, feature5) updated file.txt
fb51fca added file.txt
744ba74 Initial commit

现在,如果您尝试 revert fb51fca (added file.txt),它将向您显示以下内容:

$ git revert fb51fca
CONFLICT (modify/delete): file.txt deleted in parent of fb51fca (added file.txt) and modified in HEAD.  Version HEAD of file.txt left in tree.
error: could not revert fb51fca... added file.txt
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git revert --continue".
hint: You can instead skip this commit with "git revert --skip".
hint: To abort and get back to the state before "git revert",
hint: run "git revert --abort".

$ git status
On branch feature6
You are currently reverting commit fb51fca.
  (fix conflicts and run "git revert --continue")
  (use "git revert --skip" to skip this patch)
  (use "git revert --abort" to cancel the revert operation)

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add/rm <file>..." as appropriate to mark resolution)
        deleted by them: file.txt

你可以清楚地看到file.txt deleted in fb51fca (added file.txt) and modified in HEAD. Version HEAD of file.txt left in tree.。现在,你可以git add -Agit commit ...但是

revert 所做的是返回历史记录(在指定的提交中),删除在该提交中所做的更改。并做出新的承诺。但问题是,您创建了一个文件,现在 revert 正在删除它。最后,没有文件可以暂存,而且如您所知,git 不允许空目录或空提交。

但是有一个空提交的解决方法。正如瑞安建议的那样,你可以做到git commit -m "empty commit to escape revert" --allow-empty。git revert 可能不使用此--allow-empty标志,这可能是它无法执行提交卡在恢复状态的原因。

无论哪种方式,如果您陷入恢复状态,您可能做错了什么。试图还原一些没有意义的东西。

于 2022-02-10T15:22:30.183 回答