【问题标题】:Reverting accidentally commited changes on mainline, back to what is in the main repository on git将主线上意外提交的更改恢复到 git 主存储库中的内容
【发布时间】:2015-11-20 16:25:45
【问题描述】:

我正在做一个项目,并且不熟悉 git 架构。我不小心对主线进行了一些更改,现在我想将它们恢复到主存储库中的内容。

现在我在一个新的分支上,但那些提交仍然存在于主线分支中。我该怎么做?

HEAD到底是什么,我很困惑。

我需要恢复 3 个提交。所以对于其中一个,我做了“git revert”。现在,当我执行“git revert HEAD~3”时,它表明我需要合并更改并全部提交。但我不想要这些更改,这就是我恢复的原因。

我可能听起来很愚蠢和令人困惑,但我对此很陌生,并且不想放弃任何更改,因为它是一个非常关键的项目,也不想弄乱主线分支。

【问题讨论】:

  • 就实际提交历史而言,我们在这里看到了什么?您能否向我们展示一张图片(当然,敏感位被忽略了),或者您可以使用git log --graph --oneline --annotate --all 以便我们更清楚地了解您需要删除的提交吗?现在,它们出现在新分支上的原因是当您决定分支时它们位于主线分支的顶端,但这是可以修复的。让我们首先努力让您处于我们可以解决此问题的状态。

标签: git-commit git-reset git-revert git


【解决方案1】:

我假设你的 git 拓扑看起来像这样:

---A---B---C---D master
                 newbranch

你会想像这样git reset你的主分支:

git checkout master
git reset --hard HEAD~3

您的拓扑现在应该如下所示:

---A---B---C---D newbranch
    \
     master

要回答您关于HEAD 的问题,它指的是您当前所在分支的尖端。如果你在master,那么HEAD就是A;如果你在newbranch,那么它是D

查看以下问题:

【讨论】:

  • 非常感谢!还有一件事,我做了“git revert ”,所以它又创建了一个还原更改的提交,并且我有一些未暂存的文件。所以我需要做 git reset --hard HEAD~4 对吗?
  • 这取决于您是在 master 还是 newbranch 上进行还原,或者两者都进行。 git revert 只是通过在新提交中应用它的反向来恢复单个提交。所以很可能你在D之后有一个提交E,这与A相反。您可以恢复到特定的提交 ID,因此您可以执行git checkout master; git reset --hard A; git checkout newbranch; git reset --hard D,事情将如上所示。另外,请查看tig 以帮助您可视化您的 git 拓扑。
  • 非常感谢!它解释了很多。主线分支也是共享的,就像我们的团队从主线拉/推代码一样,所以“硬”重置它,对其他人来说会是个问题吗?他们需要重新同步吗??
  • 如果您已经将错误提交推送到远程服务器上的 master,那么您正在寻找更多问题。执行push --force 被认为是一种不好的做法,这是您需要在此处执行的操作,但是如果您可以接受每个人都需要删除他们的本地主分支并在您推送它并且他们完成后签出新的主分支git fetch,应该没问题。
  • 不不,我没有推送错误的提交。那么“主线”分支上的这些错误提交是否是我系统本地的,即团队中的其他成员看不到它?
猜你喜欢
  • 2016-10-14
  • 2011-11-01
  • 2017-05-28
  • 2011-09-03
  • 2011-05-06
相关资源
最近更新 更多