让我们开始说gerrit项目配置错误,因为它允许发生的事情
我没有推送到refs / for / my_branch,而是直接推送到了我的分支机构,即
git push
不是结束在gerrit机制中,而是结束在我分支的顶部,绕过了所有审核。我尝试通过以下方式解决问题:
git push -f origin <previous_commit_hash>:refs/head/my_branch
我希望它可以将分支恢复到之前的状态,因此我可以再次正确地推送。此操作仅具有用绿色标签heads / my_branch标记先前的提交的作用。
接下来,我在本地尝试了一次硬重置,然后直接推送到gerrit:
git reset --hard <previous_commit_hash>
git push -f origin my_branch
推送被拒绝,因为“更新被拒绝,因为您当前分支的尖端在其远程副本的后面...”
提交只是一个带有帮助标签内容的csv文件,因此它本身不会破坏任何内容,但是我不想有混乱的历史记录或其他意想不到的后果。最好是,我希望将远程分支恢复到其原始状态,然后正确地重新提交我的更改。自从发生这种情况以来,没有人推动或退出此分支。最好的进行方式是什么?
答案 0 :(得分:0)
您可以使用git revert
创建一个新的提交(还原更改),然后git push
来创建它,就像处理意外提交一样。这将使分支HEAD进入与以前相同的功能状态,但具有不同的SHA。之后,应该立即修复允许此类直接推送的存储库配置。
历史记录仍然会显示两次提交,但是恕我直言,这是比重写原始记录的历史记录更好(更安全)的方法(这种记录有被本地存储库未正确提取的风险)。
您可能需要注意不要仅拾取其中一个提交,并且不同的SHA可能会暂时导致一些问题-工具(例如gerrit)可能会抱怨本地存储库不是最新的,因此需要合并才能拾取最新的原始分支更改。
答案 1 :(得分:0)
发生问题是因为执行:
git push -f origin <previous_commit_hash>:refs/head/my_branch
但是正确的方法是执行:
git push -f origin <previous_commit_hash>:refs/heads/my_branch
用“ heads”代替“ head”。
如果使用“ refs / heads / my_branch”,Gerrit知道您想直接推送到分支“ my_branch”。当您使用“ refs / head / my_branch”时,Gerrit知道您想创建一个名为“ head / my_branch”的新分支。
执行正确的命令来解决此问题,并使用Gerrit UI删除“ head / my_branch”。