错误:指定了主线,但提交不是合并;致命:还原失败

Posted

技术标签:

【中文标题】错误:指定了主线,但提交不是合并;致命:还原失败【英文标题】:error: mainline was specified but commit is not a merge; fatal: revert failed 【发布时间】:2021-09-10 04:17:42 【问题描述】:

我想恢复已恢复的拉取请求,即 4 个提交 6283c90f665a5a09ed26805ed1bc

但是当我使用命令git revert -m 1 6283c90时,我遇到了以下错误:

error: mainline was specified but commit 6283c90bd35598635fe1d4f96d3a5a8c6ed91206 is not a merge.
fatal: revert failed

git 日志图如下所示:

* 6283c90 (HEAD -> main, origin/main, origin/HEAD) Revert "Merge pull request #1 from kgarg8/checkpoint-patch"
* f665a5a Revert "Merge pull request #2 from kgarg8/entmax-patch"
* 09ed268 Revert "Merge pull request #3 from kgarg8/decoding"
* 05ed1bc Revert "Merge pull request #4 from kgarg8/decoding"
*   2a8519e Merge pull request #4 from kgarg8/decoding
|\  
| * e170320 (origin/decoding) Fix bugs in decoding
* |   63f0f4c Merge pull request #3 from kgarg8/decoding
|\ \  
| |/  
| * f5ce256 Add temperature, top_k, top_p sampling
* |   168685e Merge pull request #2 from kgarg8/entmax-patch
|\ \  
| |/  
| * 6a44c22 (origin/entmax-patch) Add entmax support
* |   7f61831 Merge pull request #1 from kgarg8/checkpoint-patch
|\ \  
| |/  
| * ea0a7db (origin/checkpoint-patch) Checkpoint load for CPU
|/  
* 4c2d50c Update Seq2Seq_agent.py
... continues

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

人们必须了解git revertgit reset

revert 是当您尝试在顶部添加另一个提交时,其差异与上次提交的完全相反。在您的情况下,相当于所有前 4 次提交的压扁(即--squash)。

当你的 repo 没有配置为合并策略时,这样做会有问题:rebase + ff-only。根据您显示的历史记录,实际问题是您的项目使用的合并策略。

不过,如果你想实现还原,你会做 (more) :

$ git revert --no-commit <SHA-1 (previous)>
$ git revert --no-commit <SHA-1 (previous - 1)>
$ git revert --no-commit <SHA-1 (previous - 2)>
$ git revert --no-commit <SHA-1 (previous - 3)>
$ git commit -m "your message message"
$ git push

reset 是让内容位于 SHA-1(提交 = 指针),就像 4 次提交前一样。大多数时候人们在寻找revert-ing,他们实际上指的是reset。不确定你的情况。好处在于治理。如果您无法更改历史记录,如果您的用户不允许push --forcepush 强制使用),那么您可能需要使用revert 作为您项目的治理模型,希望确保人们不要' t 隐藏错误,或(错误地)从历史中删除某些内容。否则,reset 是默认的返回方式,尤其是在本地分叉上工作时(团队中不允许使用 reset 的常见示例,适用于 DevOps 团队 - 用于配置管理存储库)。

$ git reset --hard <SHA-1 (previous - 3)>
$ git push --force

&lt;SHA-1 (previous - 3)&gt; 对你来说可能是 05ed1bc,所以实际提交 SHA-1。

更新:(注意)当使用reset 时,之前的(转发)提交不会被删除,而是保持孤立状态。它们保留在历史记录中,直到调用 gc(垃圾收集)。它们基本上保留在树中(就像在不同的分支上 - 但没有分支。将其视为树数据结构 - 计算机科学)。如果有人想分析它,您可以检索该提交。

【讨论】:

很好的答案!没有尝试还原选项。 reset 选项非常有趣,因为它删除了 4 次提交 + 没有出现新的提交。 revert 会在历史记录中堆积 8 次提交。但是,我建议进行一些编辑:(1)--hard 而不是 hard,(2)由于我需要还原 4 次提交,因此我应该在此提交之前提供一次提交,而不是提供 05ed1bc,即 @ 987654346@, o/w 它只重置 3 次提交。 修复了--hard 参数。当然,既然您知道它是如何工作的,请随意使用您需要的正确 SHA。我忘记提醒的一件事是提交不会被删除,但它们是孤立的,直到使用垃圾收集。我需要提供它作为更新。谢谢提醒!

以上是关于错误:指定了主线,但提交不是合并;致命:还原失败的主要内容,如果未能解决你的问题,请参考以下文章

Git 因致命错误而失败。拒绝将不相关的历史与 git push 合并?

Git 还原失败

你如何恢复错误的 git 合并提交

失败的 Xcode Git 合并卡住了

git merge仓

如何使用git获取指定tag的代码