【问题标题】:Undoing a git pull and it's effects on the history.撤消 git pull 及其对历史的影响。
【发布时间】:2013-08-19 10:48:24
【问题描述】:

这是我的悲伤故事

今天我犯了一个错误,从不同的存储库中提取到我的存储库中。我正在处理存储库 A 并将存储库 B 的内容提取到 A 中。我这样做是因为我想要该存储库中的一些文件。

之后,我将存储库推送到远程。

我的问题不是我的代码,因为两个存储库不同。但问题是历史。

现在,公众可以看到的我的远程存储库将存储库 B 的所有提交历史与我的提交混合在日志中。

如何从历史 LOG 中删除这些提交?

有没有办法让我的存储库恢复到昨天的状态?这会导致我历史中来自存储库 B 的提交消失吗?

我尝试重置 Merge、Use Re-base 和 Cherry-pick,但在这两种情况下都没有删除历史记录。

感谢您的宝贵时间

【问题讨论】:

    标签: git logging merge pull revert


    【解决方案1】:

    如果您知道昨天所有分支的位置,您可以检查它们并将每个分支重置为其原始位置。对于每个相关分支:

    git checkout <branch name>
    git reset --hard <old hash>
    git push -f <repository A> <branch name>
    

    然后您可以删除任何您不想要的新分支。对于每个这样的分支:

    git branch -D <branch name>
    git push <repository A> :<branch name>
    

    如果其他人可能同时从存储库 A 中提取,这一切都非常粗略。该解决方案可能部分是社会性的,也可能是技术性的——可能需要告知正在使用存储库的其他人发生了什么,以便他们修复本地克隆。

    【讨论】:

    • 问题是来自 Repo B 的提交比我的提交更早,并且现在与我的提交混在一起出现在我的历史记录中。
    【解决方案2】:

    git reflog 是您想要查看的位置。只要您有一段时间没有进行垃圾收集,您就应该能够执行git reset --hard HEAD@{x},其中 x 是您想要将本地分支中的所有内容重置回的特定历史点。

    一旦你这样做,我会做一个git push --force 把你的公共回购放回你想要的地方......

    这有一个不幸的问题,如果其他人已经从你的遥控器上拉了出来,他们的历史就会被弄乱。

    【讨论】:

    • 没有明确的指令,git 会在 reflogs 中保留 90 天的历史价值,并且不会修剪任何可从那里到达的提交。
    【解决方案3】:

    谢谢大家。我已经解决了我的问题。我设法参考不同的文章和问题来解决它。

    我将在这里解释答案以及我在奋斗中学到的东西。

    首先,为了有选择地从历史中删除那些散布在最佳方式周围的提交,可以在question的答案中找到:

    特别是Charles Bailey的答案。最接近这个答案的是Stuart

    注意:恢复提交不会将其从历史记录中删除,重置会。

    至于我的特殊情况,我认为对于每个我不想要的提交,我都必须遵循以前的方法,但实际上答案更简单。

    在我的情况下,我必须在拉存储库 B 之前将 git 重置为提交,并且必须为所有分支完成。完成此操作后,来自 B 的所有不受欢迎的提交都从我的历史记录中消失了。

    另一件有趣的事情是,在许多提交上使用 git Cherry-Pick 或 Revert 并不像在线文章中听起来那样简单,至少对我而言。

    谢谢大家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 2011-01-13
      • 2019-05-08
      • 2018-10-28
      • 2011-08-14
      • 2020-09-25
      • 2012-05-20
      相关资源
      最近更新 更多