Git Revert命令拒绝恢复合并

4
我有一个看似简单的问题,但它令我困惑,我在这里找不到任何真正有效的答案。 我要回滚到一些合并到主分支(master)的提交。 我想要的最终结果是将主分支(master)设置回这些提交之前的状态,以便我可以从一个已知的好分支推送,以确保主分支(master)仅显示prod-released代码。以下是日志:
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用户通常认为已知的知识点。
1个回答

1
在Git中,您可以以两种方式丢弃不需要的提交:您可以撤销它们,也可以通过从分支历史记录中删除它们来删除它们。

从历史记录中删除

删除提交是整理最干净的方法,但如果其他用户正在该分支上工作并已经拉取了不需要的提交,则他们将在下次推送时重新推送它们。当他们尝试拉取并发现上游历史记录已更改时,这也可能会让他们感到困惑。因此,通常不建议在共享/公共分支上执行此操作。
如果可以,请重置历史记录并丢弃到已知的良好点:
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,可以避免在此处进行复制,但上述方法易于理解。

祝你好运!


那么,根据您的还原建议,如果我基于我想还原到的发布时点创建一个分支,我应该能够将其用作您提到的“好提交”吗? - MarkTO
是的,没错。如果您已经打了一个发布标签,您可以在这里把标签名称放在 <good-commit> 的位置。 - tul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接