删除推送的提交并回滚到特定的提交

Remove pushed commits and rollback to specific commit

我和我的同事在同一个存储库上工作,我的同事犯了错误,他编辑了我的文件然后就推送了。

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

文件是二进制的,所以我无法从文本编辑器中进行编辑。这就是对当前情况的确切解释:

提交 1. 我制作了一些二进制文件,例如:a.bin、b.bin、c.bin 并作为提交 [1]

推送到主分支

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

工作的内容

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

推送

提交 4+:我的同事一直在推动..

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

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

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

我该如何解决这个问题?

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

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

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

示例,前提是二进制文件的 "good" 版本在提交 7bb43ac 中:

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

对所有三个 3 执行相同的操作,然后提交并推送。

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

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

git reset --hard HEAD~2

注意: git reset --hard HEAD~n 会将当前分支重置为第 n 前一次提交作为 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强制将远程仓库更改为指定的提交。