39

我的同事不久前做了一个改变——引入了一个新功能——并且(成功地)致力于 git。但是,现在,该功能已丢失。

使用git log --reverse我已经设法找到该函数仍在代码中的最后一次提交(48d60a03)。下一个 (e6f28bfd) 提交(相关函数消失的地方)是一个合并(14158e1),但是git show其中任何一个都不会显示删除丢失的代码。

换句话说,代码在合并过程中消失了,而没有在被合并的任何一个分支中被删除。

搜索 StackOverflow 几个小时让我得出结论,这一定是冲突解决期间的手动错误(我猜对了吗?)。就这样吧,发生了。问题是 - 我如何取回该代码 - 除了使用丢失的代码进行新提交之外,还有其他方法吗?

相关问题;我能以某种方式找出,是否还有其他像这样再见的例子?我有点担心;)

4

6 回答 6

10

在某个时候提交的更改很难完全丢失。尝试运行 'git reflog' 并查看是否可以发现丢失的提交。然后你可以通过运行“git merge [SHA1 of your lost commit]”将它合并到当前分支中。

于 2013-07-08T13:02:14.423 回答
10

因为你的历史已经被推送了,所以最好的方法是进行新的提交。否则,您将面临丢失其他代码并弄乱每个人的存储库的风险。

由于您知道最后一个提交具有该功能的位置,因此您可以git checkout 48d60a03 -- <name of file with function>. 然后您可以使用该功能提交旧/新文件。

由于文件中可能还有其他更改,您可能希望git reset取消暂存文件并使用git add -p仅添加您正在查找的函数的更改。

为了防止这种情况发生,我的建议是获得一个可以在完成合并后运行的综合测试套件。这可以帮助最大限度地减少由于测试失败而丢失代码的机会。

于 2013-07-08T13:52:56.007 回答
7

如果您知道已丢失的代码的可识别部分,您可以通过使用找到丢失代码的确切合并git log -G regexToSearchFor -m --patch

  • -G <regex>告诉 Git “查找补丁文本包含匹配的添加/删除行的差异<regex>
  • -m告诉 Git 包含合并提交
  • --patch告诉 Git 显示它找到的任何内容的差异
于 2016-08-18T20:47:45.667 回答
5

显然(请参阅此问题),git show这不是用于清楚了解合并提交引入的更改的正确工具。

使用git diff. 合并提交有两个父级:

*   8ac6131 (M) Merge branch 'B'
|\
| * 5a53959 (B) two
|
* 7cb5a06 (A) one

使用git diff A Mandgit diff B M来查看合并提交与其任一父级之间的差异。您应该在那里看到您缺少的功能。

于 2013-07-08T13:45:00.387 回答
5

相关问题;我能以某种方式找出,是否还有其他像这样再见的例子?我有点担心;)

试试git whatchanged。例如,

git whatchanged --since="2 weeks ago" -- gitk

显示过去两周对文件 gitk 的更改。

于 2013-07-08T13:09:26.217 回答
0

我有完全一样的。我有一个新分支,一种产品的第 2 版。然后我想将当前的 master(产品的版本 1)合并到版本 2。在此合并过程中,产品版本 1 上的许多新代码丢失了。这非常令人沮丧,因为有数十个文件丢失了代码,我必须手动检查:(

好的,原来我正在查看两个不同的文件夹(都在主文件夹上)并且忘记将最新的更改拉入其中一个。

于 2019-07-24T14:20:44.903 回答