## 名称

git-replace - 创建，列出，删除引用来替换对象

## 概要

    git replace [-f] <object> <replacement>git replace [-f] --edit <object>git replace [-f] --graft <commit> [<parent>…]git replace -d <object>…

    git replace [--format=<format>] [-l [<pattern>]]

## 描述

在`refs/replace/`命名空间中添加一个`replace`引用。

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

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

除非`-f`给出，否则`replace`参考不得存在。

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

所有 Git 命令默认使用替换引用，除了那些进行可访问性遍历（修剪，包传输和 fsck）的引用。

对于任何使用该`--no-replace-objects`选项的命令，可以禁用替换引用的使用`git`。

例如，如果commit `foo`已经被commit`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 <object>

以交互方式编辑对象的内容。将<object>的现有内容打印成临时文件，在该文件上启动编辑器，解析结果以创建与<object>具有相同类型的新对象。然后创建一个替换ref，用新创建的对象替换<object>。有关如何选择编辑器的详细信息，请参阅git-var [1]。

--raw

编辑时，提供原始对象内容而不是漂亮的内容。目前这只影响树木，它们将以二进制形式显示。这很难处理，但可以帮助修复一个如此受损的树，无法打印。请注意，您可能需要将您的编辑器配置为干净地读取和写入二进制数据。

--graft <commit> <parent>…

创建一个嫁接提交。一个新的提交与<commit>具有相同的内容，除了它的父母将是<parent> ...而不是<commit>的父母。然后创建一个替换ref，用新创建的提交替换<commit>。有关基于此选项的示例脚本，请参阅 contrib / convert-grafts-to-replace-refs.sh，该选项可以将移植替换为替换。

-l <pattern> --list <pattern>

列表替换与给定模式匹配的对象的引用（如果没有给出模式，则全部替换）。键入“git替换”不带参数，也列出所有替换参考。

--format=<format>

当列出，使用指定的<格式>，它可以是一个`short`，`medium`和`long`。省略时，格式默认为`short`。

## 格式

以下格式可用：

- `short`: <replaced sha1>

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

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

## 创建替换对象

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

如果你想要替换很多 blob，树或提交，它们是提交字符串的一部分，你可能只想创建一个替换的提交字符串，然后只在提交的目标提交字符串的顶端替换提交提交替换字符串的提示。

## 错误

比较已经替换它们的斑点或树木将无法正常工作。并且使用`git reset --hard`返回到替换的提交将分支移动到替换提交而不是替换的提交。

使用`git rev-list`与待处理对象相关时可能会有其他问题。