尝试还原已删除的分支时出现“错误:没有这样的提交”?

时间:2018-06-29 09:19:25

标签: git gerrit

我已经在Gerrit中提交了一个文件(将其推送),但是不幸的是,我认为我删除了我提交的本地分支。如何解决?请帮忙。

我尝试过

    git branch --contains 31436fd7200566967f85bfb1ee5425f9b599b908

但它显示

    error: no such commit 31436fd7200566967f85bfb1ee5425f9b599b908

编辑:是的,我已经在本地安装了git,并且在本地工作了该分支。

我已经从Gerrit网站获得了提交ID。

好的,两天前,当我尝试提交更改时出现了一个问题,说A。我尝试使用“ ./logerrit Submit master”提交它,但我得到的只是:

    Counting objects: 32, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (32/32), done.
    Writing objects: 100% (32/32), 100.46 KiB | 0 bytes/s, done.
    Total 32 (delta 22), reused 0 (delta 0)
    remote: Resolving deltas: 100% (22/22)
    remote: Counting objects: 79789, done
    remote: Processing changes: refs: 1, done    
    To ssh://logerrit/core
    ! [remote rejected] HEAD -> refs/for/master (change 
    https://gerrit.libreoffice.org/54112 closed)
    error: failed to push some refs to 'ssh://logerrit/core'

因此,它说两次更改的更改ID是相同的-我正在提交的补丁和几天前我已经提交并现在合并的补丁。我试图做所有在堆栈溢出或任何其他博客中提到的可能的事情-我试图更改id,以便在下一个“ git commit --amend” git自动更改id时,它没有用得到相同的错误,我还试图通过删除行<<<<<<<<<<< =============和>>>>>>>>>>来解决冲突。 >但是我对吗?这是解决它的正确方法吗?然后,我尝试“ git rebase master”,然后收到错误消息:

    First, rewinding head to replay your work on top of it...
    Applying: smartart : test documents
    Using index info to reconstruct a base tree...
    M   sd/qa/unit/import-tests-smartart.cxx
    Falling back to patching base and 3-way merge...
    Auto-merging sd/qa/unit/import-tests-smartart.cxx
    CONFLICT (content): Merge conflict in sd/qa/unit/import-tests- 
    smartart.cxx
    error: Failed to merge in the changes.
    Patch failed at 0001 smartart : test documents
    The copy of the patch that failed is found in: .git/rebase- 
    apply/patch

    When you have resolved this problem, run "git rebase --continue".
    If you prefer to skip this patch, run "git rebase --skip" instead.
    To check out the original branch and stop rebasing, run "git rebase --abort".

我尝试更改分支,然后尝试再次使用主服务器重新进行更改,因为它已经是最新的了,但这没有用。然后,我“创建了”本地删除了多余的分支,并且由于错误,我可能删除了我承诺使用Gerrit的分支之一。

现在我的问题是:

  1. 我可以在本地系统中恢复已删除的分支吗?有可能吗?
  2. 如何解决合并问题或重新设置基准后看到的错误。我强烈怀疑,我可能做错了什么。请提供帮助,如果我没有覆盖任何内容,请告诉我。

第一个问题和第二个问题都与不同的文件/分支有关,但是可能彼此相关。

4 个答案:

答案 0 :(得分:0)

由于您确定该提交存在于远程服务器上,因此应该可以找到它:

git branch -r --contains 31436fd7200566967f85bfb1ee5425f9b599b908

一旦知道了要提交的远程分支,将其称为<branch>,那么您应该可以在本地使用以下方式重新创建该分支:

# delete same-named local branch (if it exists)
git branch -D <branch>
# fetch latest branches from remote
git fetch
# checkout branch from remote
git checkout <branch>

致谢:

答案 1 :(得分:0)

忘记提交31436fd7200566967f85bfb1ee5425f9b599b908。如果您确实合并了Gerrit中的提交,则它位于远程分支上。要创建并从远程分支签出本地分支,请执行:

git checkout -b local-branch remotebranch

例如:

git checkout -b my-feature origin/release1.0

答案 2 :(得分:0)

我不知道这是否可以满足您的需求,但是您应该能够从远程重新签出当前的master分支,然后应用您尝试获取的相同更改。除非您有未提及的其他更改,否则这应该为您提供重放更改并继续进行操作所需的一切。

这些步骤将破坏性地删除您的本地主服务器,并从远程还原它:

# delete local master
git branch -D master
# fetch latest branches from remote
git fetch
# checkout master fresh from remote
git checkout master

然后从gitweb资源中手动复制内容:

https://gerrit.libreoffice.org/gitweb?p=core.git;a=commitdiff;h=31436fd7200566967f85bfb1ee5425f9b599b908

...成为提交中唯一更改的文件sd/qa/unit/import-tests-smartart.cxx

结果是当前主分支已应用您要应用的更改。接下来,我假设您将使用git checkout -b <new-branch>创建一个新分支或留在master中,然后提交更改。最后,您可以根据需要进行推送。

答案 3 :(得分:0)

使用Gerrit时,最终在存储库中的提交可能与您推送的原始提交具有不同的sha1。发生这种情况有几个原因:

  • 用户(在用户界面中,或者通过下载它并推送经过重新调整的补丁集的用户)对更改进行了重新设置,或者上载了新的补丁集
  • 如果项目使用的是Rebase if Necessary提交策略,则更改将基于提交重新进行
  • 该项目正在使用Cherry Pick策略,并为提交的所有更改创建了一个新的提交。

您可以在Gerrit UI中看到实际的提交sha1。确切的位置取决于Gerrit的版本以及使用的UI(GWT或Polymer)。