Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git alias不只记录我想要的分支_Git_Github_Git Alias - Fatal编程技术网

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)