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

时间:2017-09-20 06:21:09

标签: git version-control git-revert

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

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

文件是二进制的,因此我无法从文本编辑器进行编辑。这正是对当前情况的准确解释:

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

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

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

承诺4+:我的同事只是继续推..

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

我听说使用合并也有效,但我希望我的历史保持清洁!

我想要的只是将所有内容都恢复到旧提交,但它一直说你有一些未合并或未上传的文件,并且保持失败。我只想覆盖旧文件。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

在回滚到旧提交之前,请git status确保您的工作树现在已清理。

然后您可以通过以下命令回滚到指定的提交(例如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强制将远程仓库更改为指定的提交。

答案 2 :(得分:0)

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

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

示例,前提是二进制文件的“好”版本在commit 7bb43ac:

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

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