21

作为一名初级 git 用户,我对艰难的合并感到不知所措,一定是做错了什么。我最终用源文件中的一大堆垃圾来解决冲突。提交显示了许多看起来像<<<<<<< HEAD和的行的添加>>>>>>> a7b4de79431c2e73d28621c72c8d14820df1a24b。提交已经被推送到远程源,所以很遗憾我不能只修改提交。

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

我试过了:

git checkout 4a3ba7
git push -f

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

4

3 回答 3

28

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

于 2013-02-18T00:34:43.780 回答
13

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

git push -f origin 4a3ba7b0:master

当然,在做任何事情之前仔细检查你的日志,因为这个推送覆盖远程数据。

如果收到权限错误,receive.denyNonFastForwards可能true在远程存储库中设置为;在任何情况下,您都必须更改它才能使倒带正常工作。

于 2013-02-18T00:51:42.303 回答
3

你可以做一个

git reset --hard *commithash* 

但请注意:这可能会导致修改后的数据丢失!(你被警告了 :))

于 2013-02-18T00:35:39.757 回答