2013-09-29 66 views
0

我手中有一个特殊的情况。假设我有一个名为git_test的git repo。它有3个分支:从特定的git分支中删除一个目录

  1. BRANCH1
  2. BRANCH2

而且它有2个文件夹(DIR1,DIR2)和README文件。

现在,master分支只有README文件。 branch1有dir1。 但是,当我创建分支2并签出时,它有dir1和dir2。 (此时我已将分支推向远程回购)

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

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

  2. 有没有办法在分支创建本身时避免这种情况? (选择我想在那个特定的分支包括董事(Y/IES)?

TIA

+0

据我所知git不跟踪目录只是文件?如果删除它的内容,该目录可能会消失。 – Croo

+0

但我不希望该目录远离回购。我希望该目录远离当前分支。就像在不同分支中维护不同的目录 –

+1

也许你正在做一些根本错误的事情。为什么你需要在不同分支中维护不同的目录。那个目录的内容是什么? – robert

回答

0

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

因此,考虑与masterbranch1branch2份额历史,你可以 做修复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不会知道如何到达那里的一些数据,以及如何巧妙地合并数据。另一方面,如果在 上,你从不打算将它们合并(例如GitHub上的gh-pages分支机构 ),那么它们就很适合保留。

虽然我会在这里提出几点建议。首先,如果这些 确实应该是完全独立的历史记录的独立分支,那么您可能希望它们位于单独的存储库中。 -

另外,如果你在一个分支说branch10 --and要创建一个基于master一个新的分支 ,你可以做到这一点很容易:

$ git checkout -b NAME master 

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

最后,由于不清楚为什么你想维护不同目录在不同的 分支机构,我建议你退后一步,并检查你想要完成的任务。在Git中有很多可能的情况,但是选择违背其优点的方法会使工具更加难以使用,并且存储库难以共享。

+1

至于什么是试图完成它的问题很简单。我只是想了解什么是可能的,哪些不是,以及是否有更简单的方法,而不是在git add中有选择地添加目录。是的,这里的目的是区分分支上的练习代码和主应用程序代码,所有这些都在相同的回购站下。 –

+0

@glnarayanan太棒了!绝对是实验。在开发工作流程中,您需要从'master'或其他集成分支(有些人使用一个名为'develop')创建主题分支。 'git co -b BRANCH_NAME STARTING_POINT'表格非常棒,因为即使您目前位于不同的分支上,您也可以从正确的位置启动分支。 – jszakmeister

+0

这帮了很多。感谢您帮助我在这里:) –

0

在猜测(我不知道你已经给了我们足够的信息),如果branch2 。基于branch1那么它将包含任何branch1确实换句话说,你可能有这种情况:

master-->branch1-->branch2 

如果是这样的话,那么你可以达到你想要的东西通过master基础branch2相反,即

 -->branch1 
master-| 
     -->branch2 

在上述的情况下,可以通过检查branch2,然后执行改变一个到另一个:

git rebase --onto master branch1 

这从branch1起切断的branch2位(独家)并将其粘贴在master之上。

我不确定你为什么要这样做,但它会工作。如果您稍后更改master(如README)中的常见内容,则您可以简单重新绑定master上的所有分支以将更改合并到它们中。

+0

现在就试试吧! –