Git

名称

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

概述

git replace [-f] <对象> <更换>
git replace [-f] --edit <对象>
git replace [-f] --graft <提交> [<父>…​]
git replace [-f] --convert-graft-file
git replace -d <对象>…​
git replace [--format=<格式>] [-l [<模式>]]

描述

refs/replace/ 命名空间中添加 replace 引用。

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

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

除非给出 -f,否则 replace 引用必须不存在。

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

除了进行可达性遍历的命令(剪枝、打包转移和 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 <对象>

交互式编辑对象的内容。<对象> 的现有内容会被漂亮地打印到一个临时文件中,然后在该文件上启动编辑器,并对结果进行解析,以创建一个与 <对象> 类型相同的新对象。然后创建一个替换引用,用新创建的对象替换 <对象>。关于如何选择编辑器,详见 git-var[1]

--raw

编辑时,请提供原始对象内容,而不是格式化打印的内容。目前这只影响目录树,因为目录树将以二进制形式显示。这比较难处理,但在修复已损坏到无法格式化打印的目录树时可以有所帮助。需要注意的是,你可能需要对编辑器进行配置,以便干净利落地读写二进制数据。

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

创建嫁接提交。新创建的提交内容与 <提交> 相同,只是它的父提交将是 [<父提交>…​],而不是 <提交> 的父提交。然后会创建一个替换引用,用新创建的提交替换 <提交>。使用 --convert-graft-file,转换 $GIT_DIR/info/grafts 文件并使用替换引用代替。

--convert-graft-file

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

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

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

--format=<格式>

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

格式

提供以下格式:

  • short: <替换后的 sha1>

  • medium: <replaced-sha1> → <replacement-sha1>

  • long: <replaced-sha1> (<replaced-type>) → <replacement-sha1> (<replacement-type>)

创建替换对象

git-hash-object[1]、linkgit:git-rebase[1]、https://github.com/newren/git-filter-repo[git-filter-repo] 等 git 命令可以用来从现有对象创建替换对象。此外,--edit 选项也可以与 git replace 一起使用,通过编辑现有对象来创建替换对象。

如果您想替换属于提交串一部分的许多二进制对象、目录树或提交,您可能只想创建一个替换提交串,然后只用替换提交串顶端的提交替换目标提交串顶端的提交。

漏洞

比较被替换的二进制对象或目录树与替换它们的二进制对象或目录树将无法正常工作。使用 git reset --hard 回到被替换的提交,会将分支移动到替换提交,而不是被替换的提交。

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

GIT

属于 git[1] 文档

scroll-to-top