Git:如何检出而不从当前分支中删除独占文件

时间:2018-11-13 12:29:15

标签: git

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

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

[branch2]
+ etc
  - passwd
  - shadow
  - group

当我结帐branch2时,branch1中的文件将从工作树中删除,反之亦然。如何在不从当前分支删除独占文件的情况下签出分支?

3 个答案:

答案 0 :(得分:0)

这是正常功能。

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

git add .
git commit -m "hello dev of  branch 1"

转到下一个分支:

git checkout  branch2

并将您的branch1合并到branch2

git merge branch1

答案 1 :(得分:0)

没有一种简单的方法可以执行您描述的操作,因为它与git分支的纹理背道而驰。

git中的分支旨在跟踪同一内容的不同演变路线。这并不是说这是唯一可能的用法-git非常灵活-但这是目的,其他任何事情可能也可能不容易做到。

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

我建议您退后一步,看看为什么要一个分支具有密码文件,而另一个分支具有引导目录和fstab。了解您要解决的问题之后,我们也许可以为该问题提供替代解决方案,以便您可以在其设计中更多地使用git。

至少要使您正在做的事情“工作”(并且我将“工作”加引号,因为它可能会有一些古怪的副作用),您可能想要:

  • 在每个分支上,将该分支中排除的文件添加到.gitignore
  • 在切换到包含当前分支上未包含文件的分支之前,您可能必须删除这些文件的工作副本。 (在简单的两分支示例中,您可以使用git clean -x来执行此操作,但要注意,这还会清除其他所有被忽略的工作树文件-例如必须重新生成的构建工件。)
  • 切换到排除当前分支上文件的分支后,从当前分支中检出那些文件(git checkout HEAD@{1} -- ets/fstab,依此类推)

老实说,对于“大多数情况下基本上都能正常工作”的解决方案来说,这听起来并不那么有趣,这就是为什么我建议改为查看为什么在不同分支上有不同文件的原因。


[1]如果您习惯使用以这种方式使用分支的工具,这似乎很奇怪。但是,如果您查看git定义的分支的一般情况,您将意识到有充分的理由为什么它不想做出使这“容易”的假设。

答案 2 :(得分:-1)

了解Git的工作原理!

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

因此,如果branch1branch2的祖先,并且branch2没有branch1的文件,则branch2被标记为不包含文件branch1中的。因此,将branch1合并到branch2将删除branch1branch2的文件。是的,合并祖先除了更新祖先的更改外没有其他作用

尽管一个人可以git checkout --orphan NewOrphan,但是它不能与具有不同历史记录(祖先)的另一分支合并。

因此,唯一的方法就是评论中的 @EugenConstantinDinca 。或通过不删除父分支的文件来重新考虑要实现的目标。