3

由于一个拙劣的git commit --fixup. 我想我已经确定了源头,而且我的处境比开始时要好。但是,如果我查看 git reflog,这一系列“rebase -i”行看起来就像我之前的拙劣尝试。

我可以将自己的行添加到 reflog 吗?说一些看起来像这样的话:

$ git reflog mark '== we are not worse off than we started here =='
$ git reflog -3
cb6536f HEAD@{0}: mark: == we are not worse off than we started here ==
cb6536f HEAD@{1}: rebase -i (finish): fixup! foo: baz the widgets
9db07de HEAD@{1}: rebase -i (pick): fixup! baz: implement widget bazzing
4

2 回答 2

2

您可以随时使用 git 用于添加新 reflog 条目的相同命令添加新的 reflog 条目,即git update-ref. 这是一个“管道”(面向脚本)命令,所以它不是非常用户友好,您可能想要添加自己的小包装脚本或别名。

例子:

git update-ref -m 'mark: whatever' HEAD HEAD
git update-ref -m 'mark: another thing' refs/heads/branch branch
git update-ref -m 'mark: third thing' refs/heads/branch refs/heads/branch
hash=$(git rev-parse refs/heads/branch) && \
   git update-ref -m 'mark: 4' refs/heads/branch $hash

请注意,<ref>(第一个非选项参数)必须完全拼写出来。可以是解析为有效 SHA-1的<newvalue>任何内容,这就是为什么三个示例的中间命令可以工作的原因,但为了安全起见,最好使用第三种形式(<ref>完全重复)或使用实际的 SHA-1 hash(第四种形式),让git rev-parse我们验证这实际上是一个有效的分支名称。

(使用时您可以跳过验证,因为如果不是有效名称HEAD,git 根本无法运行。)HEAD

于 2016-04-21T19:34:22.113 回答
0

正如这个2020 线程中提到的:

在更现代的 Git 版本中有一个选项core.logAllRefUpdates,它的值为 " "。 文档说:always

如果该选项设置为always,则会为 refs/ 下的任何 ref 自动创建缺少的 reflog。

现在,假设您希望所有 refs 都使用 reflog,但是拥有 reflog 而不使用它实际上并没有太大的缺点。

杰夫金斯补充道:

当前的规则实际上是附加到任何已经存在的 reflog 中,或者core.logAllRefUpdates在决定是否创建一个不存在的 reflog 时进行咨询。所以我认为设置一个一次性配置变量,例如:

git -c core.logAllRefUpdates=always update-ref refs/foo/bar ...

将创建 reflog,然后任何后续更新(即使没有该配置集)将附加到它。

你也可以这样做:

mkdir -p .git/logs/refs/foo/
touch .git/logs/refs/foo/bar
git update-ref refs/foo/bar ...

但我不会推荐它。
当我们最终转向支持其他 ref 后端格式时,它们不一定会以相同的方式存储日志。

于 2020-02-26T05:28:30.867 回答