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

Jes*_*lam 17 git

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

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

我试过了:

git checkout 4a3ba7
git push -f
Run Code Online (Sandbox Code Playgroud)

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

log*_*yth 24

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

git checkout ...
git reset --hard 4a3ba7
git push -f
Run Code Online (Sandbox Code Playgroud)

也就是说,如果您只是push -f要更改最近的提交,那么您应该可以使用--amend.

git checkout ...
// Fix the file
git commit --amend
git push -f
Run Code Online (Sandbox Code Playgroud)

如果在此之后至少有一些您想要的更改,4a3ba7那么您也可以这样做:

git checkout ...
git reset 4a3ba7
git add -p
// Use the interactive prompt to choose the parts you want
git commit
git push -f
Run Code Online (Sandbox Code Playgroud)

更新

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


Mar*_*nde 11

您不需要在本地检查事物以回放远程分支; 你可以使用

git push -f origin 4a3ba7b0:master
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是我认为更好的答案.当您还要重写远程历史记录时,不应该使用本地副本. (4认同)