我有一个带有孤立分支的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
)。
答案 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 add
和git 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-tree
,git commit-tree
,git branch
以及其他命令,在其他分支或树中的任何位置创建提交想做。