git alias不只记录我想要的分支
我已经创建了一个测试别名,在这个别名中,我希望能够只记录我所在的当前分支(请记住,这是日志的简化版本,最后一个有更多细节、颜色等) 我的别名如下所示:git alias不只记录我想要的分支,git,github,git-alias,Git,Github,Git Alias,我已经创建了一个测试别名,在这个别名中,我希望能够只记录我所在的当前分支(请记住,这是日志的简化版本,最后一个有更多细节、颜色等) 我的别名如下所示: M <-- origin/br2 / ...--H <-- origin/master, origin/br1 \ I--J <-- br1 \ K--L <-- br2 (HEAD) test=“!git
M <-- origin/br2
/
...--H <-- origin/master, origin/br1
\
I--J <-- br1
\
K--L <-- br2 (HEAD)
test=“!git log\”$(git rev parse--abbrev ref HEAD)\”
但是,当我键入git test
时,我会得到分支上的2次提交,以及来自不同分支的所有以前的提交(我不希望这样)
有什么想法吗?谢谢此处显示的别名没有错误,错误的是您的期望(您对Git所说的“分支上”的含义的想法):也就是说,您所说的“分支上”和Git所说的“分支上”,根本不同意 基本问题是Git分支并不是人们所期望的那样。(有人可能会说,这意味着Git是错误的。其他一些VCSE,如Mercurial,按照您希望Git定义的方式定义分支。)在Git中,分支名称只指向一个提交,Git称之为该分支的提示提交 但是,每次提交都指向前一次或父级提交的某些数量(通常是一次)。Git使用它将提交串在一起用于多种目的,包括使用
Git log
显示它们。我们可以通过在纸上、白板上或StackOverflow答案中绘制分支名称,绘制出一个箭头,指向分支中包含的最后一个提交,然后让该提交的“真实名称”是那些大而难看的提交哈希ID之一,但我们将在这里使用单个字母,其中有一个箭头,指向其父对象,依此类推:
... <-F <-G <-H <-- master
名称feature
指向提交J
,因此提交J
位于feature分支上。提交J
指向I
,它指向H
,它指向G
,依此类推。因此,每次提交都在分支功能上,即使提交H
也是分支master
的提示提交。通过H
的提交都在master
上,因此通过H
的提交在两个分支上
在这里,您要做的不是记录当前分支中包含的所有提交(一个简单的git日志
就足够了),而是要求git记录当前分支中包含但不包含在其他分支中的提交。棘手的部分在于找出如何排除这些提交
一种方法是列出每个分支名称,然后去掉当前分支名称,然后告诉git log
:为我列出当前分支中包含的每个提交,从HEAD
开始,但在到达任何其他分支中包含的任何提交时停止列出。要做到这一点,您可以获取当前分支名称(如您现在所做的,或以其他方式),并将其从所有分支的列表中排除(您将以某种方式获得):
(如果其他四个分支通过br4
命名为br1
)
不过,这通常是不必要的。通常,当您在某个分支上工作时,您将指定其他名称,有时是另一个分支名称,有时是远程跟踪名称,如origin/master
——作为当前分支的上游。每个分支只能有一个上游设置(或者根本没有设置),一旦有了上游设置,就可以使用符号符号@{upstream}
或短版本@{u}
来引用它:
git log HEAD --not @{u}
这里有一个简短的语法,因为它非常有用:在提交说明符前面加上hat^
字符意味着“not”,因此您可以编写:
git log HEAD ^@{u}
还有一个更简短的语法,因为这很常见:
git log @{u}..HEAD
字面意思是指可从当前头提交访问的所有提交,但可从当前分支的上游访问的所有提交除外
因此,您可能只需要@{u}..HEAD
符号。这与明确排除所有其他分支不同。例如,假设我们有一个图形,其部分外观如下:
M <-- origin/br2
/
...--H <-- origin/master, origin/br1
\
I--J <-- br1
\
K--L <-- br2 (HEAD)
M
M <-- origin/br2
/
...--H <-- origin/master, origin/br1
\
I--J <-- br1
\
K--L <-- br2 (HEAD)