从分支 B 合并时,在分支 A 上恢复的提交不存在

Posted

技术标签:

【中文标题】从分支 B 合并时,在分支 A 上恢复的提交不存在【英文标题】:commit reverted on branch A not present when merged from branch B 【发布时间】:2022-01-23 21:54:16 【问题描述】:

我不小心提交到分支dev,而不是feature-branch,并推送到远程。根据git undo commit on protected branch?的建议,我采取了以下步骤来撤消dev上的提交并将其提交给feature-branch

dev 上,在本地撤消提交并将其隐藏,以便稍后将其提交给feature-branch

    git reset --soft HEAD~1 git restore --staged . git stash git pull git revert SHA-1 git commit -m "reverting commit made to wrong branch" git push

feature-branch:

    git stash pop git add ., git commit -m "making commit in the right place"

太好了。此时,dev 回到了我错误地在那里提交之前的位置,feature-branch 有了新的更改。然后我做了更多的工作并向feature-branch添加了更多的提交。

在创建从feature-branchdev 的拉取请求并将其合并后,dev 上似乎不存在已恢复的提交。

这里发生了什么?

现在我将只创建一个新分支并手动重写提交,但我不明白为什么这一系列事件导致我在我的 IDE(vscode 和 gitlens)中看到差异,但 github 告诉我没有区别吗?

【问题讨论】:

您在feature-branch 中进行了哪些提交?它是在您还原的原始提交之前、原始提交和还原之间还是在还原提交之后对dev 的提交? 这是一个很好的问题......老实说,在这一点上我不能确定我到底是用哪种方式做到的。每个场景将如何发展? 请注意,您可以查看git log --graph 来回答来自@bk2204 的问题。你会确切地看到你从哪个提交分支出来。 如果您在合并后显示devgit log --graph 可能会有所帮助,然后解释您所说的“已恢复的提交不存在于开发人员”的意思。 有点与问题无关,但我认为git stash apply 可能只是git stash?因为“应用”会将现有的存储区放入您的工作目录,听起来您做了相反的事情,这只是从工作目录中的文件创建一个新的存储区。 【参考方案1】:

tl;dr:您似乎为同一个问题尝试了两种不同的解决方案,但最终没有按照您的想法去做。

如果您不小心向dev 提交了一些问题,并且想要修复它,您有两种(类别)方法来处理它:

    您可以reset 回到上一个提交,实质上是删除最近的提交。 你可以revert提交。

目前尚不清楚您是否推出了带有错误提交的dev,但根据描述,我怀疑您可能没有推出。在那种情况下,reset 将是最好的选择。如果您已经推送了错误的提交并且其他人可能已经在使用它,那么revert 会是最好的。显然你试图做这两个;看起来您先进行了重置,然后进行了还原。

第一次重置“删除”了提交,然后尝试恢复不存在的内容是行不通的,所以你会留在你开始的地方。 (您还记得在尝试时看到过任何关于此效果的消息吗?)

注意,如果您之前推出了 dev 并决定恢复是要走的路,在重置提交后,如果不强制推送,您将无法执行 git push

旁注,要将提交移至feature-branch,您可以简单地通过dev 上的哈希ID 提交cherry-pick,而不是尝试完成额外的存储工作,我怀疑是导致您走上这条道路的原因。

提示:我强烈建议使用git loggit log --graph经常。考虑使用显示分支历史的 UI,并在每次提交后刷新它,这样您就可以准确地看到自己在做什么,并且错误会变得很明显。

【讨论】:

“我怀疑你可能没有 [push our dev]” - 不幸的是我确实推送到了遥控器。我编辑了这个问题以反映这一点。另外,我调整了我采取的步骤。我忘了提到,在我进行了重置、恢复和存储之后,我做了一个git pull。这是一种隐藏我需要的提交的愚蠢方式,因此我可以将它带到feature-branch,同时保持远程和本地之间的dev 一致。是的,git log --graph 在这种情况下会是一个非常好的主意¯\_(⊙_ʖ⊙)_/¯,希望这些新细节能让问题更清晰 @SethLutske 好的编辑,您在重置后拉动的事实更有意义。现在我有更多的说明,我将在问题级别提出。

以上是关于从分支 B 合并时,在分支 A 上恢复的提交不存在的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab 无法将恢复的分支与另一个分支合并

恢复合并时如何找出分支号?

当分支 A 在 GIT 中合并到分支 B 时,将提交从本地分支 A 推送到分支 B

将更改从分支 A 应用到 B,而不合并或添加提交

使两个分支相同

如何恢复从一个分支合并的所有提交