回滚到公共回购协议中的旧Git提交
我怎么能回滚到git的具体提交?
有人可以给我的最好的答案是使用git revert
X次,直到我达到所需的提交。
所以我们假设我想恢复到20提交的提交,我必须运行20次。
有没有更简单的方法来做到这一点?
我不能使用重置,因为这个存储库是公共的。
尝试这个:
git checkout [revision] .
其中[revision]
是提交散列(例如: 12345678901234567890123456789012345678ab
)。
别忘了.
最后,非常重要。 这将适用于整个树的变化。 然后承诺,你应该是好的。
你可以通过撤销这个
git reset --hard;
这将删除工作目录和暂存区域中的所有修改。
要回滚到特定的提交:
git reset --hard commit_sha
要回滚10个提交:
git reset --hard HEAD~10
如果您不想重写历史logging,可以使用下面的post中的“git revert”
如何将Git存储库恢复到以前的提交?
那么,我想问题是,“回滚”是什么意思? 如果你不能reset
因为它是公开的,你想保持提交历史不变,你的意思是你只是想让你的工作副本反映一个具体的提交? 使用git checkout
和提交哈希。
编辑:正如在注释中指出的,使用git checkout
而不指定分支将使您处于“no分支”状态。 使用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
HEAD~20..
是HEAD~20..HEAD
,意思是“从HEAD提交的第 20 个父节点开始,并在所有提交到HEAD之后恢复所有提交”。
假设这些提交都不是合并提交 ,那将恢复最后的20个提交。 如果有合并提交,那么你不能在一个命令中恢复它们,你需要单独恢复它们
git revert -m 1 <merge-commit>
还要注意,我已经使用git版本1.9.0testing了使用git revert
的范围。 如果你使用的是旧版本的git,使用git revert
范围可能会也可能不会。
git revert
比git checkout
更好
请注意,与使用git checkout
这个答案不同的是 , git revert
实际上会删除任何你正在恢复的提交中添加的文件 ,这使得这是恢复一系列修订的正确方法。
文档
- git-revert(1)手册页 。
- 提交范围 。
第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 $commit_to_revert_to git reset --soft @{1}
如果你喜欢一起串起方便的命令。
这些给你的工作树和索引在所需的状态,你可以只是git commit
完成。
我不确定发生了什么变化,但是如果没有选项--detach
,我无法检出特定的提交。 这个完整的命令是: git checkout --detach [commit hash]
为了从分离的状态恢复,我必须检查我的本地分支: git checkout master