为什么git log不能按时间顺序显示,而且代码已被删除?

4
我们的git分支出现了一个奇怪的问题,我希望这更多是关于我们理解的问题,而不是实际存在的问题。我将尽力描述我们的工作流程,以确保我们没有错过任何明显的东西:
其中一位团队成员使用“git checkout -b newproject”创建了一个分支,然后进行了一些更改,并使用“git push -u origin newproject”推送了这些更改。然后其他开发人员加入了该项目,使用“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 status显示没有更改,在newproject分支上并向前X个提交,我们使用git push -u origin newproject
今天早上我们注意到大量代码突然消失了。运行git log时,我们注意到它不是按照时间顺序排列的,就像手册所建议的那样。
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时,他们会显示另一个冲突列表。在所有问题都得到解决之前,这种情况发生了几次,才能进行推送。
更新:我们注意到问题比最初想象的要更容易解释。直到包括将其提交推送到提交01b3bfb3c20f74ea437b221711deabc970f670d8,日期为Fri Sep 12 08:45:19 2014 +0100,一切都是正确的。它按时间顺序排列,代码也是正确的。接下来由进行的下3个提交实际上是我刚才提到的提交之前的同样3个提交,并在推送其更改时添加。因此,它们是的提交,但以某种方式被重新添加。还要注意最后一个提交没有被重新添加,这似乎是大部分问题的根源。
为了更好地说明这一点,我提供以下内容:
87e9a4e Add sectionGroup.html to templates_safelincs
bc0903f Add responsive skin to sectionProducts
7833850 Rewrite the way breadcrumbs are generated and output to the page
09d1318 Fix styles for video and featured product boxes, fix miscellaneous bugs and remove obselete code
13f0164 Fix section.html, add featured products, star buy products and product videos
01b3bfb Refine code for breadcrumbs
0303bae Modify getBreadcrumbTrail so that it attempts to take the correct route when recursing
1ae5f00 Rewrite the way breadcrumbs are generated and output to the page
2cc0525 Fix styles for video and featured product boxes, fix miscellaneous bugs and remove obselete code
cc3c86b Fix section.html, add featured products, star buy products and product videos

有人能解释一下我们在这里做错了什么吗?


2
有一些信息缺失(因此无法准确说明发生了什么),但请注意,当您执行 git rebase 时,您会复制提交记录(然后放弃原始提交记录,转而使用新的副本)。如果您只重新定义自己的未推送提交记录,则没有其他人拥有您的旧版本,但是如果您以某种方式重新定义了其他人的(已推送/已发布)提交记录,则也会复制他们的提交记录。这几乎肯定就是发生的事情。为了将两个副本都记录在历史记录中,您可以将您的副本与他们的副本合并(这将显示在 --graph 输出或 gitk 等工具中)。 - torek
这似乎是有效的。我能提供更多信息来帮助你给我一个起点去寻找吗?我有点迷失了。另外,--graph 输出只显示一条线性路径。 - LeonardChallis
1
真的需要知道每个用户都做了什么,或者从服务器上有/看到很多日志。至于日期排序,请注意每个提交上有两个时间戳:作者日期和提交者日期。日志排序默认使用提交日期,而“medium”格式向您显示作者日期(仅限作者日期)。 (使用“--graph”时,日志排序被强制为“--topo-order”。) - torek
你们在进行 pull 操作时遇到冲突就会执行rebase吗?为什么不使用 git mergetool - akgill
@LeonardChallis: 如果你一直在进行变基操作,那么预期--graph会显示一条线性历史记录。『手册』中对rebase有一些很好的阅读内容,应该能够澄清这一点。 - Adam Glauser
3个回答

2
为了完整起见,我在这里发布原因。
简单来说,我们正在重写公共历史记录,这是不好的。现在我们只从主分支到我们的特性分支进行 rebase 操作,并且当它在我们自己的提交应用于头部时保持最新状态,然后再合并到主分支中。实际上,我们还开始压缩提交。即使我们可能在几周前进行了最初的提交。

0
请查看git reflog show命令。它帮助我恢复了本地提交记录。

0

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

  1. Bob推送了三个未显示的提交,称其为a、b、c,它们的父提交是cc3^
  2. Billy在这些提交之上通过pull --rebase拉取了自己的工作,但决定暂时不推送任何内容
  3. 由于某种原因,Bob回头重新做了这三个提交,产生了cc32cc1ae作为新的a、b、c,并继续使用03001b
  4. Bob强制推送了这个新历史记录,这个历史记录与Billy在cc3^处分叉了
  5. Billy现在再次进行了pull --rebase,因此a、b、c和另外两个提交被变基到01b之上,获得了13f09d783作为他对Bob原始a、b、c和自己的bc087e的新变基版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接