【问题标题】:Remove pushed commits and rollback to specific commit删除推送的提交并回滚到特定的提交
【发布时间】:2018-03-01 01:52:08
【问题描述】:

我和我的同事在同一个存储库上工作,但我的同事犯了错误,他编辑了我的文件并只是推送了。

问题是我目前也在处理同一个文件,所以如果我拉出提交,它将删除我的所有作品。

文件是二进制的,所以我不能从文本编辑器中编辑。这正是对当前情况的解释:

提交 1. 我做了一些二进制文件,例如:a.bin, b.bin, c.bin 并作为提交[1]推送到master分支

提交 2。我的同事拉动提交 [1] 并推送他的工作 [2]

提交 3。我的同事不小心编辑了我的二进制文件:a.bin、b.bin、c.bin,但他只是将其推送为提交 [3]

提交 4+:我的同事一直在催促..

所以我想要的只是回滚提交,回到旧的特定提交。我搜索了 git rebase 和 git revert,但对我来说似乎完全不起作用。

我听说使用合并也可以,但我希望我的历史保持干净!

我想要的只是将所有内容恢复到旧的提交,但它一直说你那里有某种未合并或未暂存的文件,并且一直失败。我只想覆盖旧文件。

我该如何解决这个问题?

【问题讨论】:

  • 什么是确切的 git 提交树,在 git 内部,默认工作流程,git 提交有多个父项
  • 是否从提交 [1] 中提取二进制文件并将它们提交到最新提交的顶部?
  • 您是在尝试将二进制文件回滚到旧提交还是整个项目(丢失您同事的提交)?

标签: git version-control git-revert


【解决方案1】:

在回滚到旧提交之前,请通过git status 确保您的工作树现在是干净的。

然后就可以通过命令回滚到指定的commit(比如commit 2):

git reset --hard HEAD~2

注意: git reset --hard HEAD~n 会将当前分支重置为 nth 先前的提交作为 HEAD。如果要重置为提交 3,可以使用git reset --hard HEAD~1

所以提交历史看起来像:

Commit 2. My co-worker pull commit [1] and pushed what he worked as [2]
Commit 1. I made some binary files, for example: a.bin, b.bin, c.bin and pushed to master branch as commit [1]

要更新远程仓库的更改,您可以使用git push -f 强制将远程仓库更改为指定的提交。

【讨论】:

    【解决方案2】:

    您可以使用以下命令从提交 [1] 中恢复二进制文件:

    $ git show SHA1:path/to/file >path/to/file
    

    例如,假设二进制文件的“好”版本在提交 7bb43ac 中:

    $ git show 7bb43ac:bin/a.bin >bin/a.bin
    

    对他们三个都做同样的事情,然后提交并推送。

    【讨论】:

      【解决方案3】:

      尝试对旧提交执行git reset。然后你可以做一个git push --force 来更新遥控器。但是,这会导致对您的项目历史记录进行一些修改,并且您的同事可能不得不再次克隆 repo 而不是拉取。此外,如果出现未合并/未暂存的路径,请尝试事先执行 git stash

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-28
        • 2016-07-06
        • 2021-04-20
        • 2019-04-24
        • 2017-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多