如何在没有签出的情况下在另一个分支中提交?

时间:2020-01-16 02:49:39

标签: git

我有一个带有孤立分支的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)。

2 个答案:

答案 0 :(得分:0)

到目前为止,

最简单的方式是:不。也就是说,根本不要这样尝试。用另一种方式做。

如果您的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创建一个 new 工作树,如下所示。这个新的工作树是全新的,因此没有可以覆盖的文件。新的工作树也获得了新的索引,因此覆盖主工作树(位于分支master上的主工作树)的索引/工作树对完全独立于新索引/ work-tree对的另一个分支。

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

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


1 “孤立分支”不是一个好名词,因为Git专门使用它来谈论您在一个不存在的分支名称上的设置,该设置是通过运行{ {1}}。从该状态提交后,该名称就不再是“孤儿”。 git gc命令将其称为 orphan分支,而git checkout --orphan将其称为 unborn分支,因此Git本身对于正确的词是。

但是,在您的情况下,分支名称checkout 确实存在,并且指向一些现有的提交。只是分支名称指向的提交及其所有祖先导致回到不同的根提交,而不是与git status的最短提交共享的根提交。因此,“无关”可能是个好词,或者像我在这里使用的“独立”一样,或者“不同DAG-ged”可能有点技术性。

答案 1 :(得分:0)

听Torek:不要这样做!

为了提供信息,可以根据您的操作,使用git write-treegit commit-treegit branch以及其他命令,在其他分支或树中的任何位置创建提交想做。