首页 > 解决方案 > 如何在没有结帐的情况下在另一个分支中进行提交?

问题描述

我有一个带有孤立分支的 git 存储库。我目前在master分支上,并且像这样复制了孤立的分支:

git read-tree other-branch
git checkout-index -f -a --prefix=/home/user/another-workdir/
git read-tree master  # Restore

假设我对 中的文件进行了更改/home/user/another-workdir/,如何在不更改当前工作目录(即不更改git checkout)的情况下将这些更改提交到孤立分支?

我试过git --work-dir=/home/user/another-workdir/ commit -a了,但这会影响我正在处理的分支(master)。

标签: git

解决方案


到目前为止,最简单的方法是:不要。也就是说,根本不要尝试这样做,以这种方式。换一种方式。

如果你有 Git 2.15 或更高版本——甚至 2.5 或更高版本——你有一个git worktree带有子命令的命令 , 。子命令之一是git worktree add. 这需要另一个分支的名称,例如,other-branch作为参数,还需要一个地方的名称来创建一个新的工作树,以另一个顺序:

git worktree add ../auxiliary other-branch

(假设../auxiliary将您带到 Git 可以mkdir auxiliary在现有工作树之外的地方;/home/user/another-workdir/可能也可以)。

所以:用于git worktree add创建一个的工作树,如此处所示。这个新的工作树是全新的,所以没有可以覆盖的文件。新的工作树也有一个新的索引,因此覆盖你的主工作树的索引/工作树对,即你所在的分支master,完全独立于新的索引/工作树对对于这个另一个分支。

您现在可以启动一个新的 shell 窗口,或pushd ../auxiliary,或任何您喜欢进入独立分支上的新工作树的东西。1 在这里,您可以从主工作树、git add和复制文件git commit。这就像拥有一个单独的存储库,除了提交进入(共享)存储库,自动更新主存储库中的共享)分支名称,不需要单独的步骤。other-branchgit fetch

如果您的 Git >= 2.5 但 < 2.15,请完成所有这些工作,然后在 14 天内返回主存储库,并使用rm -rf ../auxiliary(或存储存储库的任何位置)和git worktree prune. 这将回避一个讨厌的错误:这些版本的 Git 无法检查添加的工作树中的引用,并且可以丢弃运行时正在使用的对象git gc(来自任一工作树!)。如果您的 Git 是 2.15 或更高版本,则错误已修复且无需清理,尽管您可能仍想这样做。


1 “孤儿分支”不是一个很好的术语,因为 Git 专门用它来谈论你在一个不存在的分支名称上的设置,通过运行git checkout --orphan. 一旦您从该状态提交,该名称就不再是“孤儿”。该checkout命令称其为孤立分支并称git status其为未出生分支,因此 Git 本身对于正确的术语是什么有点困惑。

但是,在您的情况下,分支名称other-branch 确实存在,并指向一些现有的提交。只是分支名称指向的提交及其所有祖先会导致返回到不同的根提交,而不是与master. 所以,“不相关”可能是一个很好的术语,或者我在这里使用的“独立”,或者“不同 DAG-ged”有点技术性。


推荐阅读