Git 推送后恢复丢失的提交

Git 推送后恢复丢失的提交,git,Git,我需要一些帮助来制定恢复策略。不知何故,我们最终陷入了这样的境地:一次提交减少了大约3天的提交。然后被推了。提交人不确定他是不是强迫推还是什么,但现在我们处于这个位置。自“坏”提交以来,又推送了大约10次提交 所有的旧承诺都在那里,我可以把所有的东西拼凑起来,但我希望Git能帮助我。我想我可以选择A点和B点之间的提交范围,但是还有更好的吗?大多数(但不是全部)更改都是一个目录的本地更改,我不希望手动检查每个目录 记住一切都被推到了上游,正确的方法是什么?git revert将在新提交中撤消提交的

我需要一些帮助来制定恢复策略。不知何故,我们最终陷入了这样的境地:一次提交减少了大约3天的提交。然后被推了。提交人不确定他是不是强迫推还是什么,但现在我们处于这个位置。自“坏”提交以来,又推送了大约10次提交

所有的旧承诺都在那里,我可以把所有的东西拼凑起来,但我希望Git能帮助我。我想我可以选择A点和B点之间的提交范围,但是还有更好的吗?大多数(但不是全部)更改都是一个目录的本地更改,我不希望手动检查每个目录


记住一切都被推到了上游,正确的方法是什么?

git revert
将在新提交中撤消提交的更改。

git revert
将在新提交中撤消提交的更改。

git reset--hard
git reset --hard <one commit before the bad commit>
git cherry-pick <the range of commits you've lost>
git pull
git cherry pick
git重置——硬

git cherry pick您可能有兴趣查看上游或本地回购的
git reflog
。即使提交看起来像丢失了一样,它们实际上可能仍然在远程/本地回购中徘徊,只是没有分支指针。但他们不会永远这样,我认为git会:

可选配置变量gc.prueexpire控制未引用的松散对象在被修剪之前必须达到的年龄。默认值为“2周前”

有关使用reflog恢复丢失的工作的更多信息,请访问


如果您在reflog中找到提交(或者您可能还想在git fsck--full中查找它们),您可以附加一个指向它们的分支指针来“恢复”它们。然后,您可能希望
重新设置基址
在顶部选择较新的提交,以便(重新)构建所需的任何提交历史树。

您可能有兴趣检查上游或本地回购的
git reflog
。即使提交看起来像丢失了一样,它们实际上可能仍然在远程/本地回购中徘徊,只是没有分支指针。但他们不会永远这样,我认为git会:

可选配置变量gc.prueexpire控制未引用的松散对象在被修剪之前必须达到的年龄。默认值为“2周前”

有关使用reflog恢复丢失的工作的更多信息,请访问


如果您在reflog中找到提交(或者您可能还想在git fsck--full中查找它们),您可以附加一个指向它们的分支指针来“恢复”它们。然后,您可能希望
rebase
cherry pick
在顶部更新提交,以便(重新)构建您想要的任何提交历史树。

我想我做不到,是吗?我需要在提交中保留好的内容,以及在坏的提交上构建的所有提交。@RobWilkerson:你可以做一个
git还原--no commit
,然后提交你想要的更改。我不认为我能做,是吗?我需要保留该提交中的好内容以及在错误提交上构建的所有提交。@RobWilkerson:您可以执行一个
git revert--no commit
,然后提交所需的更改。第一行不还原在正确提交中所做的更改吗?我不想还原第一个错误的提交吗?或者我读错了吗?还有,让这个“有趣”的是,丢失的部分并不是没有出现在差异中。我猜他以前在什么地方重置过。“还原”只会撤消在差异中显示的更改,对吗?对不起,我是说
git reset--hard
。我可能需要更多的咖啡;)答案是经过编辑的。啊,好的。这就是我一直走的路。我想可能会有更干净的东西。第一行不是会还原好的提交中所做的更改吗?我不想还原第一个错误的提交吗?或者我读错了吗?还有,让这个“有趣”的是,丢失的部分并不是没有出现在差异中。我猜他以前在什么地方重置过。“还原”只会撤消在差异中显示的更改,对吗?对不起,我是说
git reset--hard
。我可能需要更多的咖啡;)答案是经过编辑的。啊,好的。这就是我一直走的路。我想可能会有更干净的东西。