0

我手上有一个特殊的情况。假设我有一个名为 git_test 的 git repo。它有3个分支:

  1. 掌握
  2. 分支1
  3. 分支2

它有 2 个文件夹(dir1、dir2)和 README 文件。

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

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

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

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

TIA

4

2 回答 2

0

猜测一下(我不确定你是否给了我们足够的信息),如果branch2基于branch1那么它将包含任何内容branch1。也就是说,你可能有这种情况:

master-->branch1-->branch2

branch2如果是这样的话,那么你可以通过代替来实现你想要的master,即

        -->branch1
master-|
        -->branch2

在上述情况下,您可以通过签出branch2然后执行以下操作将其中一个更改为另一个:

git rebase --onto master branch1

这会切断branch2.branch1master

我不确定你为什么特别想这样做,但它会起作用。如果您稍后更改master(如README)中的常见内容,那么您可以简单地将所有分支重新设置为基础master以将更改合并到它们中。

于 2013-09-29T13:54:36.103 回答
0

我假设这两个分支都与 共享历史master,并且您在这里的错误是您git checkout -b branch2仍然在 branch1. 如果这不是真的,那么您需要以不同的方式解决这个问题。

因此,鉴于两者branch1并与branch2共享历史master,您可以通过以下方式修复branch2

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

这将采用引入的提交branch2并重新设置它们,以便它们派生自master. 换句话说,这git rebase将删除在 --branch1但不是在-- 中引入master的提交,并且只保留在branch2.

对于您问题的第二部分,不,没有办法告诉 Git 保留某些目录而不是其他目录。Git 处理树的提交和快照,git branch只是说“根据这个提交开始一个新的分支”。如果历史记录是完全断开的,那么您可以创建一个孤立分支——一个没有父提交的提交的分支:

$ git checkout --orphan NAME

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

但是这样做会产生一些后果。合并彼此断开的分支可能会导致许多冲突,因为 Git 不会知道某些数据是如何到达那里的,以及如何巧妙地合并数据。另一方面,如果您从不打算合并它们(例如gh-pagesGitHub 上的分支),那么保留它们就很好。

不过,我会在这里提出更多建议。首先,如果这些确实应该是具有完全独立历史的独立分支,那么您可能希望它们位于不同的存储库中。

此外,如果你在一个分支上——比如说branch10——并且想要创建一个基于 的新分支master,你可以很容易地做到这一点:

$ git checkout -b NAME master

换句话说,您可以选择使用哪个提交或分支作为您的起点。

最后,由于不清楚为什么要在不同的分支中维护目录,我建议您退后一步,检查您要完成的工作。Git 有很多可能,但选择与其优势相悖的方法会使工具更难使用,并且存储库更难共享。

于 2013-09-29T13:55:16.887 回答