我如何从我目前的状态转向在某个承诺上拍摄的截图?
如果我做 git 登录,那么我会得到以下输出:
$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date: Thu Nov 4 18:59:41 2010 -0400
blah blah blah...
commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date: Thu Nov 4 05:13:39 2010 -0400
more blah blah blah...
commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date: Thu Nov 4 00:55:06 2010 -0400
And yet more blah blah...
commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date: Wed Nov 3 23:56:08 2010 -0400
Yep, more blah blah.
我如何转向11月3日的承诺,即承诺0d1d7fc?
注意! 这个命令可能会导致失去承诺历史,如果用户错误地把错误的承诺。
我有一个类似的问题,我想回到以前的承诺,在我的情况下,我不感兴趣保持新的承诺,所以我使用了硬。
这就是我这样做的:
git reset --hard CommitId && git clean -f
这将转向本地存储库,在这里使用 git push -f 后将更新远程存储库。
git push -f
例如,如果你想完全忽略与名称的承诺执行非团体管理政策从下图
此分類上一篇
你会跑
git reset --hard dd52eb9 && git clean -f
跟随的
git push -f
接下来,你不会看到这个承诺(强制非团体管理政策)在那里
此分類上一篇
但是,为了完整性,我也想展示这些其他替代解决方案,也可以用来逆转一个承诺(在这个意义上,你创建一个新的承诺,阻止了以前的承诺的变化,就像Git的逆转一样)。
替代方案1:硬和软重组
这是查尔斯·贝利(Charles Bailey)的解决方案的一个非常轻微修改的版本,以便在Git中通过SHA的Hash转向一个承诺吗?
# Reset the index to the desired commit
git reset --hard <commit>
# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}
# Commit the changes
git commit -m "Revert to <commit>"
这基本上是通过使用软重组将离开指数/重组区域的前承诺的状态,然后你可以承诺。
替代方案2:删除现有树,并用新树取代
git rm -r .
git checkout <commit> .
git commit
类似于替代 #1,这重复了当前工作副本中的 <commit> 状态. 首先需要做 git rm 因为 git checkout 不会删除自 <commit> 以来添加的文件。
这里有很多复杂和危险的答案,但它实际上很容易:
git revert --no-commit 0766c053..HEAD
git commit
这将把一切从头转向承诺哈希,这意味着它将重现承诺状态在工作树上,就好像每一个承诺之后 0766c053 已被推回。
(没有承诺的旗帜允许Git同时转换所有承诺,否则你将被邀请为每个承诺在范围内发出一个消息,将你的历史与不必要的新承诺。
这是一个安全和容易的方式,回到以前的状态. 没有历史被摧毁,所以它可以用于已经公开的命令。
重新定位的变革和承诺
Git 的能力正如你想要的那样创作承诺,这意味着有时你需要在 git 添加中进行的更改中取消更改。
Git 不知道这些变化,因为它们从未被承诺,一旦你运行这个命令,就没有办法恢复这些变化。
最后,您可以使用 --mixed 重新设置工作树,而无需排序任何变更。
回归承诺
你可以使用 -no-commit,或者你可以使用 -n 告诉 Git 进行逆转,但停止承诺改变。
否则,您可能会通过尝试转换尚未存在的代码来混淆 Git。