【问题标题】:Git: restore my changes which were amended to merge commitGit:恢复我修改为合并提交的更改
【发布时间】:2014-10-28 03:37:34
【问题描述】:

我不小心修改了合并提交而不是创建新提交。现在我不知道如何提取对我可以推送的正常提交的更改。更改将显示在 gitk 中,但不会出现在格式补丁中。请帮忙。

【问题讨论】:

  • 取决于您所做的工作git reset HEAD@{1} 可能会起作用。请先与git reflog 联系。
  • 对我不起作用:(
  • reflog 输出是什么?您应该能够从中获取原始合并提交的 SHA。不过,根据您所做的,它可能处于不同的位置。
  • 我的错,它确实有效!它只是卸载了比下面的方法更多的更改。尽管您的方法更自然,更容易。你想创建一个答案吗?

标签: git-commit git


【解决方案1】:

您在这里有 2 个感兴趣的 SHA - 原始合并提交和修改后的合并提交。您想要做的是 git reset 您的 HEAD 到原始合并提交,同时保留您的索引和工作目录。然后,您可以在合并提交之后创建一个新提交。

使用

git reflog

查找原始合并提交的 SHA

重置为提交 git reset ORIGINAL_MERGE_COMMIT_SHA 或直接来自带有 git reset HEAD@{X} 的 reflog,其中 X 为 1 或 reflog 中表示合并提交的位置。

您现在应该准备好git commit 您的原始更改并且不要在此处传递 --amend 并且您将创建一个新的提交。

【讨论】:

    【解决方案2】:

    我找到了一种可行的方法:

    git diff HEAD~1 > p.patch
    git checkout master
    git checkout -b branch-name
    

    手动编辑 p.patch 以从合并中删除不相关的更改。

    git apply p.patch
    

    但我怀疑有一种更简单/更好的方法来做到这一点。

    【讨论】:

    • 不错!我正在尝试使用git show > a.patch,但随后无法申请,没有 git 的帮助来解释问题所在。
    【解决方案3】:

    这对我有用:

    • 获取原始合并提交和修改后的合并提交的 SHA
    • git reset --hard xxx 其中xxx 是修改后的合并提交SHA
    • git reset --soft yyy 其中yyy 是原始合并提交SHA

    这给我留下了我不小心修改的更改。

    【讨论】:

    • 这是 imo 最好的——你不必在 reflog 中挖掘,你不必重新设置/补丁,只需进行更改并创建新的提交——可能在新的分支上。跨度>
    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 2011-03-15
    • 2022-08-18
    • 1970-01-01
    • 2020-10-04
    • 2016-03-15
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多