git - 还原远程分支上的提交

标签 git

我在本地分支上工作,添加了许多提交。
然后我将它推送到 remote staging 分支。

现在我必须撤消已推送到 remote staging 的最后一次提交,这是将我的本地分支 merge 到 remote staging

我在查看其他答案时了解到,我必须使用 revert 而不是 reset 来以干净的方式进行,不是吗?

所以我要做的是:

  1. 创建一个名为 cleaning 的新本地分支,将 master 作为父级(在暂存之后)
  2. 将远程 staging pull 入清理
  3. 使用 git revert {在暂存中最后一个好的提交散列}
  4. 现在 cleaning 应该处于良好的提交状态,并且在我的错误推送之前处于 remote staging 的相同状态,不是吗?
  5. 现在我应该将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/

相关文章:

ruby-on-rails - bundler ,Rails3 : how to avoid git check of edge gems in :test group during deploying?

Git:交互式 rebase 列出不正确(太多)的提交

java - 使用 REST API 复制或复制 Bitbucket 中的存储库

git - 使用 reposurgeon 将 svn repo 转换为 git

c# - 在 C# 上使用 SSH 进行 NGit(JGit 端口)身份验证

git - 从 git 克隆后使 Ionic 2 项目工作

java - 子代码 "Out of Memory"和 "GC Overhead Limit Exceeded"

git - 获取 git LFS 文件时出错 : Object does not exist on the server: [404] Object does not exist on the server

由于未跟踪的工作树文件,git 失败

Git sparse checkout 只支持 repo 根目录下的文件夹?