Git:如何在不从当前分支中删除独占文件的情况下签出

Git:如何在不从当前分支中删除独占文件的情况下签出,git,Git,下面是我在git回购中拥有的每个分支的树 [branch1] + boot - cmdline.txt - config.txt + etc - fstab [branch2] + etc - passwd - shadow - group 当我签出branch2时,将从工作树中删除branch1中的文件,反之亦然。如何在不从当前分支中删除独占文件的情况下签出分支?这是一项正常功能 您必须添加文件并提交初始分支: git add . git commit -m "he

下面是我在git回购中拥有的每个分支的树

[branch1]
+ boot
  - cmdline.txt
  - config.txt
+ etc
  - fstab

[branch2]
+ etc
  - passwd
  - shadow
  - group
当我签出
branch2
时,将从工作树中删除
branch1
中的文件,反之亦然。如何在不从当前分支中删除独占文件的情况下签出分支?

这是一项正常功能

您必须添加文件并提交初始分支:

git add .
git commit -m "hello dev of  branch 1"
要转到下一个分支:

git checkout  branch2
并将您的
branch1
合并到
branch2

git merge branch1

没有一种简单的方法可以实现您所描述的,因为它与git分支的粒度相冲突

git中的分支用于跟踪同一内容的不同发展路线。这并不是说它是唯一可能的用途——git非常灵活——但这就是目的所在,其他任何事情都可能很容易做到,也可能不容易做到

特别是,在包含不同内容的分支之间来回切换,以将合并的内容保留在工作树上,并不是一件容易做到的事情[1]

我建议您后退一步,看看为什么希望一个分支拥有密码文件,而另一个分支拥有引导目录和fstab。了解您试图解决的问题后,我们可能会建议该问题的替代解决方案,这样您就可以根据git的设计更好地使用git

至少,为了让你正在做的事情“起作用”(我在引号中加上“工作”,因为它可能会有一些奇怪的副作用),你可能会想:

  • 在每个分支上,将从该分支排除的文件添加到
    .gitignore
  • 在切换到包含不在当前分支上的文件的分支之前,您可能必须删除这些文件的工作副本。(在简单的双分支示例中,您可以使用
    git clean-x
    执行此操作,但请注意,这也会清除任何其他被忽略的工作树文件,例如随后必须重新生成的构建工件。)
  • 切换到排除当前分支上文件的分支后,将这些文件从当前分支中签出(
    git checkout HEAD@{1}--ets/fstab
    等等)
老实说,对于一个“可能在大多数时间基本上都正常工作”的解决方案来说,这听起来并不是什么有趣的事情,这就是为什么我建议您看看为什么在不同的分支上有不同的文件



[1] 如果您习惯了以这种方式使用分支的工具,那么这可能看起来很奇怪。但是如果你看一下git定义的分支的一般情况,你会发现有很好的理由说明为什么它不想做一些假设来让它变得“简单”

了解git是如何工作的

默认情况下,每个Git分支都有一个祖先,但初始主分支除外,它是所有其他分支的祖先。因此,如果任何分支只有排他的文件,而其他分支只有排他的文件,那么您应该先从分支中删除所有文件,然后向其中添加一些排他的文件

因此,如果
branch1
branch2
的祖先,并且
branch2
没有
branch1
的文件,则
branch2
被标记为不包含
branch1
的文件。因此,将
branch1
合并到
branch2
将删除
branch2
branch1
的文件。是的,合并祖先除了更新祖先的更改之外没有任何效果

尽管可以
git签出--orphan NewOrphan
,但它不能与另一个具有不同历史(祖先)的分支合并


因此,唯一的方法就是按照@EugenConstantinDinca评论中所说的那样。或者通过不删除父分支的文件来重新思考您试图实现的目标。

可能只需合并两个分支(可能合并到第三个分支上)。否则,基于git diff-p branch1..branch2 | patch的东西应该可以工作(我假设你的操作系统/工具包有一个
补丁
等等)。
git merge branch1
只是说
已经是最新的
但是没有
branch1
文件被添加到这里请复制你所有的命令行。当您在branch2时,必须键入
git merge branch1
(通过
checkout
命令)。在branch1中,获取已更新的
是正常的。当我在
branch2中时,我执行了
git签出-b branch3
,然后执行了
git合并branch1
。但是
git ls files
仅显示来自
branch2
的文件,不存在来自
branch1
的文件。现在我执行了
git签出branch1
git合并branch2
。现在,
gitls文件
没有
branch1
文件!!在每次签出或合并之前,您必须提交。安装并查看它的git命令。最初我没有阅读您的答案,因为我不理解您的行:
,因为它与git分支的粒度
进化的行
。太戏剧化了,你看?但在我给出答案后,我开始好奇地想明白你想说什么;你也这么说@neckTwi-不,事实上我不明白。这些短语并没有什么“戏剧性”,它们在表达我的意思时相当标准。另外,我们的答案肯定不一样,事实上,我认为您可能需要花一点时间更好地理解git的分支模型——因为,例如,在git中说分支有“祖先”是不正确的。我已经更正了我的短语“合并祖先”没有任何效果。既然签出的新分支与当前分支具有相同的历史记录,那么当前分支不是成为新分支的祖先吗?@neckTwi:不是。我不知道我是否不理解你的问题,因为看起来你刚刚问了我一些事情是否属实,我知道