为什么git log没有按时间顺序显示,代码已被删除?

时间:2014-09-12 10:40:36

标签: git git-branch

我们的git分支有一个奇怪的问题,我希望更多的是关于我们的理解,而不是问题。我将尽我所能来描述我们的工作流程,以确保我们不会错过任何明显的东西:

其中一个团队使用git checkout -b newproject创建了一个分支,然后进行了一些更改,然后使用git push -u origin new project推送了这些更改。然后其他开发人员使用git fetch origin然后git checkout newproject加入项目。

接下来,工作流程如下。开发人员定期更改git add新文件和修改后的文件以及git commit。然后,当他们希望其他人看到他们的更改时,他们会执行git pull origin newproject以获得自上次拉取后的任何更改,然后是git push -u origin newproject

注意:/etc/gitconfig我们有以下内容:

[branch]
autosetuprebase = always

我们在pull时经常会遇到冲突,因为我们正在处理相同的文件。当我们这样做时,我们得到手动解决冲突的指令然后运行git rebase --continue我们打开文件,选择我们想要保留的代码并进行必要的更改并保存。然后,我们git add filename.ext解决问题后,再运行git rebase --continue。完成此操作后,git statusnewproject分支上显示没有更改,并且在X提交之前,我们使用git push -u origin newproject

今天早上我们注意到大量的代码突然丢失了。运行git log时,我们注意到的第一件事是它没有按时间顺序排列as the manual suggests

commit bc0903fc5795425908f335cebcab11055869d75d
Author: billy <billy@our.biz>
Date:   Thu Sep 11 15:29:37 2014 +0100

    Add responsive skin to sectionProducts

commit 7833850313c2974c3b8cbc75383b1834fbf4bf93
Author: bob <bob@our.biz>
Date:   Thu Sep 11 14:44:37 2014 +0100

    Rewrite the way breadcrumbs are generated and output to the page

commit 09d1318d9e7249e9e45826d7ddc33f23fc5974b1
Author: bob <bob@our.biz>
Date:   Thu Sep 11 11:25:21 2014 +0100

    Fix styles for video and featured product boxes, fix miscellaneous bugs and remove obselete code

commit 13f01644935092b490be55b6738f500f0f5fcb2e
Author: bob <bob@our.biz>
Date:   Thu Sep 11 08:31:03 2014 +0100

    Fix section.html, add featured products, star buy products and product videos

commit 01b3bfb3c20f74ea437b221711deabc970f670d8
Author: bob <bob@our.biz>
Date:   Fri Sep 12 08:45:19 2014 +0100

    Refine code for breadcrumbs

commit 0303bae79f7ff2e84221e0db3f88d3630d4afa91
Author: bob <bob@our.biz>
Date:   Thu Sep 11 15:53:06 2014 +0100

    Modify getBreadcrumbTrail so that it attempts to take the correct route when recursing

commit 1ae5f00814bf216eda5449a6e8d89123b124fad8
Author: bob <bob@our.biz>
Date:   Thu Sep 11 14:44:37 2014 +0100

    Rewrite the way breadcrumbs are generated and output to the page

一些提交也会重复出现。另一点值得注意的是,其中一位开发人员提到当他们看到一些冲突并解决它们,然后运行git rebase --continue时,他们会看到另一个冲突列表。在他们全部解决之前,这种情况发生了几次,然后才能推动。

更新:我们注意到这些问题最初可以解释得更容易解释。直到 bob 推送他的提交,直到提交日期01b3bfb3c20f74ea437b221711deabc970f670d8的{​​{1}},一切都正确。它是按时间顺序排列的,代码是正确的。接下来的3次提交 bob 实际上是在我刚刚提到的提交之前提交的3次提交,并在 billy 推送他的更改时添加。所以,他们是 bob 的提交,但不知何故由 billy 重新添加。还要注意最终提交没有重新添加,这是大部分问题似乎源于此的地方。

对于插画家来说,这更好一点,我提出以下内容:

Fri Sep 12 08:45:19 2014 +0100

有谁能解释我们在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

为了完整起见,我将在此处发布原因。

简单地说,我们正在重写公共历史which is bad。我们现在做的 只是从master到我们的功能分支的rebase,当它与我们自己的提交应用于头部时,我们然后合并到master。实际上,我们也开始压制这些提交。即使我们可能在几周前做出初步提交。

答案 1 :(得分:0)

我认为这个序列会产生你所看到的图形:

  1. bob推送三个未显示的提交,称其为a,b,c,其父级为cc3^
  2. billy pull --rebase他的工作在他们之上,但决定不推动任何东西
  3. bob由于某种原因返回并重做这三个提交,生成cc32cc1ae作为新的a,b,c,并继续03001b
  4. bob force-推动这一新的历史,它与cc3^
  5. 的比利不同
  6. billy现在再次pull --rebase。所以a,b,c和另外两个提交被重新定位到01b,获得13f09d783作为他最新版本的Bob的原始版本a,b, c和他自己的bc087e

答案 2 :(得分:0)

请参阅git reflog show命令。它帮助我恢复了本地提交。