撤消git pull及其对历史的影响。

时间:2013-08-19 10:48:24

标签: git logging merge pull revert

这是我悲伤的故事

今天我犯了一个错误,就是从另一个存储库中拔出来。我正在使用Repository A,我将Repository B的内容提取到A.我这样做是因为我想要来自该Repository的一些文件。

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

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

现在,我的远程存储库可以被公众看到,它具有存储库B中提交的所有历史记录以及日志中的提交。

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

有没有办法将我的存储库重置为像昨天这样的状态?这会导致我历史记录中存储库B的提交消失吗?

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

感谢您的时间

3 个答案:

答案 0 :(得分: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中撤出,这一点都非常粗略。解决方案可能部分是社交的,也可能是技术性的 - 使用存储库的其他人可能需要被告知发生了什么,以便他们可以修复他们的本地克隆。

答案 1 :(得分:0)

git reflog是你想看的地方。只要您暂时没有收集垃圾,您应该能够git reset --hard HEAD@{x}使用x作为历史记录中要将本地分支中的所有内容重置回的特定点。

一旦你这样做,我会做git push --force将你的公共回购邮件带回你想要的地方......

这有一个令人遗憾的问题,如果其他人已经从您的遥控器上撤下,他们的历史将会搞砸。

答案 2 :(得分:0)

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

我将在这里解释答案以及我通过斗争学到的东西。

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

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

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

至于我的特殊情况,我认为我必须按照前面的方法进行我不想要的每次提交,但实际上答案更简单。

在我的情况下,我必须在我提取存储库B之前将git重置为提交,并且必须为所有分支完成。完成后,B的所有不需要的提交都从我的历史中消失了。

另一个有趣的事情是,在许多提交中使用git Cherry-Pick或Revert并不像在线文章那样直截了当,对我来说最少。

谢谢大家。