後記:寫一寫覺得這個系列對初學(xué)者可能不太容易了解… XD 要寫出簡單易懂的說明還真是需要花點功夫,想想拖稿太久還是作罷。 用 Git 就是要愛用 Branch 啊,Branch 很好用,開 Branch 不用錢。開 Branch 的情境除了在上一篇中提到因應(yīng)產(chǎn)品 release 需求的 stable/production branch 之外,其他開 branch 情況有:
這些事情都可以先在本地開 local branch 做,而不需要立即 Push 分享給別人。
開 Branch 最大的好處除了可以不影響 stable 和其他分支版本的開發(fā),另一個超棒的地方是”你可以決定 Merge 的方式”。Git 的 Merge 方式可以分成四種:
其中 rebase 比較難理解會在下一篇再詳述:
使用 merge 可能會有部分程式碼會 conflict 衝突:簡單的情況只要編輯檔案處理 <<<< ===== >>>>> 即可,然後重新 add 到 staging area 並 commit (沒有像 SVN 的 resolve 指令)。複雜一點的可以再用 git mergetool 選檔案合併的 GUI 工具 (OS X 下面可以用 opendiff, linux 可以用 kdiff3 ),處理好後 git commit。 一旦 merge 好了,git branch -d <branch_name> 可以刪除 branch。但如果要刪除的 branch 還沒有合併,就會有錯誤訊息。如果真的要強制刪除可以用 -D Git 的 working tree 是從 SVN 換過來一個不習(xí)慣的地方,因為它只是一個工作暫存區(qū),在切換 Branch 時就會整個換掉。也因為如此,如果有檔案有修改還沒有 commit 出去,切換 branch 時就會出現(xiàn) error 不能切換 (除非是新的 untracking 檔案),例如有修改還沒 add 會出現(xiàn) error: Entry ‘ooxx’ not uptodate. Cannot merge. 有修改且已經(jīng)add(還沒ci)會出現(xiàn) error: Entry ‘ooxx’ would be overwritten by merge. Cannot merge. 最理想的處理當(dāng)然是事情剛好做到一個段落,把東西 commit 出去才切換 branch 做事。不過事情總有臨時,如果要換 branch 的暫時的解決方式是使用 git stash 會先把修改暫存下來,要回復(fù)則執(zhí)行 git stash pop。下一篇等你學(xué)會 git reset 之後,你會發(fā)現(xiàn)就算把還沒完成的東西 commit 也不會怎麼樣,只要還沒 push 出去一切 commit 紀(jì)錄都是可以改的。 Remote repo. 操作首先要認(rèn)識的是 Protocol,像在 Github 上面看自己的 Project,會有分 Public Clone URL 跟 Your Clone URL,這有什麼差?
其中 Github 就是同時用 SSH + Git protocol,兼顧認(rèn)證需求及速度。
git pull 要注意的是,如果別人在你上次 pull 之後有 push 新東西上去(也就是說跟你的 branch 產(chǎn)生分岔了),此時有兩種情況: 一是 Git 可以順利 auto merge 的話,git 會自動多一次 merge commit,這也就為什麼常常 log 會跑出 Merge branch ‘master’ of git@foobar.com。二是如果有 conflict,這時候就需要你手動處理然後 commit。話說如果覺得這種 local branch 和 remote branch 的 merge commit log 很煩,建議可以改使用 git pull –rebase 指令來變成 fast-forward 形式 (就會變得像 svn up,而不會有 merge commit log)。rebase 的意思可能要下一篇才會詳細(xì)說明的清楚,簡單的說(?),就是先砍掉 local branch 分岔點之後自己的 commit,然後把遠(yuǎn)端的 commit 先一個個 apply 進(jìn)來,最後再把自己的 commit 再 apply 進(jìn)去 (如果有 conflict 會中途停下來,等你修好才會繼續(xù) apply),如此一來看線圖就會變成一條線而已,也就沒有所謂 merge 這個動作了。 git push 預(yù)設(shè)的遠(yuǎn)端是 origin,並且會將所有有和 remote 有對應(yīng)的 local branch 都 push 上去。如果要把新的 local branch push 上去,需要下 git push origin <local_vranch_name> 指令。 git push 也可能會失敗,例如出現(xiàn) ! [rejected] master -> master (non-fast forward),這個 non-fast forward 的意思是你的 parent commit 和遠(yuǎn)端的不相同,也就是線圖有分岔,需要先 pull 回來處理好 merge 才能 push 上去。 fast-forward 在 Git 是一種 merge 術(shù)語,當(dāng) B branch (例如一個 local branch) 是從 A branch (例如一個 remote branch) 的最新版(HEAD)分支出來的,那當(dāng) A 要把 B merge 進(jìn)來時,因為 B 的 parent commit 是 A 的 HEAD,所以這兩個 branch 唯一的差異就是 B 後來的 commit 而已,而不會有任何 conflict。所以實際上的動作只要把 A 的 HEAD 改成 B 的 HEAD 就好了,線圖上這兩個 branch 根本是同一條線,此謂 fast-forward。 其他操作還有:
因為遠(yuǎn)端的操作指令比較雜,所以也有人寫了 git_remote_branch 來簡化操作。 |
|