Skip to content

git-read-tree

将树信息读入索引。

概要

bash
'git read-tree' [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>)
		[-u | -i]] [--index-output=<file>] [--no-sparse-checkout]
		(--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])

描述

将 <tree-ish> 给出的树信息读入索引,但实际上并不更新它"缓存"的任何文件。(参见:git-checkout-index(1)

可选地,它可以使用 -m 标志将树合并到索引中,执行快进(即双向)合并或三向合并。当与 -m 一起使用时,-u 标志使其还使用合并结果更新工作树中的文件。

只有简单的合并由 git read-tree 本身完成。当 git read-tree 返回时,只有冲突的路径处于未合并状态。

选项

  • -m:执行合并,而不仅仅是读取。如果您的索引文件有未合并的条目(表示您尚未完成之前开始的合并),命令将拒绝运行。
  • --reset:与 -m 相同,不同之处在于未合并的条目被丢弃而不是失败。当与 -u 一起使用时,导致工作树更改或未跟踪文件或目录丢失的更新不会中止操作。
  • -u:成功合并后,使用合并结果更新工作树中的文件。
  • -i:通常合并需要索引文件和工作树中的文件与当前头提交保持最新,以免丢失本地更改。此标志禁用与工作树的检查,旨在用于将与当前工作树状态不直接相关的树合并到临时索引文件中。
  • -n, --dry-run:检查命令是否会出错,而不实际更新索引或工作树中的文件。
  • -v:显示检查文件的进度。
  • --trivial:将 git read-tree 的三向合并限制为仅在不需要文件级合并时发生,而不是为简单情况解决合并并将冲突文件留在索引中未解决。
  • --aggressive:通常 git read-tree 的三向合并为真正简单的情况解决合并,并将其他情况留在索引中未解决,以便 porcelains 可以实现不同的合并策略。此使命令在内部解决更多情况:当一侧删除路径而另一侧保持路径不变时,解决方案是删除该路径;当两侧都删除路径时,解决方案是删除该路径;当两侧相同地添加路径时,解决方案是添加该路径。
  • --prefix=<prefix>:保留当前索引内容,并在 <prefix> 目录下读取命名的树。该命令将拒绝覆盖原始索引文件中已存在的条目。
  • --index-output=<file>:不是将结果写入 $GIT_INDEX_FILE,而是将结果索引写入命名文件。当命令运行时,原始索引文件使用通常的相同机制锁定。该文件必须允许从通常索引文件旁边创建的临时文件重命名;通常这意味着它需要与索引文件本身位于同一文件系统上,并且您需要对索引文件和索引输出文件所在目录的写入权限。
  • --recurse-submodules:使用 --recurse-submodules 将根据超级项目中记录的提交更新所有活动子模块的内容,通过递归调用 read-tree,同时将子模块的 HEAD 设置为在该提交处分离。
  • --no-recurse-submodules:不递归到子模块。
  • --no-sparse-checkout:即使 core.sparseCheckout 为 true,也禁用稀疏检出支持。
  • --empty:不是将树对象读入索引,而是清空它。
  • -q, --quiet:安静,抑制反馈消息。
  • <tree-ish#>:要读取/合并的树对象的 ID。

合并

如果指定了 -mgit read-tree 可以执行 3 种合并:如果只给定 1 棵树则为单树合并,如果给定 2 棵树则为快进合并,如果给定 3 棵或更多树则为三向合并。

单树合并

如果只指定了 1 棵树,git read-tree 的操作就像用户没有指定 -m 一样,不同之处在于如果原始索引有给定路径名的条目,并且该路径的内容与正在读取的树匹配,则使用索引中的 stat 信息。换句话说,索引的 stat() 优先于合并树的 stat()。

这意味着如果您执行 git read-tree -m <newtree> 后跟 git checkout-index -f -u -agit checkout-index 只会检出真正更改的内容。

这用于避免在 git read-tree 之后运行 git diff-files 时不必要的误命中。

双树合并

通常,这被调用为 git read-tree -m $H $M,其中 $H 是当前仓库的头提交,$M 是外部树的头,它只是领先于 $H(即我们处于快进情况)。

当指定了两棵树时,用户告诉 git read-tree 以下内容:

  1. 当前索引和工作树派生自 $H,但用户可能在其中有自 $H 以来的本地更改。
  2. 用户希望快进到 $M。

在这种情况下,git read-tree -m $H $M 命令确保没有本地更改因这次"合并"而丢失。

三向合并

每个"索引"条目都有两位的"阶段"状态。阶段 0 是正常的,是您在任何正常使用中会看到的唯一一个。

但是,当您使用三棵树执行 git read-tree 时,"阶段"从 1 开始。

这意味着您可以执行 $ git read-tree -m <tree1> <tree2> <tree3>,最终将得到一个索引,其中所有 <tree1> 条目在"stage1"中,所有 <tree2> 条目在"stage2"中,所有 <tree3> 条目在"stage3"中。当执行将另一个分支合并到当前分支的操作时,我们使用公共祖先树作为 <tree1>,当前分支头作为 <tree2>,另一个分支头作为 <tree3>。

稀疏检出

注意:git-update-index(1)read-tree 中的 skip-worktree 功能早于 git-sparse-checkout(1) 的引入。鼓励用户使用 sparse-checkout 命令而不是这些 plumbing 命令来满足稀疏检出/skip-worktree 相关需求。

"稀疏检出"允许稀疏地填充工作目录。它使用 skip-worktree 位(参见 git-update-index(1))来告诉 Git 工作目录中的文件是否值得查看。

git read-tree 和其他基于合并的命令(git mergegit checkout...)可以帮助维护 skip-worktree 位图和工作目录更新。$GIT_DIR/info/sparse-checkout 用于定义 skip-worktree 参考位图。当 git read-tree 需要更新工作目录时,它会根据此文件重置索引中的 skip-worktree 位,该文件使用与 .gitignore 文件相同的语法。

另请参阅

git-write-tree(1), git-ls-files(1), gitignore(5), git-sparse-checkout(1)

Git

git 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布