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
)。
解决方案
到目前为止,最简单的方法是:不要。也就是说,根本不要尝试这样做,以这种方式。换一种方式。
如果你有 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-branch
git 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”有点技术性。
推荐阅读
- javascript - For循环更改传递下来的数组
- python - 如何阻止heroku dyno重启重置我的数据库
- java - 将 InfoWindow 添加到 FastPointOverlay - OsmDroid
- python-3.x - 同时更新表格
- javascript - 如何获取找到值的数组的索引
- android - Scoped Storage & MediaStore & Api 30:可以从播放列表中删除曲目,但不能添加
- python - Python 模块更改文件夹名称
- firebase - Flutter Twitter Auth 错误,缺少 InitialState
- javascript - 如何通过 XHR 请求将图像文件发送到 fastAPI
- java - H2 集成测试:在测试之间删除表不起作用