我在本地分支上工作,添加了许多提交。
然后我将它推送到 remote staging
分支。
现在我必须撤消已推送到 remote staging
的最后一次提交,这是将我的本地分支 merge 到 remote staging
我在查看其他答案时了解到,我必须使用 revert 而不是 reset 来以干净的方式进行,不是吗?
所以我要做的是:
- 创建一个名为
cleaning
的新本地分支,将master
作为父级(在暂存之后) - 将远程
staging
pull 入清理 - 使用
git revert {在暂存中最后一个好的提交散列}
- 现在
cleaning
应该处于良好的提交状态,并且在我的错误推送之前处于remote staging
的相同状态,不是吗? - 现在我应该将
cleaning
推送到remote staging
以恢复远程分支。有哪些旗帜?
我说的对吗?因为 git status
位于第 4 点,这告诉我我是最新的 staging
最佳答案
不要让它变得复杂。
首先你需要做一个 git log
来找出你想要恢复的提交 ID。例如它是提交 abc123
。如果你知道它是最后一个,你可以使用一个特殊的标识符“HEAD”。
然后您首先在本地“暂存”分支中将其还原到本地:
git checkout staging
git revert abc123
注意:对于日志中的最后一次提交,您将编写 git revert HEAD
。
然后你更新你的远程“staging”:
git push
说明:在 git 中,如果您有一个远程仓库,那么您正在处理 2 个不同的存储库(本地和远程)。在执行 git checkout staging
之后,您实际上创建了一个独特的本地名称来代表远程分支。 git revert
实际上不会删除你的提交,但它会在顶部创建一个新提交,撤消所有更改(如果你添加了一个文件 - 如果你删除了一行,新提交将删除它- 新的提交会将其添加回来等),即它是对日志的补充,这就是推送将是干净的原因。
如果你真的想让它消失,以至于没有人可以责怪你,你可以自己承担风险:
git checkout staging
git reset --hard HEAD^
git push -f
(重置行重新定位本地“暂存”分支,使其指向恰好在您的最高提交之前的提交)
一般来说,强制推送是一种不好的做法,但是保持无用的提交和恢复也不是很好,所以另一种解决方案是实际创建一个新分支“staging2”并在该分支中进行测试:
git checkout staging
git checkout -b staging2
git reset --hard HEAD^
git push
关于git - 还原远程分支上的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50473587/