Git似乎“失去了”提交

时间:2015-04-30 14:40:41

标签: git

git是否有可能在master上进行提交,并且可能由于开发人员不正确地解决了冲突,实际上“丢失”了提交? (编辑:通过“丢失提交”,我的意思是不仅丢失了更改,而且实际上丢失了提交所发生的所有记录。)

场景:一两个星期前,我们的主分支上有一个错误修正,我们知道它已被推送到我们的实时服务器并运行。今天,bugfix从live中消失了。我记得解决了该文件中最近发生的冲突,但是当我在git repo中查找修复程序时,我在主分支或我怀疑可能触及该文件的任何其他分支上找不到它的痕迹。我检查了文件的git历史记录和git blame但是没有看到最近提交的bug修复程序。这怎么可能?

2 个答案:

答案 0 :(得分:1)

每当发生这种情况时,它一直是合并。

这种确切的情况曾经发生在我身上(我想很多次,虽然除了一次之外我完全无法证明这一点)。

以下是发生的事情:

  1. 有人从主人分支到他们自己的分支,称为feature/foo
  2. 我在主分支中修复。
  3. 他们在feature/foo完成了他们的工作,并将其合并为主人 这样:

    # git status
    On branch feature/foo
    # git checkout master
    # git merge feature/foo --theirs
    
  4. 他们使用了--theirs,因为98%的时间是合适的 - 只要他们做出更改并且与主人发生冲突,就会采用他们分支机构的代码。但是他们在合并回master之前从未将master合并到他们的功能分支中,所以他们的分支没有我的修复。 --theirs确保他们的未修复代码覆盖了我的固定代码,我的变化神奇地消失了。

    通过git annotate查看神奇的未固定线条,我能够发现这一点。我在提交后检查了提交,使用git annotate并查看有问题的行,直到我发现哪个提交是最后一次修复它并且哪个提交没有我的修复了。我发现我的修复程序在这样的合并中消失了。

    在此事件发生之前,我有正常的合并做同样的事情,除了它发生在mercurial而不是git。开发人员没有将master合并到他们的功能分支中,当我在修复后将他们的修复程序合并到master中时,我的修复程序就消失了。

    在这次事件发生之后,我召集了一次会议,这样我就可以让开发人员了解这个问题,让他们知道合并应该小心处理。

答案 1 :(得分:0)

如果你在git历史记录中找不到提交,那么好像有人对遥控器进行了git push --force

当您执行git reset --hard时,可能会发生本地情况。

检查git reflog以查看最近的操作列表。第一列是按时间排序的HEAD的SHA1列表,最新的列表。这可以帮助您找到丢失的提交。