ChatGPT解决这个技术问题 Extra ChatGPT

回滚到公共仓库中的旧 Git 提交

我如何才能回滚到 git 中的特定提交?

有人可以给我的最佳答案是使用 git revert X 次,直到我达到所需的提交。

因此,假设我想恢复到 20 次提交的旧提交,我必须运行 20 次。

有没有更简单的方法来做到这一点?

我不能使用重置,因为这个存储库是公开的。

git revert 不起作用?
正如我的问题所述,如果我想恢复到 20 次提交前的内容,这真的对我没有帮助。
这个问题在这里得到了很好的回答stackoverflow.com/questions/4114095/…
目前尚不清楚您所说的“回滚”是什么意思。这是否意味着您想暂时将工作副本切换到特定版本?或者您确实想将存储库的历史永久恢复到某个版本?
您应该接受一个答案,并可能投票赞成您喜欢的任何其他答案。

S
Sunil Kumar

尝试这个:

git checkout [revision] .

其中 [revision] 是提交哈希(例如:12345678901234567890123456789012345678ab)。

不要忘记最后的 .,非常重要。这会将更改应用于整个树。您应该在 git 项目根目录中执行此命令。如果您在任何子目录中,则此命令仅更改当前目录中的文件。然后提交,你应该很好。

您可以通过以下方式撤消此操作

git reset --hard 

这将从工作目录和暂存区中删除所有修改。


@AlexReisner 那段时间在您当前所在目录的终点,不一定是整个 git 项目,对吗?如果您想将更改应用到整个项目,如果您当前不在 git 项目根目录中,您是否会像在 'git add :/' 中那样使用 ':/'?
注意:如果您从那时起向项目添加了新文件,这不会删除它们。因此,当您进行构建时(取决于您的平台),您仍然可能会遇到错误。删除新文件,一切顺利。
@MSpreij您应该在 git 项目根目录中执行此命令。如果您在任何子目录中,则此命令仅更改当前目录中的文件。
当您可以在另一个目录中克隆项目并使用 git checkout [revision] 时,它很棒。回到特定版本,然后将其与其他目录中的同一项目进行比较。节省大量时间。
该死,我忘记了“。”我对我的存储库造成了什么损害?
C
Community

要回滚到特定提交:

git reset --hard commit_sha

回滚 10 个提交:

git reset --hard HEAD~10

如果您不想重写历史记录,可以使用“git revert”,如下面的帖子

How to revert Git repository to a previous commit?


这种方法和“git checkout [revision]”之间的唯一区别。是后者保留了修订。
这个答案是错误的,因为 OP 明确指出“我不能使用重置,因为这个 repo 是公开的”
如果 repo 是公开的,我认为如果不使用强制推送(git push -f)就无法回滚公共存储库上的提交,因为它会影响在回滚之前拉入更改的人。因此,reset 也可以在公共 repo 的本地沙箱中使用。
很好,这避免了分离的 HEAD!正是我想要的。
@Yarin 答案是好的,OP 的前提是错误的,他不能在公共回购中使用重置。他可以。对不起,死灵评论;)
B
Ben

好吧,我想问题是,“回滚”是什么意思?如果您不能 reset 因为它是公开的并且您希望保持提交历史记录完整,您的意思是您只希望您的工作副本反映特定的提交吗?使用 git checkout 和提交哈希。

编辑:正如评论中指出的那样,使用 git checkout 而不指定分支将使您处于“无分支”状态。使用 git checkout <commit> -b <branchname> 签出到分支,或使用 git checkout <commit> . 签出到当前分支。


这不会让你进入奇怪的“目前不在任何分支”状态吗?您如何提交更改以完成回滚?
好吧,我只是建议使用 git checkout——他可以自由地检查他希望的任何分支(当前的或新的)。我会更新我的答案,这样就不会模棱两可了。
我试过这个,但我认为这不是正确的方法,因为它会留下停滞的文件。这不会删除上次提交中没有的文件。
如果您在工作目录中并且您保留在主目录中,则需要 git reset 删除那些您说您不想这样做的文件。尝试在一个单独的分支中进行:git checkout <commit> -b <branchname>,您将不会有停滞的文件在那个分支中
使用 checkout 的问题在于它不会删除在先前提交中添加的文件。
佚名

原始海报说:

