2013-02-22 216 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