从特定的git分支中删除目录

时间:2013-09-29 12:05:11

标签: git version-control branch git-branch

我手中有一种奇怪的情况。说我是一个名为git_test的git repo。它有3个分支:

  1. BRANCH1
  2. BRANCH2
  3. 它有2个文件夹(dir1,dir2)和README文件。

    现在,master分支只有README文件。 branch1有dir1。 但是当我创建branch2并签出时,它同时具有dir1和dir2。 (此时我已将分支推到远程仓库)

    现在我的问题有两个部分。

    1. 如何从branch2中删除dir1? (也就是说,我希望branchN只有dirN,而不是repo中的其他目录)

    2. 在创建分支时,有没有办法在将来避免这种情况? (选择我想要包含在该特定分支中的导演(y / ies)?

    3. TIA

2 个答案:

答案 0 :(得分:0)

猜测(我不确定您是否向我们提供了足够的信息),如果branch2基于branch1,那么它将包含branch1所做的任何内容。换句话说,您可能遇到这种情况:

master-->branch1-->branch2

如果是这种情况,那么您可以通过branch2取代master来实现您想要的目标,即

        -->branch1
master-|
        -->branch2

在上面列出的情况中,您可以通过签出branch2然后执行来更改一个:

git rebase --onto master branch1

这会从branch2开始切断branch1位(不包括)并将其粘贴在master之上。

我不确定你为什么要这样做,但它会起作用。如果您稍后更改master中的常见内容(例如README),那么您可以简单地在master上修改所有分支以将更改合并到其中。

答案 1 :(得分:0)

我假设两个分支都与master共享历史记录,而且你的分支 这里的错误是你在{for} git checkout -b branch2的同时还在 branch1。如果那不是真的,那么你需要去解决这个问题 不同的方式。

因此,假设branch1branch2都与master共享历史记录,您可以 通过执行以下操作来修复branch2

$ git checkout branch2
$ git rebase --onto master branch1 branch2

这将采用branch2上引入的提交并将它们重新绑定以便它们 派生自master。换句话说,这个git rebase将丢弃提交 在branch1中引入 - 但不在master中 - 并且只保留提交 在branch2中介绍。

对于你问题的第二部分,不,没有办法告诉Git要保留 某些目录而不是其他目录。 Git处理提交和快照 树,而git branch只是简单地说“基于此开始一个新的分支 提交“。如果历史意图完全断开,那么你可以 创建一个 orphan 分支 - 一个没有父级的提交分支 提交:

$ git checkout --orphan NAME

这将创建一个新的分支,预先填充当前树。您可以 然后选择使用git rm -rf <path>删除不需要的目录。要么 使用git rm -rf .完全删除所有内容。

虽然这样做有一些后果。合并分支 彼此断开连接会导致许多冲突,因为Git不会 知道如何获得一些数据,以及如何巧妙地合并数据。如果,开 另一方面,你永远不打算合并它们(例如gh-pages分支 在GitHub上,那么他们就可以随心所欲了。

我会在这里提出更多建议。首先是如果这些 真的应该是完全独立的历史的独立分支, 那么你可能想要它们在不同的存储库中。

另外,如果你在一个分支上 - 比如branch10 - 并且想要创建一个新的分支 基于master,您可以通过以下方式轻松完成:

$ git checkout -b NAME master

换句话说,您可以选择要用作启动的提交或分支 点。

最后,因为不清楚为什么要维护不同的目录 分支机构,我建议你退后一步,检查你想要的东西 完成。在Git中有很多可能,但选择一种方法 与其优势相悖可能会使该工具更难以使用 存储库更难分享。