题
我怎么去回滚到一个具体的承诺在git?
最好的答案,有人可能会给我利用 git revert
X次直到我到达所期望的承诺。
因此,让我们说,我想恢复到的提交的20犯老,我不得不跑这20倍。
是有一个更简单的方式做到这一点?
我不能使用复,因为这个仓库是公开的。
解决方案
尝试这种情况:
git checkout [revision] .
其中[revision]
是提交散列(例如:12345678901234567890123456789012345678ab
)。
在最后不要忘了.
,非常重要。这将更改应用到整个树。你应该在Git项目的根执行此命令。如果您有任何子目录,则该命令只改变当前目录下的文件。然后提交,你应该是不错的。
可以通过
撤消此git reset --hard
这会从工作目录和分级区域删除的所有修改。
其他提示
要回滚到一个特定的提交:
git reset --hard commit_sha
要回滚10提交回:
git reset --hard HEAD~10
您可以在以下后使用“混帐复归”,如果你不希望改写历史
好了,我想这个问题是,你是什么意思的“回滚”?如果你不能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
, 和手段"开始从20th 父的头承诺,并恢复所有提交后到头"。
那将恢复,去20提交, 假设这些都不是合并 提交。 如果还有合并提交,那么你就不能恢复他们都在同一个命令,则需要恢复他们单独
git revert -m 1 <merge-commit>
还注意到,我已经测试的使用范围 git revert
令版1.9.0. 如果你使用旧版本内,使用范围 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中结帐”,但不更新HEAD
可以实现具有同样的效果
git checkout $commit_to_revert_to
git reset --soft @{1}
如果你喜欢穿线方便命令一起。
这让你与你的worktree和索引在期望的状态,你可以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
这是处理您提交的创建错误而不自知的错误,直到后来的一种方式。
想HEAD分离模式?
如果您希望回滚X时间到一定与一个分离的头提交(这意味着你可以不会弄乱任何东西),然后通过各种手段,使用下列:
(有多少承诺要回去更换X)
git checkout HEAD~X
即。回去一个承诺:
git checkout HEAD~1
下面是一个例子,做
cd /yourprojects/project-acme
git checkout efc11170c78 .
您可以找到相关的各提交ID在GitHub上/到位桶/ Gitlab的提交部分提交。 它非常简单,假设你提交ID是 5889575 ,然后如果你想回到这个部分在你的代码,那么你只需要输入
git checkout 5889575 .
这将带你到你的代码的时间点。