我怎样才能回滚到git中的特定提交?
有人可以给我的最佳答案是使用git revert
X次,直到达到所需的提交。
所以,假设我想恢复到20次提交的提交,我必须运行20次。
有更简单的方法吗?
我无法使用重置,因为此存储库是公共的。
试试这个:
git checkout [revision] .
其中[revision]
是提交哈希值(例如:12345678901234567890123456789012345678ab
)。
不要忘记最后的.
,非常重要。这将对整个树应用更改。您应该在git项目根目录中执行此命令。如果您位于任何子目录中,则此命令仅更改当前目录中的文件。然后承诺,你应该是好的。
你可以撤消这个
git reset --hard
这将删除工作目录和暂存区域中的所有修改。
您可以在GitHub / BitBucket / Gitlab的提交部分中找到与每个提交相关的提交ID。它非常简单,假设您的提交ID为5889575,那么如果您想在代码中返回此部分,则只需键入
git checkout 5889575 .
这将带您到代码中的那个时间点。
如果您希望将X时间回滚到具有DETACHED HEAD的某个提交(意味着您不能搞砸任何东西),那么请务必使用以下内容:
(将X替换为您希望返回的提交数量)
git checkout HEAD~X
I.E.返回一个提交:
git checkout HEAD~1
要回滚到特定提交:
git reset --hard commit_sha
要回滚10次提交:
git reset --hard HEAD~10
如果您不想重写历史记录,可以使用以下帖子中的“git revert”
好吧,我想问题是,'回滚'是什么意思?如果你不能reset
,因为它是公开的,你想保持提交历史不变,你的意思是你只是希望你的工作副本反映特定的提交?使用git checkout
和提交哈希。
编辑:正如评论中指出的那样,使用git checkout
而不指定分支将使您处于“无分支”状态。使用git checkout <commit> -b <branchname>
签入分支,或git checkout <commit> .
签入当前分支。
原始海报说明:
有人可以给我的最佳答案是使用
git revert
X次,直到达到所需的提交。所以,假设我想恢复到20次提交的提交,我必须运行20次。
有更简单的方法吗?
我不能使用重置因为这个回购是公开的。
没有必要使用git revert
X次。 git revert
可以接受提交范围作为参数,因此您只需要使用一次来还原一系列提交。例如,如果要还原最近20次提交:
git revert --no-edit HEAD~20..
提交范围HEAD~20..
是HEAD~20..HEAD
的缩写,意思是“从HEAD提交的第20个父级开始,并将其后的所有提交还原为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
实际上会删除在您要还原的任何提交中添加的所有文件,这使得这是恢复一系列修订的正确方法。
第1步:获取提交列表:
git log
您将获得此示例中的列表:
[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <[email protected]>
Date: Fri Jul 8 23:42:22 2016 +0300
This is last commit message
commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <[email protected]>
Date: Fri Jun 24 20:20:24 2016 +0300
This is previous commit message
commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <[email protected]>
Date: Thu Jun 23 00:41:55 2016 +0300
This is previous previous commit message
...
第2步:复制所需的提交哈希并将其粘贴以用于结帐:
git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f
就这样。
git read-tree -um @ $commit_to_revert_to
会做的。它是“git checkout”但没有更新HEAD。
你可以达到同样的效果
git checkout $commit_to_revert_to
git reset --soft @{1}
如果你喜欢将便捷命令串在一起。
这些让你的工作树和索引处于所需的状态,你可以只需git commit
完成。
我不确定发生了什么变化,但如果没有--detach
选项,我无法检查特定的提交。对我有用的完整命令是:git checkout --detach [commit hash]
为了从超脱状态回来,我不得不结账我的当地分公司:git checkout master
假设你在一个项目上工作一天左右。您注意到一个功能仍然会给您错误。但是你不知道你做了什么改变导致了错误。所以你必须捕获以前的工作提交。要还原为特定提交:
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .
好的,这样提交对你有用。没有更多的错误。你确定了这个问题。现在你可以回到最新的提交:
git checkout 792d9294f652d753514dc2033a04d742decb82a5 .
并在导致错误之前检出特定文件(在我的例子中,我使用示例Gemfile.lock):
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock
这是处理您在提交中创建的错误的一种方法,直到以后才意识到错误。
这是一个例子
cd /yourprojects/project-acme
git checkout efc11170c78 .