Git的;合并后代码消失了

时间:2013-07-08 12:58:13

标签: git

我的同事一段时间做了改变 - 介绍了一个新功能 - 并且(成功)致力于git。但是现在,这个功能已经丢失了。

使用git log --reverse我设法找到该函数仍在代码中的最后一次提交(48d60a03)。下一个(e6f28bfd)提交(有问题的函数消失了)是一个合并(14158e1),但git show'任何这些都没有显示删除丢失的代码。

换句话说,代码在合并期间已消失,而未被合并的任何分支中删除。

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

相关问题;我可以以某种方式找出,如果还有其他事情像这样再见吗?我有点担心;)

6 个答案:

答案 0 :(得分:8)

在某些时候发生的变化很难完全丧失。尝试运行'git reflog',看看你是否能发现丢失的提交。然后,您可以通过运行“git merge [丢失提交的SHA1]”将其合并到当前分支中。

答案 1 :(得分:8)

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

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

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

为了防止这种情况发生,我的建议是获得一个完整的测试套件,您可以在完成合并后运行。这有助于最大限度地减少代码丢失的可能性,因为测试将失败。

答案 2 :(得分:5)

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

使用git diff。合并提交有两个父母:

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

使用git diff A Mgit diff B M查看合并提交与其父级之间的差异。你应该在那里看到你失踪的功能。

答案 3 :(得分:5)

如果您知道代码的可识别部分已丢失,您可以使用git log -G regexToSearchFor -m --patch

找到丢失代码的确切合并
  • -G <regex>告诉Git&#34;查找差异,其补丁文字包含与<regex>匹配的添加/删除行&#34;
  • -m告诉Git包含合并提交
  • --patch告诉Git显示其发现的差异

答案 4 :(得分:4)

  

相关问题;如果还有其他情况,我可以以某种方式找出答案吗?   像这样再见的东西?我有点担心;)

试试git whatchanged。 例如,

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

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

答案 5 :(得分:0)

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

好吧,原来我正在看两个不同的文件夹(都在主文件夹上),却忘了将最新的更改放入其中一个。