Git Revert命令拒绝恢复合并

时间:2018-06-12 20:22:33

标签: git github commit git-branch revert

我应该是一个简单的案例,但这让我很神秘,而且我在这里找不到其他任何实际有用的答案。

我想要回滚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 个答案:

答案 0 :(得分:1)

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

从历史记录中删除

删除提交是整理的最佳方式,但是如果其他用户正在分支上工作并且已经撤消了不需要的提交,那么他们会在下次推送时对其进行抢占。当他们尝试拉动并发现上游历史发生变化时,它们也会让他们感到困惑。因此,通常不建议在共享/公共分支上执行此操作。

如果可以,重置历史记录并丢弃到已知的好处:

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

还原

还原创建一个新的提交,用于对付错误的提交。这在与其他人共享的分支上是安全的,但留下了“混乱的历史”。

你所做的看起来是正确的。 revert似乎没有做任何事情的事实告诉我,你试图恢复的某些合并提交可能包含在之前的恢复中?

执行revert-ish操作以确保代码与给定时间点完全匹配的确定方法是在此时检出,备份文件,返回要修复的分支,复制顶部的文件并提交。它将完全匹配,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,但上面的内容很容易理解。

祝你好运!