将远程快退回到先前的提交

时间:2013-02-18 00:32:53

标签: git

作为一名初级git用户,我被一次艰难的合并所淹没,一定做错了。我最终在我的源文件中提交了一堆乱七八糟的垃圾解决方案。提交显示了许多行的添加,这些行看起来像<<<<<<< HEAD>>>>>>> a7b4de79431c2e73d28621c72c8d14820df1a24b。提交已经被推送到远程源,所以我不幸只能修改提交。

我想将远程存储库回滚到最后一次良好的提交,4a3ba7b0e56cf0be80274c1f879029220a889bde并且(如果可能的话)销毁错误的提交d004651972cbc35f70ee5a2145b6e03169c77279

我试过了:

git checkout 4a3ba7
git push -f

并得到:fatal: You are not currently on a branch.

3 个答案:

答案 0 :(得分:23)

checkout将您当前的工作目录移动到先前的提交,但它不会修改分支内容。您需要将分支重置为旧提交,然后将其推送。

git checkout ...
git reset --hard 4a3ba7
git push -f

说,如果您已经push -f只更改了最近的提交,那么您应该可以使用--amend

git checkout ...
// Fix the file
git commit --amend
git push -f

如果您希望在4a3ba7之后提交至少一些更改,那么您也可以执行此操作:

git checkout ...
git reset 4a3ba7
git add -p
// Use the interactive prompt to choose the parts you want
git commit
git push -f

更新

您的错误remote: error: denying non-fast-forward refs/heads/master是因为您使用的git服务器Assembla默认情况下不允许重写历史记录。请参阅此答案以修复该部分:Undo git push to Assembla

答案 1 :(得分:11)

您无需在本地结帐以回放远程分支;你可以使用

git push -f origin 4a3ba7b0:master

当然,在执行任何操作之前请仔细检查您的日志,因为此覆盖远程数据。

如果您收到权限错误,则receive.denyNonFastForwards可能会在远程存储库中设置为true;你必须改变它以便在任何情况下都能倒带。

答案 2 :(得分:3)

你可以做一个

git reset --hard *commithash* 

但要注意:这可能会导致修改数据丢失! (你已被警告:))