2013-02-22 112 views
0

我正在使用git来管理我正在处理的存储库。新产品版本的Git分支

master分支是“主”项目。但是,我也在研究一种与主产品相似但并不相同的并行产品。它住在一个叫newproject的分支中。

两者之间的代码库非常相似,但newproject更加精简,并且有一些核心更改。然而,两个分支之间的窗口装饰材料吨,如CSS,JavaScript等是相同的。

另一方面,我删除了newproject分支中仍存在的大量文件master

我不想将这些项目重新合并到一起,就像您创建分支以添加功能或修复错误然后合并回master的分支的典型情况一样 - 这些分支将独立永久生活。

但是,我仍然想从masternewproject的任何修复程序仍然存在重叠/共享文件。

如果我只是做

$ git checkout newbranch 
$ git pull origin master 

我得到的冲突勿庸置疑,因为所有被删除的文件显示为冲突,因为他们在master仍然存在。

有没有办法处理这种情况?

+0

'git submodule'是为处理这种情况而构建的。 – jthill 2013-02-22 04:10:24

+0

@ jthill--你能更全面地解释一下吗?我明白,子模块是用于当您有主项目依赖于其他存储库时,因此您可以独立拉入这些存储库并使其保持最新状态。我不明白这是如何适用的。 – user101289 2013-02-22 06:04:53

回答

0

在您分支之后,您将能够在新项目分支上执行git rebase master以将其分隔点移动到主分支的HEAD。这将做的是重新应用所有的差异(这将是非常容易的,可能没有大的冲突(如果有的话,因为大多数文件不在newproject分支中),与newbranch顶部的分离点对主分支做出的更改。由于newproject提交包括删除这些文件和其他更改,因此一切都应该顺利进行(希望不会有太多冲突)。查看链接到这里的事实上的git书下列出的rebasing info

+0

@ g19fanatic--谢谢 - 然而,我试了这个并得到了 '$ git rebase master'''致命的:需要单个修订版' '无效的上游主' – user101289 2013-02-22 04:04:15

1

git子模块实现的效果正是你想要的:多个项目所依赖的通用代码体,修复了所有相关项目之间共享的通用代码。子模块通过分离共享代码的历史记录来实现效果,但这只是机制 - 一旦你看到它,你就会明白这是自然而然的正确解决方案。

子模块命令本身用于跟踪一些挑剔的内务细节(通常,您可以在回购库中使用rm -rf *并且不会丢失任何提交状态,但嵌套回购并非如此,因此该命令通常会提升子模块.git目录;像这样的东西),但子模块本身不过是一个嵌套的存储库和自己的历史。如果你进入它,git命令甚至不知道它是任何东西的子模块,因为它们不必关心:作为子模块就是回购的使用方式,而不是回购本身固有的任何东西。

git init projectA 
    cd projectA 
    touch A   # now there's a file at the projectA root, 
        # but the projectA repo doesn't know about it 
    echo 'this content is in file "A" at the projectA root'> A 
    git add A   # content recorded, the index points to it 
    git commit -m'A' # now projectA repo has a permanent record of the indexed state 


    git init projectInner # now there's an entire repo at the projectA root, 
         # but the projectA repo doesn't know about it 
    cd projectInner 
    echo "Inner content" > Inner # a file at the inner repo, no repo knows about it 
    git add Inner     # content recorded, the inner repo's index records it 
    git commit -mInner    # the inner repo has a permanent record 


    cd .. 
    git add projectInner # now the projectA repo knows about the inner, the content is recorded ... 
    git commit -mInner  # and now the projectA repo has a permanent record 

git add荷兰国际集团的实际回购装置记录其当前状态,正如用于添加一个文件或目录,但同时的文件的记录状态是它的全部内容,和一个目录的记录状态是所述所有(被跟踪的或未被忽略的)内容的递归状态,回购的记录状态只是它的HEAD提交的SHA - 其他所有内容已经被记录在回购本身中。

这里的负载是一个git子模块只是一个嵌套回购,事实证明嵌套回购可能是一个非常有用的东西。与git的其余部分一样,子模块命令实际上做的是非常简单的,所有这些显而易见的复杂性都是在所有不同的情况下实现最方便的方式,在这种情况下它非常有用。

+0

非常感谢您的详细解释! – user101289 2013-02-22 20:55:37