Git取代分支檔案的方法 / Replace Branch Files In Git
我通常使用TotoiseGIT工具利用Git與團隊協同開發。當我想要把自己的分支清空,全部改用別人的檔案時,可以使用以下的方法來取代自己的分支。
This article describes how to use TotoiseGIT to replace a branch’s files to another branch.
分支說明 / Branch Description
在本文的例子中會使用兩個分支(Branch)。
- Branch A:我目前所在的分支,以本地端的pudding分支為例。我不再需要該分支的所有檔案,我希望換成Branch B的檔案。
- Branch B:目標分支,以遠端伺服器上的master為例。我希望把Branch B的檔案拿到Branch A使用。
我的方法很笨,就只是單純的替換檔案而已。以下說明做法。
Step 1. 遞交Branch A / Commit Branch A
由於接下來做的事情會變動到Branch A的檔案,不論任何修改,使用Git都應該養成隨時遞交(Commit)的習慣。因此在此我們也先遞交Branch A。如果沒有任何檔案有修改的話,也可以勾選左下角的「只有訊息」(Message only),並撰寫遞交的訊息(Message)即可。
Step 2. 獲取Branch B的資訊 / Fetch Branch B
我們要在TotoiseGIT中獲取Branch B的資訊。
做法是開啟Git同步(Git Sync)。
選擇要同步的Branch B。你可以按下「…」按鈕,開啟分支瀏覽器 (Browse reference),在「/remotes/kals/master」找到我們要的Branch B。按下OK確定。
點選「獲取」(Fetch)。
如果出現藍色的「Success」訊息,表示獲取成功。
Step 3. 切換成Branch B / Checkout Branch B
我們要利用TotoiseGIT的Checkout功能,把Branch A切換到Branch B去。
在該Git專案的目錄底下按右鍵,選擇Switch/Checkout。
選擇Branch為遠端的master分支:remotes/kals/master。然後勾選建立新分支(Create New Branch)、強制切換(Force),追蹤(Track)選項保持預設。然後按下OK。
接著切換檔案,如果出現藍色的「Success」訊息,表示成功。
雖然看起來檔案沒有什麼明顯的差別,但是現在的確切換成了分支Branch B。按右鍵可以看到「Git Commit -> "master"」,表示現在的分支的確是Branch B。
Step 4. 複製Branch B的檔案到另一個資料夾 / Copy Branch B’s Files To Another Folder
接下來我建立一個資料夾叫做「kals-temp」,然後把原本資料夾「kals」裡面的檔案複製到「kals-temp」去。這樣我就可以先保留了Branch B的資料。
Step 5. 切換回Branch A / Checkout Branch A
接著我再回到「kals」資料夾,然後以類似Step 3的方法切換回Branch A,也就是本機端的pudding分支。記得勾選「強制」(Force)。
Step 6. 刪除Branch A的檔案 / Delete Branch A’s Files
然後我們不需要Branch A的檔案了,全選檔案之後,把它們統統刪除吧。
Step 7. 移動Branch B的檔案回到專案的資料夾 / Move Branch B’s Files Back To Project Folder
接著再把存放Branch B的「kals-temp」資料夾中的資料移動到專案目錄「kals」資料夾中。
現在Branch A裡面的檔案就會是Branch B的檔案了。
Step 8. 遞交Branch A / Commit Branch A
完成取代之後,再一次遞交Branch A。由於現在這個Branch A的檔案是Branch B的檔案,因此跟Step 1遞交的檔案有很大的差異。下面的檔案變動(Changes made)會列出相當多的改變。總之先保存這次的變動,遞交吧。
這樣子我們就完成拿Branch B的檔案替換到Branch A分支裡面去了的任務了。
小結:尚未摸透Git / Conclusion: Complex Git
事實上,上述這個做法看起來很愚蠢。雖然我也寫了一個簡單的Git介紹,但老實說我對於Git仍不是這麼的熟悉。分支之間檔案交換的方法還有很多種,這篇是我找到最可行的一種方式。
一般的做法都是教你使用「比較跟前面版本的差異」(Diff with previous version)。可是這種做法中,Branch A中有、Branch B中沒有的檔案,依然還會存在在替換後的Branch A中。特別是當Branch B的檔案名稱修改時,就會造成Branch A替換後出現了兩個不同名稱檔案、但是檔案內容卻一樣的問題。
不過我後來在想,是不是應該要用Rebase這個工具來取代分支檔案呢?這點我就要繼續再研究看看了。希望熟悉Git的朋友能給我一些建議吧。