git log如何跨分支机构工作?

时间:2014-03-02 07:06:33

标签: git github git-branch git-log git-checkout

我正在使用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?它存在(我可以检查出来),但它和8c4a3eab22之间的差异似乎远远大于我在github上浏览6e4c9e8864时所显示的差异,所以我想可能还有其他我没有看到的提交。

我是否需要在某个地方使用RTFM来了解如何在不同分支的日志调用中报告提交?

2 个答案:

答案 0 :(得分:1)

如果没有更多信息,很难说出问题是怎么产生的。但是,有几点可以帮助您诊断它。

  1. 提交可以“存在”(能够被检出)而不是分支历史的一部分。例如,如果我有两个不同的分支bc,它们都有一个公共点a。如果我在分支b中,我仍然可以检出分支c所特有的提交,而不必先检查该分支。您可以使用git reflog来了解过去存储库中发生的事情的完整故事。分支只是git历史中其中一个点的标签。
  2. 最好避免git pull,因为它从遥控器中取出并合并。在这种情况下,您可能已合并到错误的分支(例如,合并的远程主服务器到本地演示),这可能会导致与您预期不同的结果。
  3. 提交可能已被推送到远程,然后在本地使用git resetgit rebase删除/压缩。以这种方式,它将显示在github上,但不会显示在本地存储库中。

答案 1 :(得分:0)

感谢评论和康纳的回答,我想我已将其排序:

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

长:

当前的演示分支已经在8c4之后与master合并,因此当查看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
...