2013-09-29 73 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

現在就試試吧! –