Git:装饰" git log --all"显示的所有提交。与分支名称

时间:2016-12-23 13:16:56

标签: git

首先,git log --graph --oneline --decorate不是我想做的。

我经常运行git log -p --all -G pattern,我希望能看到已经进行了更改的分支名称。有没有办法做到这一点?

这可能是一个不合适的问题,因为根据我的理解,Git没有明确记录提交提交的分支的名称,当我们有多个分支时,我们无法唯一关联,比如说,与他们的回购中的第一个分支。

2 个答案:

答案 0 :(得分:0)

试试这个。您可以自定义--pretty-format以设置颜色,交换输出值等。

$ git log -p --all -G pattern --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --branches

通过此命令,您可以看到commit-hashbranch-namecommit-messagetimecommitter-namechanges of the commits

答案 1 :(得分:0)

  

这可能是一个不合适的问题,因为根据我的理解,Git没有明确记录提交提交的分支的名称,而当我们有多个分支时,我们无法唯一地关联,例如,与他们在回购中的第一个分支。

这是正确的。

根本问题是分支名称,如果有一个 - 可能没有,如果你处于“分离的HEAD”模式 - 不是提交的一部分。此外,可以在提交之后随时添加,更改和删除分支名称,以便任何给定的提交可以在no,one或many分支上,包含分支的集合动态变化。

这与大多数版本控制系统形成鲜明对比。例如,在Mercurial中,提交的分支的名称是提交的一部分。该提交永远存在于该分支上,并且它永远不会出现在任何其他分支上。每个提交都在一个分支上,很容易将提交ID转换为分支名称。在Git中,提交是在零个或多个分支上,当它在许多分支上时,它同时存在于所有分支上。

因此,在Git中,分支名称 - 就此而言,标记名称和所有其他引用(包括HEAD本身 - 本质上是无关紧要的,除了一个关键点:引用是我们(和Git)获得的方式条目到提交图。每个提交的身份 - 每个Git对象,实际上 - 是它丑陋的SHA-1哈希。该唯一ID定位存储库中的对象。引用 - 分支和标记名称,主要是让我们从图中开始,然后每个提交都有一个对其父项的引用,或对其多个父项的多个引用,通过它们的原始ID。

作为Schwern noted in a commentgit branch --contains将找到可以访问某些Git对象的名称。 Git log具有%d%D格式,这些格式与--decorate的格式相同,但它们只会显示哪些引用将直接指向提交正在显示,而-G regex仅选择添加或删除与给定正则表达式匹配的行的提交。 1 因此,如果你有一个这样的图片段:

...-o--o--*--o   <-- branch1
     \
      o--o--*    <-- branch2

*模式参数选中标记为-G的两个提交的情况下,branch2提示处的提交将被修饰(因为提交的refs/heads/branch2名称)但是从branch1的提示向后退一步将不会(因为没有分支直接指向它)。

(如果有标记,无论是轻量级还是注释,指向*可从branch1到达的提交,%d将显示该标记的名称。)

许多Git命令遍历提交图 - 主要是通过调用git rev-list,或者内置git rev-list(例如,git loggit rev-list是从同一个C构建的源文件,它有两个不同的main类函数,根据我们是否只需要哈希值,即rev-list来选择,或者生成人类可读的文本,即log) 。图中的入口点通常是HEAD和/或一些分支和/或标记名称。 --all选项表示“所有引用”:所有分支和标记名称,refs/stash引用,refs/notes下的所有内容,等等。

1 为此,git log / git rev-list必须将每次提交与其父级进行区分。这对于具有多个父项的合并提交是有问题的。有关其工作原理的确切细节非常模糊,但值得指出的是,合并提交与历史简化代码混乱,您可能希望--full-history禁用侧枝修剪,-m为拆分合并提交,以便 N - 父合并产生 N 单独的差异,一个针对每个父级,以便拆分合并本身可以选择任何一个这样的差异包含那个表达。