2012年12月20日 星期四

[git][merge]實際操作,合併與他人做的專案

我是個初學者,但我一直連最簡單的合併都做不好,一直以來我有個問題是想要將同事寫的與我寫的合併在一起。其實這個問題我在網路上問了兩次,結果兩次都領悟不出來網友說的merge觀念...慚愧..,終於...今天我像是被電到一樣突然想通了,其實道理也是很簡單--branch的parent一定要同一個(分支要由同一條主線分出來就對了!),此方法適合與未使用git的人合併專案。



作法:
由master分支出來兩條線分別是develop1及develop2,分別開發後,再由master去merge develop1、 merge develop2 。就這麼簡單...如果有份檔案都有被develop1及develop2改過
(譬如說有個.txt檔,develop1裡的內容修改為123;但是develop2修改內容為456),就會產生conflict,這時再開檔案修改你要的結果)

千萬不要這麼merge,否則你就會犯我犯過的錯誤:
假設你要與同事合併,你千萬不要將你開發完後的develop合併回主線(master),再開分支others(此分支會是最新版的master,接下來的合併就沒意義了),將同事的檔案覆蓋上去,然候再合併回主線,會發生合併後的檔案完完全全的是你同事的檔案,你的修改檔案都不見了。

正確作法應該是:
假設你要與同事合併,你目前的develop不要動(也就是不要合併回主線,不要讓主線為你的最新版本),切到主線並且開一條分支others,將你同事的檔案覆蓋上去,然候回主線(master),分別merge develop(你的)及merge others(他的),這時有共同檔案被修改過(也就是前面舉的.txt檔的例子),就會產生conflict,如果你與他有額外新增的檔案,都會共同地存在。

實作練習:

課前提示:
目前位置 : master
檔案 : t1.txt  t2.txt  t3.txt
操作說明 : 別管虛線,那是為了方便區別正在做的步驟而已,只要照著指令順序做完它:)

開始你的開發 :
-------------------------------------------------------------------------你的檔案↓----
git checkout -b develop  新增一個分支
              ↓(修改了t1 t2 t3內容並增加了t4.txt)
git add .
git commit -a -m "develop OK"      放進stage並且commit
              ↓(如果要與同事做好的檔案合併(假設同事未使用GIT)
-------------------------------------------------------------------------你的檔案↑----
-------------------------------------------------------------------------他的檔案↓----
git checkout master     切到主線
git checkout -b others    新增一條同事的分支(這時候的檔案是master的t1 t2 t3,跟develop剛修改的完全沒有關係)
             ↓(修改檔案(修改了t1 t2 t3內容並增加了t5.txt)
git add .
git commit -a -m "others OK"          放進stage並且commit
-------------------------------------------------------------------------他的檔案↑----
-------------------------------------------------------------------------合併你跟他的檔案↓---
git checkout master   切回主線
git merge develop      合併develop,這時master的資料全是develop的了
git merge others         再合併others,這時候因為develop跟others同時有修改t1 t2 t3的檔案,所以產生了conflict,但是develop新增t4與others新增的t5因為沒有重覆到,所以不影響它們
            ↓(修改t1 t2 t3產生的conflict,打開這三個檔案修改成你要的結果)
git add .
git commit -a -m "merge OK"         放進stage並且commit
            ↓
結束,打完收工。
(這時候master的檔案是修改conflict後的t1、t2、t3及develop的t4與others的t5)

註 : 產生的conflict

-------------------------------------------------------------------------合併你跟他的檔案↑---

合併完後刪除develop及others,然候再建一條新的develop繼續開發


---

沒有留言:

張貼留言