我该如何回滚到git中的特定提交?
有人可以给我的最佳答案是使用git revert
X次,直到达到所需的提交。
假设我想恢复为20提交的旧提交,我必须运行20次。
有没有更简单的方法可以做到这一点?
我不能使用reset,因为此存储库是公共的。
我该如何回滚到git中的特定提交?
有人可以给我的最佳答案是使用git revert
X次,直到达到所需的提交。
假设我想恢复为20提交的旧提交,我必须运行20次。
有没有更简单的方法可以做到这一点?
我不能使用reset,因为此存储库是公共的。
Answers:
尝试这个:
git checkout [revision] .
[revision]
提交哈希在哪里(例如:)12345678901234567890123456789012345678ab
。
最后不要忘了.
,非常重要。这会将更改应用于整个树。您应该在git项目根目录中执行此命令。如果您在任何子目录中,那么此命令仅更改当前目录中的文件。然后提交,你应该很好。
您可以通过以下方式撤消该操作
git reset --hard
它将删除工作目录和登台区域中的所有修改。
要回滚到特定提交:
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 checkout
-他可以自由签到他希望的任何分支(当前分支或新分支)。我将更新我的答案,这样就不会造成歧义。
git reset
删除那些您不想这样做的文件。尝试将其放入一个单独的分支中:git checkout <commit> -b <branchname>
,该分支中将没有停滞的文件。
原始海报指出:
有人可以给我的最佳答案是使用
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 revert
使用git版本1.9.0 使用范围进行了测试。如果您使用的是git的旧版本,则使用带有git revert
或不能的范围。
在这种情况下,git revert
优先于git checkout
。
请注意,与使用的答案git checkout
不同,git revert
实际上会删除您要还原的任何提交中添加的所有文件,这使之成为还原一系列修订版本的正确方法。
第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
就这样。
git read-tree -um @ $commit_to_revert_to
会做的。这是“ git checkout”,但不更新HEAD。
您可以达到相同的效果
git checkout $commit_to_revert_to
git reset --soft @{1}
如果您更喜欢将便捷命令串在一起。
这些使您的工作树和索引处于所需状态,您只需git commit
完成操作即可。
如果您希望将X时间回退到带有DETACHED HEAD的某个提交(这意味着您什么都不会弄乱),那么请务必使用以下命令:
(用您希望返回的提交数替换X)
git checkout HEAD~X
IE浏览器回退一次提交:
git checkout HEAD~1
假设您在一天左右的时间内从事一个项目。您会注意到一项功能仍在给您错误。但是您不知道所做的更改导致了错误。因此,您必须钓鱼以前的工作提交。要还原为特定的提交,请执行以下操作:
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .
好的,这样提交就可以为您工作。没有更多的错误。您指出了问题所在。现在您可以返回到最新提交:
git checkout 792d9294f652d753514dc2033a04d742decb82a5 .
并在导致错误之前检出特定文件(在我的情况下,我使用示例Gemfile.lock):
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock
这是处理在提交中创建的错误而又不意识到错误的一种方法。
您可以在GitHub / BitBucket / Gitlab的commits部分中找到与每个提交相关的提交ID。非常简单,假设您的提交ID为5889575,那么如果您想返回到代码的这一部分,则只需键入
git checkout 5889575 .
这将带您到达代码中的那个时间点。