Git 还原命令拒绝还原合并

Git Revert command refuses to revert merge

我的案例应该是一个简单的案例,但它让我感到困惑,而且我在此处的任何其他答案中都没有发现任何实际有效的内容。

我有几个要回滚到 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 中,您可以通过两种方式丢弃不需要的提交:您可以还原它们,也可以通过从分支历史记录中删除它们来删除它们。

从历史记录中删除

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

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

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

还原

还原创建一个新的提交来抵消错误的提交。在与他人共享但留下 "messy history".

的分支上这样做是安全的

你所做的看起来是正确的。还原似乎没有做任何事情这一事实向我暗示,也许您尝试还原的某些合并提交可能包含在之前的还原中?

进行还原操作以使代码与给定时间点完全匹配的一种可靠方法是在该时间点签出,备份文件,返回到要修复的分支,将文件复制到顶部并提交。它将完全匹配并且 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 但上面的内容很容易理解。

祝你好运!