如何在git仓库中检索丢失的更改?

时间:2012-02-07 19:01:22

标签: git merge conflict

我在一个小型工作室工作,这是一个使用Git的新手,所以我们这里没有Git大师。最近,一位开发人员在推动一项小改动的过程中成功地从代码库中完全删除了一堆其他更改。

看起来当他合并时,他合并了一些旧版本,一个缺少添加文件,并且有旧版本的文件。因此,当他将提交推送到服务器时,最终结果是已删除的文件,以及其内容现在缺少许多更改的文件。

现在,如果您克隆新的软件仓库,则主分支中的所有代码都会丢失下图中的所有圆圈更改。这些更改的提交仍在日志中,只有它们所代表的更改不在代码中。

基本上,问题可以在这张图片中看到:

The problems

3 个答案:

答案 0 :(得分:2)

最简单的方法是git revert合并提交,并让开发人员重做合并,这次正确。

git revert <sha>将记录一个新的提交,撤消<sha>的影响,这应该是你的错误合并提交。

由于此更改已经被推送到中央存储库,因此您不应该使用任何git的重写历史魔术。

答案 1 :(得分:2)

几天前,我遇到了同样的情况。

可能的原因

我发现这种合并的可能原因可能是使用

的人
git merge -s ours <somebranch>

甚至不知道。

有些开发人员不使用他们的IDE使用控制台和pull / commit / push。当一些事情变得糟糕时,一些IDE会提供诸如“强制”,“决心开采”等选项......除非确切知道它的作用,否则不应总是点击这些选项。

不好的是,在这样的合并提交之后推送git会告诉你合并分支的所有提交都在那里,但是你不会发现任何这些变化......悲伤的故事。

解决方案

当一切正常时,我们决定让重置主人回到最新点。

git checkout master
git reset --hard
git reset --hard <OKAY_POINT>

在您的情况下,<OKAY_POINT>3221961

然后我们不得不强行将其推向上游。

git push --force

结果origin/master被重置为发生错误合并之前的状态。

一般来说,这不是一个好主意。但是由于所有的团队都是本地人,所以我们都去了它,大多数人都知道发生了什么事情,并且没有人在那个破碎的主人身上犯下任何东西,此时强制重置重置正在发生。

之后,破坏大师的开发人员必须重做他的合并,这次是正确的方式。

我没有重置远程的唯一其他选项是手动重新合并提交可能已“擦除”的所有内容。这对我来说似乎不太简单。

答案 2 :(得分:0)

我不确定你在问什么,但你几乎总是可以使用git reflog来取回那些意外删除的内容