作为一名初级git用户,我被一次艰难的合并所淹没,一定做错了。我最终在我的源文件中提交了一堆乱七八糟的垃圾解决方案。提交显示了许多行的添加,这些行看起来像<<<<<<< HEAD
和>>>>>>> a7b4de79431c2e73d28621c72c8d14820df1a24b
。提交已经被推送到远程源,所以我不幸只能修改提交。
我想将远程存储库回滚到最后一次良好的提交,4a3ba7b0e56cf0be80274c1f879029220a889bde
并且(如果可能的话)销毁错误的提交d004651972cbc35f70ee5a2145b6e03169c77279
。
我试过了:
git checkout 4a3ba7
git push -f
并得到:fatal: You are not currently on a branch.
答案 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*
但要注意:这可能会导致修改数据丢失! (你已被警告:))