【问题标题】:Git Revert command refuses to revert mergeGit Revert 命令拒绝恢复合并
【发布时间】:2018-11-22 07:57:38
【问题描述】:

我有一个应该是简单的案例,但它让我感到迷惑,我在这里的任何其他答案中都没有找到任何实际有效的东西。

我有几个合并到master,我想回滚。我想要的最终结果是将master 设置回这些提交之前的状态,因此我可以从已知良好的分支推送以确保master 仅显示产品发布的代码。

这是日志:

my.username@mysystem MINGW64 /c/Git/REPOSITORY (master)
$ git log --oneline
e6a1eed (HEAD -> master, origin/master, origin/HEAD) Merge pull request #26         
from PROGRAM/revert-24-int_project_2.1.0
b9b82f0 (tag: PROGRAM_project-2.0.0, origin/int_project_2.0.0,     
int_project_2.0.0) Revert "Merge pull request #24 from     
PROGRAM/int_project_2.1.0"
c4a6573 Revert "PROGRAM_project_2.0.0"
c3aa6d1 (tag: PROGRAM_project_2.0.0) Merge pull request #24 from     
PROGRAM/int_project_2.1.0
**b7e583a** (tag: project_tag_2.1.0_01) Merge pull request #23 from     
PROGRAM/dev_project_2.1.0
**54ecb7a** June 2.1.0 release.
**b67f981** Merge pull request #22 from PROGRAM/int_project_2.0.0
f9b81bc (tag: project_tag_2.0.0_04, origin/int_project_2.0.0fix,     
int_project_2.0.0fix) Merge pull request #21 from PROGRAM/dev_project_2.0.0

这是我尝试恢复合并的结果(我已经恢复了一个合并 (#24),但后来发现还有两个需要去(#22 和 #23)。这是当我试图还原:

my.username@mysystem MINGW64 /c/Git/REPOSITORY (master)
$ git revert -m 1 b7e583a
On branch master
Your branch is up to date with 'origin/master'

nothing to commit, working tree clean`

有一次它抱怨我在远程仓库中发生了不在本地的更改,master 分支不应该是这种情况,因为除非在特定情况下,不应将任何内容推送到该分支,所以我'不知道为什么 git 应该关心其他分支发生的事情。我做了一个pull 并且那个投诉消失了,但我担心拉动会通过降低我正在恢复的提交来覆盖我的恢复。

我对 git 和 github 比较陌生,所以我在理解上还有很多空白需要填补,在这种情况下,我可能会遗漏一些通常被认为是已知的基本知识由更有经验的 git 用户编写。

【问题讨论】:

    标签: git github commit git-branch revert


    【解决方案1】:

    在 git 中,您可以通过 2 种方式丢弃不需要的提交:您可以还原它们,也可以通过从分支的历史记录中删除它们来删除它们。

    从历史中删除

    删除提交是最整洁的整理方式,但如果其他用户正在分支上工作并且已经拉取了不需要的提交,他们将在下次推送时重新推送它们。当他们尝试拉动并发现上游历史已更改时,这也会让他们感到困惑。因此,通常不建议在共享/公共分支上执行此操作。

    如果没问题,重置历史记录并丢弃到已知的好点:

    git reset --hard <good commit>
    git push -f origin HEAD
    

    还原

    还原会创建一个新的提交来对抗错误的提交。在与他人共享但留下“混乱历史”的分支上这样做是安全的。

    您所做的看起来是正确的。还原似乎没有做任何事情的事实向我表明,您尝试还原的某些合并提交可能包含在以前的还原中?

    进行还原操作以使您的代码与给定时间点完全匹配的可靠方法是在该时间点结帐,备份文件,返回要修复的分支,复制顶部的文件并提交。它将完全匹配,而 git 只会提交有差异的文件(即它与还原具有相同的效果)。

    git checkout -b temp-branch <good-commit>
    <copy files somewhere>
    git checkout -
    <copy files over workspace>
    git add .
    git commit
    

    确保不要复制 .git 目录。有一些方法可以通过使用更神秘的 git 命令来避免此处的复制,例如git read-tree,但上面的内容很容易理解。

    祝你好运!

    【讨论】:

    • 因此,根据您的还原建议,如果我基于在我想要还原的点完成的发布创建分支,我应该能够将其用于您提到的“良好提交” ?
    • 是的,完全正确。如果你有一个发布标签,你可以把标签名称放在&lt;good-commit&gt; 在这里
    猜你喜欢
    • 1970-01-01
    • 2011-07-21
    • 2019-03-09
    • 2015-09-02
    • 2019-01-12
    • 2017-08-30
    • 1970-01-01
    • 2017-09-02
    • 2017-12-29
    相关资源
    最近更新 更多