首先,git log --graph --oneline --decorate
不是我想做的。
我经常运行git log -p --all -G pattern
,我希望能看到已经进行了更改的分支名称。有没有办法做到这一点?
这可能是一个不合适的问题,因为根据我的理解,Git没有明确记录提交提交的分支的名称,当我们有多个分支时,我们无法唯一关联,比如说,与他们的回购中的第一个分支。
答案 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-hash
,branch-name
,commit-message
,time
,committer-name
和changes 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 comment,git 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 log
和git rev-list
是从同一个C构建的源文件,它有两个不同的main
类函数,根据我们是否只需要哈希值,即rev-list
来选择,或者生成人类可读的文本,即log
) 。图中的入口点通常是HEAD
和/或一些分支和/或标记名称。 --all
选项表示“所有引用”:所有分支和标记名称,refs/stash
引用,refs/notes
下的所有内容,等等。
1 为此,git log
/ git rev-list
必须将每次提交与其父级进行区分。这对于具有多个父项的合并提交是有问题的。有关其工作原理的确切细节非常模糊,但值得指出的是,合并提交与历史简化代码混乱,您可能希望--full-history
禁用侧枝修剪,-m
为拆分合并提交,以便 N - 父合并产生 N 单独的差异,一个针对每个父级,以便拆分合并本身可以选择任何一个这样的差异包含那个表达。