git log在不同分支之间是如何工作的?

3
我正在使用一个 Github 存储库,它有一个主分支和一个演示分支。一切都很好,代码的主版本和演示版本都在使用中(主版本用于暂存站点,演示版本用于演示站点)。现场运行的网站是基于已标记的提交运行的。
在进行更改时,我弄糟了某些东西,这段时间内没有显露出来,所以我需要开始查看旧的提交,以查看我如何引入问题。
在 Github 上,我看到演示分支的提交如下:
Changed logos to xxx ones
8c4a3eab22 Browse code 
pwhipp authored 3 days ago
Feb 04, 2014
Paul Whipp
Changed archetype age_default to default to zero (and set all null va… …
6e4c9e8864 Browse code 
pwhipp authored a month ago
Feb 03, 2014
Paul Whipp
Added demo.xxx allowed domain for RED
2f72e3b05a Browse code 
pwhipp authored a month ago

我在本地库中,更新了最新的代码,并执行了"git checkout 8c4a3eab22"。然后当我在本地使用git log命令时,会看到:

(red)~/wk/red $ git status
# HEAD detached at 8c4a3ea
(red)~/wk/red $ git log
commit 8c4a3eab22dc2ce9708c9aae00751e558ae81dd3
Author: pwhipp <paul.whipp@gmail.com>
Date:   Thu Feb 27 10:55:21 2014 +1000

    Changed logos to xxx ones

commit 2f72e3b05a005738d77ed12be475634aadf76b49
Author: pwhipp <paul.whipp@gmail.com>
Date:   Mon Feb 3 10:58:08 2014 +1000

    Added demo.xxx allowed domain for RED

为什么git log没有显示6e4c9e8864?它是存在的(我可以检查它),但是当我在github上浏览6e4c9e8864时,它与8c4a3eab22之间的差异似乎要大得多,所以我认为可能有其他提交我没有看到。

我需要阅读一些文档才能理解不同分支之间的日志调用中提交记录的报告方式吗?


如果你输入 git help log,它会给你 log 命令的文档,还是告诉你类似于 "git log" 被别名为 "log --blah --something --fancy" 这样的信息? - janos
1
GitHub 在图形化方面并不好,这经常是无助的。git log --oneline --graph 的输出显示了什么? git log --oneline --graph --all 呢? - user456814
git log 没有别名。 - Paul Whipp
Git图很有趣。我会看看是否能够使用它来解决我的问题。 - Paul Whipp
2个回答

1
很难在没有更多信息的情况下确定问题是如何出现的。然而,以下几点可能有助于您诊断问题:
1. 提交可以“存在”(能够被检出)而不成为分支历史的一部分。例如,如果我有两个分叉分支b和c,它们都有一个共同点a。如果我在分支b中,我仍然可以检出属于分支c的唯一提交,而无需先检出该分支。您可以使用git reflog获取过去对存储库发生的完整故事。分支只是git历史中这些点的标签。
2. 最好避免使用git pull,因为它会从远程获取并合并。在这种情况下,您可能已将错误的分支合并(例如,将远程主分支合并到本地演示),这可能会导致与预期不同的结果。
3. 提交可能已经被推送到远程,然后使用git reset或git rebase在本地删除/压缩。以这种方式,它将显示在github上但不在您的本地存储库中。

谢谢。我会进一步考虑第一点。关于第二点,我有意识地将更改合并到该分支中。通常情况下这很有效,我不认为它与此问题有关。关于第三点,我从未使用过git reset或git rebase - 也不打算使用。 - Paul Whipp

0

感谢评论和Conner的回答,我认为我已经解决了这个问题:

简而言之,一切都是正确的,但由于提交的时间顺序与合并将提交带入演示分支的顺序之间的差异可能会令人困惑。如果您只需要列出代表当前分支中有效状态的提交,则必须使用“git log --first-parent ....”。

详细说明如下:

当前的演示分支在8c4之后与主分支合并,因此在查看github上演示分支的完整日志历史记录时,6e4显示在其正确的位置。

当我本地检出8c4时,我正在查看一个演示分支状态,在该状态下,6e4尚未涉及,因为合并是在8c4之后进行的,因此6e4不会出现在日志中,因为6e4仅在主分支中(即使它是在2f7之后完成的)。

我可以检出8c4,因为它是主分支的状态。但是,如果我这样做,我将查看主分支的状态,而不是演示分支的状态。没有演示分支的状态,其中8c4位于该分支的头部。

解决这个问题最清晰、最好的方法来自于gitg(在ubuntu存储库中,可以通过“sudo apt-get install gitg”命令安装)。一旦我使用了它,我发现从“git log --oneline --graph”得到的文本输出更容易理解。

只有当您尝试回溯分支历史记录时,才会真正感到困惑。如果您尝试使用“git log”,您将看到影响当前代码库的提交列表,但它们不一定是存在于您所在分支上的状态。

如果像我一样,您需要回溯分支生命周期中的每个状态,那么(感谢this question),您需要使用--first-parent参数来运行git-log,例如:

(red)~/wk/red $ git log --first-parent --oneline
...
aa83af6 Merge branch 'master' into demo
...
8c4a3ea Changed logos to xxx ones
2f72e3b Added demo.xxx.com allowed domain for RED
...

git log 实际上非常强大(使用“git help log”获取详细信息)。我最终使用了“git log --first-parent --pretty="format: %h: %ad %s" --date=short”来获取我需要的确切历史更改步骤。 - Paul Whipp

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