你真的不能按照你展示的方式做到这一点。问题归结为笔记的工作方式。正如mart1n 在评论中建议的那样,您需要先推送笔记,或者同时推送。原因如下:
笔记的工作原理
存在“附加到”提交的注释(因此可以通过git log 和git show 显示)“现在”如果:
- 假设这次提交的 SHA1(我们正在尝试查找其注释)是
1234567...。
-
refs/notes/commits 存在,并且
- 通过
refs/notes/commits 指向的提交读取,有一个文件名与1234567... 匹配的“文件”。
注释是带有有趣名称的文件的内容。
让我们探索一下寻找笔记的过程。
背景,使用低级“原始”git 命令
大多数 repo 的最低级别访问命令是 git cat-file。这使您可以查看存储库中任何对象的类型 (git cat-file -t <em>sha1</em>) 和内容 (git cat-file -p <em>sha1</em>)。这里的 sha1 部分可以是任何 git 引用名称,只要它解析为那些 40 个字符的十六进制 SHA-1 值之一。注释的默认引用名称是refs/notes/commits,并且(如果存在)它应该始终指向commit 对象。因此:
$ git cat-file -p refs/notes/commits
tree 28db2757c2b7c6e4bbfef35e61e8bd7c698626dc
parent ce97e80bfbdab9bc163ecb93779d071d7ed8c739
author A U Thor <author@example.example> 1376652910 -0600
committer A U Thor <author@example.example> 1376652910 -0600
Notes added by 'git notes edit'
我们的下一步是查看此处命名的tree:
$ git cat-file -p 28db2757c2b7c6e4bbfef35e61e8bd7c698626dc
对于一组简短的注释,这几乎与我们将在下面看到的相同。如果有很多注释,这会导致更多的trees,这反过来又可以有更多的子树,所以很痛苦。有一个更简单的方法。
获取笔记
要查看当前注释是什么(如果有),请使用git notes list:
$ git notes list
b9458a531c3f93bd36af0025d56029ef58cf8d00 5e013711f5d6eb3f643ef562d49a131852aa4aa1
1c716d4d58325651ceecba14ce8974b0ac6d13e9 a546ad9299465c9cf304fecf01d1514337419e2f
“笔记内容”使用每行左侧的 SHA-1,每个笔记内容文件附加到 SHA-1 在右侧的提交1。让我们使用第一行来看看它是如何工作的:
$ git cat-file -t 5e013711f5d6eb3f643ef562d49a131852aa4aa1
commit
$ git cat-file -p 5e013711f5d6eb3f643ef562d49a131852aa4aa1
tree ead5cc295ae64c9186f392b80ca4ed10888f20d9
parent 309b36c8166f5ff330a6e8a0a674ed161d45b5f4
author ...[line snipped]
committer ...[line snipped]
add ast ... [rest snipped]
当然,您可以通过git show 5e0137 或git log -1 5e0137 等来查看该提交,这也会向您显示注释内容。但是,要仅查看原始笔记内容,请使用左侧的 SHA-1:
$ git cat-file -p b9458a531c3f93bd36af0025d56029ef58cf8d00
experiment: add a note
this is the text I put in the note
让我们做一个git notes edit 5e0137 并更改提交的注释,然后再次git notes list:
$ git notes edit 5e0137
[editor session snipped]
$ git notes list
d87650a968ff684e69175eacde0880595f9f2989 5e013711f5d6eb3f643ef562d49a131852aa4aa1
1c716d4d58325651ceecba14ce8974b0ac6d13e9 a546ad9299465c9cf304fecf01d1514337419e2f
右边的两个“文件名”还是完全一样的,但是左边的第一个SHA1不同。我们来看看:
$ git cat-file -p d87650a968ff684e69175eacde0880595f9f2989
change some stuff in the note
I edited the note attached to 5e0137.
如果您现在 git show(git log 等)提交旧注释所附加的提交,您将获得新注释。实际上,它们的作用是运行git notes list,检查右侧的匹配ID,如果找到,git cat-file -p 左侧的ID(重新格式化/缩进)。 (当然,这是一个更优化的版本。)
这种在 notes 列表中查找提交 ID 的机制是注释可以更改的原因。
在refs/notes/commits 下添加一个新提交会在该“分支”下添加/更改文件(它实际上不是一个分支,分支以refs/heads/ 开头,但它只是就像 一个分支)。新文件具有适用于现有(旧)提交的新注释。那些旧的提交根本没有改变,但是当 git log 和 git show 查看注释以查看提交 ID 是否在其中时,它们会为同一个旧提交显示新的、不同的注释。
refs/notes/commits 命名的提交对象现在必须存在,并且必须指向您希望看到的附在您所询问的提交上的注释。如果您 push 对某个远程仓库进行了一系列新提交,并且还没有 pushed refs/notes/commits 提交,那么在远程仓库上查看的任何内容都看不到您的笔记,因为它们根本不是em>那里。先推送笔记,或者同时推送,它们就会在那里找到。
1其实一个笔记可以列出any SHA-1:一个提交对象、一个blob对象、一个带注释的标签对象,甚至是一个树对象。您甚至可以输入与 repo 中的任何对象都不对应的 SHA-1 值,如果您愿意,可以输入“分离注释”。我知道这种东西没有用处,但没有技术原因无法完成。 [编辑添加:git notes 不会这样做;我的意思是你可以用 git 管道命令来做到这一点。不过我没试过。]
怪事
当然,refs/notes/commits 本身就是一个常规的提交树。因此,我们可以“回到过去”并查看最近的git notes edit 之前的笔记是什么样的。但是似乎没有“前端”接口。我试过了,例如:
$ git log -1 --notes=refs/notes/commits^ 5e0137
但这根本没有显示任何注释,这看起来很奇怪/损坏了,因为--notes=refs/notes/commits 有效。