简体中文 ▾ 主题 ▾ 最新版本 ▾ git-replace 最后更新于 2.44.0

名称

git-replace - 创建、列出、删除用于替换对象的引用

概要

git replace [-f] <object> <replacement>
git replace [-f] --edit <object>
git replace [-f] --graft <commit> [<parent>…​]
git replace [-f] --convert-graft-file
git replace -d <object>…​
git replace [--format=<format>] [-l [<pattern>]]

描述

refs/replace/ 命名空间中添加一个 replace(替换)引用。

replace 引用的名称是被替换对象的 SHA-1 值。replace 引用的内容则是替换对象的 SHA-1 值。

被替换对象和替换对象必须是相同类型。这一限制可以使用 -f 绕过。

除非指定了 -f,否则该 replace 引用必须尚不存在。

对于被替换对象和替换对象没有其他限制。合并提交可以被非合并提交替换,反之亦然。

默认情况下,除了执行可达性遍历(prune、pack transfer 和 fsck)以外,所有的 Git 命令都会使用替换引用。

可以在 git 命令后紧跟 --no-replace-objects 选项,来为任何命令禁用替换引用。

例如,如果提交 foo 已被提交 bar 替换

$ git --no-replace-objects cat-file commit foo

显示关于提交 foo 的信息,而

$ git cat-file commit foo

显示关于提交 bar 的信息。

可以设置 GIT_NO_REPLACE_OBJECTS 环境变量来达到与 --no-replace-objects 选项相同的效果。

选项

-f
--force

如果已存在针对同一对象的替换引用,则将其覆盖(而不是报错)。

-d
--delete

删除给定对象的现有替换引用。

--edit <对象>

以交互方式编辑对象内容。<对象> 的现有内容会被美化输出(pretty-printed)到一个临时文件中,随后启动编辑器。对该文件编辑后的结果将被解析,以创建一个与 <对象> 类型相同的新对象。然后创建一个替换引用,用新创建的对象替换 <对象>。有关如何选择编辑器的详细信息,请参见 git-var[1]

--raw

编辑时,提供原始对象内容而不是美化输出的内容。目前这仅影响树对象(tree),它们将以二进制形式显示。这虽然更难操作,但在修复一个损坏到无法美化输出的树对象时可能会有帮助。请注意,您可能需要配置编辑器以支持干净地读写二进制数据。

--graft <提交> [<父提交>…​]

创建一个嫁接(graft)提交。新提交的内容与 <提交> 相同,但其父提交将是 [<父提交>…​],而不是 <提交> 原有的父提交。然后创建一个替换引用,用新创建的提交替换 <提交>。使用 --convert-graft-file 可以转换 $GIT_DIR/info/grafts 文件并改用替换引用。

--convert-graft-file

$GIT_DIR/info/grafts 中的所有条目创建嫁接提交,并在成功后删除该文件。目的是帮助用户从现已弃用的嫁接文件过渡到替换引用。

-l <模式>
--list <模式>

列出匹配给定模式的对象替换引用(如果未给定模式,则列出所有)。输入不带参数的 "git replace" 也会列出所有替换引用。

--format=<格式>

列出时使用指定的 <格式>,可以是 short(短)、medium(中)或 long(长)之一。省略时,格式默认为 short

格式

可使用以下格式:

  • short: <被替换对象的-sha1>

  • medium: <被替换对象的-sha1> → <替换对象的-sha1>

  • long: <被替换对象的-sha1> (<被替换对象的类型>) → <替换对象的-sha1> (<替换对象的类型>)

创建替换对象

git-hash-object[1]git-rebase[1]git-filter-repo 等 git 命令均可用于从现有对象创建替换对象。git replace--edit 选项也可用于通过编辑现有对象来创建替换对象。

如果您想替换一串提交中的许多 blob、tree 或 commit,您可以只创建一串替换提交,然后仅将被替换提交序列末端的提交替换为替换提交序列末端的提交。

BUG

比较被替换的对象与替换它们的对象将无法正常工作。此外,使用 git reset --hard 回退到被替换的提交时,会将分支移动到替换后的提交而不是被替换的原始提交。

在使用 git rev-list 时,可能会遇到与待处理对象相关的其他问题。

GIT

Git[1] 套件的一部分