我有一些包含实验工作的本地分支机构。由于与git无关的原因,我必须拥有同一个遥控器的几个工作副本。如何在不将其推送到遥控器的情况下复制其他工作副本中的本地分支?
分支不需要保持同步,即我不希望在复制分支后能够看到我的提交出现在其他工作副本中。我知道我可以将内容复制到目标工作副本中的新本地分支,但是有没有办法导入提交呢?
答案 0 :(得分:0)
编辑添加前缀注意:我想到了(由于某种原因)你正在考虑从服务器端这一切。如果您位于客户端方面,请记住,您可以克隆克隆,或使用git worktree add
制作多个工作树。如果您在一台计算机上创建多个存储库(例如,在您自己的笔记本电脑或桌边系统上),您可以git fetch
从一个到另一个:请记住Git在运行git fetch
时重命名分支的方式。你也可以git push
从一个到另一个;但请注意,git push
不会重命名任何内容。
(worktree方法对于这种用法来说更好。如果你的Git是2.6+,那就好了,因为在2.5中第一次发布git worktree
之后不久就修复了一些错误。)
如何在不将其推送到遥控器的情况下复制其他工作副本中的本地分支?
您的意思是"复制工作树内容" (在这种情况下答案是"使用存档实用程序"),或者你的意思是"复制提交" (在这种情况下,答案更复杂)?
...但是有没有办法导入提交呢?
是的:它被称为git push
。 : - )
说真的,如果您不仅获得了文件,还获得了提交,那么您就拥有了历史记录,因为历史是提交。如果您有历史记录,则可以将其存储在存储库中。如果您有存储库,也可以使用git push
来更新它。为什么不那样做?请注意,具有存储库的服务器只有该存储库的一个克隆没有约束。如果有某种理由保持一个清洁克隆"以及"测试"一个(或几个),你可以创建多个存储库。
从Git 2.5开始,您还可以使用git worktree add
为单个存储库创建多个工作树。这里的正常约束是每个工作树必须在它自己的独立分支上;但是如果你将它与裸服务器或非裸receive.denyCurrentBranch = updateInstead
服务器结合起来要小心,因为git push
的接收端只检测推送到主工作树的问题,即没有添加git worktree add
的那个。即使对额外的工作树执行updateInstead
操作也不聪明,所以他们行为不端的方式与首先强制存在receive.denyCurrentBranch
一样。
在所有情况下,请记住,分支名称只是指向提交的指针。任何一个分支都没有任何提交:许多提交通常在许多分支上。在典型的存储库中,根提交位于每个分支上。分支名称仅用于两个目的:(1)标识该分支的 tip commit (我们从中发现之前的提交),以及(2)保护tip提交和所有可提交的提交来自提示提交。 (2)中的保护来自Grim Reaper 收集器,git gc
:垃圾收集器。 git gc
的工作是从存储库中删除任何临时对象(包括临时提交),这些临时对象已经过时了。事实上可以从某个外部名称到达提交 - 任何名称都可以,因此标签也在这里计算,例如 - 表示提交是有用的,不应该被丢弃。