Git日志图,但只有一些分支



我想做一些Gitk已经做过的事情,除了在命令行中。我想显示来自一个分支的所有提交,加上来自另一个分支,但不显示其他历史。让我们更具体地说:我说的是一个功能分支加上主分支,但没有其他东西(不管还有多少其他东西)。如何做到这一点?

通过";从分支提交";我指的是在分支上显式提交(并推送)的提交,而不是由合并带来的提交。对于我来说,看到提交实际上是一个合并就足够了,正如我希望在提交消息中看到的那样,这是一个与其他分支的合并,告诉我足够了。

为了在Gitk中实现这一点:我创建了一个视图,在其中列出我想看到的分支;"限制到第一个父对象";。

一个例子。

L-M : other stuff

A-B-C-I : feature
/ 
... -D-E-F-J : main
/   /   
/ G-H-K : more other stuff
/
... potentially even more stuff contributing to main via merges (not explicitly known)

CCD_ 1是CCD_ 2和CCD_。

CCD_ 4是CCD_ 5和CCD_。

CCD_ 7是CCD_ 8和CCD_。

我想看C0、BCIDEFJ,但不想看GHB0、LM

A-B-C-I - feature
/ 
D-E-F-J - main

额外奖励:也看不到J。。。奖金到奖金:。。。但不知怎的知道CCD_ 24曾经是CCD_。

A-B-C-I - feature
/ 
D-E-F - was main

编辑:如果我使用--first-parent main feature,我几乎得到了我想要的,除了没有显示第二个父级合并关系(即使它们存在,Gitk也会显示它们)。现在怎么办?

没有办法100%可靠地满足您的所有需求。LeGEC的回答针对了你最初问题中的具体例子,但我猜你的后续行动不会让人感到惊讶。

对于您的基本需求,您可以尝试类似的东西

git log --graph --oneilne --first-parent main feature

如果你遵循典型的惯例,那么这很可能会给你想要的。但在某些情况下,它不会。我会回到那个问题上来。

对于您的";奖金";,你可以做一些类似的事情

git log --graph --oneline --first-parent $(git merge-base main feature) feature

因此,您不是说main,而是说您希望从两个分支都可以访问到最后一次提交的历史记录。

我不知道如何在日志中动态标记合并基准提交(额外的好处)。我想你可以标记你的合并基地。

git tag was_on_master $(git merge-base main feature)
git log --graph --oneline --first-parent feature was_on_master
git tag -d waS_on_master

所以现在。。。它什么时候不起作用,为什么会这样?

在git中,提交不会";属于";分支机构。没有历史告诉你哪个分支是提交的";创建于";。分支和提交之间的唯一关系是,从给定的分支可以访问或不可以访问提交。在合并提交的情况下,您还可以使用父指针的顺序来区分哪个";方向";合并可能发生在.中

如果你在branch_A上,你说git merge branch_B,那么你正在进行的提交(历史"来自"F0)将是合并的第一个父级。这就是--first-parent稍后将要介绍的内容。并且,如果当您发出merge命令时,实际上已经签出了branch_A(而不是在分离的HEAD状态下签出相同的提交),则branch_A会自动移动到merge上;因此假设是典型的";第一个父级表示这个分支的历史;。

但在某些情况下,有人可能会做一些会把事情搞砸的事情。假设你有

... A <--(branch_A)

... B <--(branch_B)

然后你说

git checkout branch_A
git merge branch_B
git checkout branch_B
git merge branch_A

除非您的配置阻止,否则第二次合并将作为快进处理,导致

... A -- M <--(branch_A)(branch_B)
/
... B

现在,无论检出哪个分支,git log --first-parent都将转到A

一个应该符合您在图上描述的答案:

git log --oneline --graph main feature ^K ^M

要排除J,只需不列出main:

git log --oneline --graph feature ^K ^M

git log自变量中,^xxx(注意E0被放置在提交ish之前,而不是之后)意味着";从提交列表中排除CCD_ 41及其所有祖先";

最新更新