有人可以给我的最佳答案是使用 git revert X 次,直到我达到所需的提交。因此,假设我想恢复到 20 次提交的旧提交,我必须运行 20 次。有没有更简单的方法来做到这一点?我不能使用重置,因为这个 repo 是公开的。

不必使用 git revert X 次。 git revert 可以接受一个提交范围作为参数,因此您只需使用一次即可恢复一系列提交。例如,如果您想恢复最近的 20 次提交:

git revert --no-edit HEAD~20..

提交范围 HEAD~20..HEAD~20..HEAD 的缩写,表示“从 HEAD 提交的第 20th 个父级开始,并将其之后的所有提交还原到 HEAD”。

假设这些都不是合并提交,这将恢复最后 20 次提交。如果有合并提交,那么您不能在一个命令中将它们全部还原,您需要单独还原它们

git revert -m 1 <merge-commit>

另请注意,我已经使用 git 版本 1.9.0 测试了使用带有 git revert 的范围。如果您使用的是旧版本的 git,使用带有 git revert 的范围可能会也可能不会工作。

在这种情况下,git revert 优于 git checkout

请注意,与 this answer that says to use git checkout 不同,git revert 实际上会删除在您要恢复的任何提交中添加的所有文件,这使得这是恢复一系列修订的正确方法。

文档

git-revert(1) 手册页。

提交范围。


注意:这会创建一个包含还原更改的新提交。非常适合OP的问题。但请确保这是您想要的。 (上面链接的 git-revert 文档中的示例非常好。)如果您希望调查之前的提交(即在选择要恢复的提交之前)使用其他答案中提到的结帐选项,请记住其他人的评论关于已删除的文件。
@SherylHohman 恢复到以前的提交不会创建新的提交。我无法想象你在这里的意思。
I
Igor

第 1 步:获取提交列表:

git log

你会得到像这个例子中的列表:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <author@gmail.com>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <author@gmail.com>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <author@gmail.com>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

第 2 步:复制所需的提交哈希并将其粘贴以进行结帐:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

就这样。


这只会影响您的本地,对吗?我需要找到错误发生的位置,并打算使用这种方法来不断获得不同的提交,直到错误消失。我只想改变我的本地;不遥远。
S
Shiva Prasad

想要 HEAD 分离模式?

如果您希望使用 DETACHED HEAD 将 X 时间回滚到某个提交(这意味着您不能搞砸任何事情),那么请务必使用以下命令:

(将 X 替换为您希望返回的提交次数)

git checkout HEAD~X

IE 返回一个提交:

git checkout HEAD~1

j
jthill
git read-tree -um @ $commit_to_revert_to

会做的。它是“git checkout”,但没有更新 HEAD。

你可以达到同样的效果

git checkout $commit_to_revert_to
git reset --soft @{1}

如果您更喜欢将便利命令串在一起。

这些使您的工作树和索引处于所需状态,您只需 git commit 即可完成。


这是唯一一种像魅力一样直接的方法!我从头检查,运行这个命令,它成功地删除了我们引入的添加文件并恢复了所有更改。出色的。
D
Daniel Viglione

假设您在一个项目上工作一天左右。您注意到一项功能仍然给您带来错误。但是您不知道您所做的更改导致了错误。所以你必须钓鱼以前的工作提交。要恢复到特定的提交:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

好的,这样提交对你有用。没有更多的错误。你指出了这个问题。现在你可以回到最新的提交:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

并在导致错误之前签出特定文件(在我的情况下,我使用示例 Gemfile.lock):

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

这是处理您在提交中创建的错误的一种方法,直到后来才意识到错误。


N
Naved Ahmad

您可以在 GitHub/BitBucket/Gitlab 的提交部分中找到与每个提交相关的提交 ID。它非常简单,假设您的提交 ID 是 5889575,那么如果您想回到代码中的这一部分,那么您只需输入

git checkout 5889575 .

这将带您到代码中的那个时间点。


k
ken

我不确定发生了什么变化,但如果没有选项 --detach,我将无法签出特定的提交。对我有用的完整命令是:git checkout --detach [commit hash]

为了从分离状态中恢复,我必须检查我的本地分支:git checkout master


签出 master 解决了保持分离的问题,而执行 git reset --hardgit checkout -- . 确实有效但保持分离
m
mcvkr

这是一个例子

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .