文章基于Mac版本的git操作.
關(guān)于 git.
- 之前一直使用SVN, 開(kāi)發(fā)個(gè)人項(xiàng)目時(shí)會(huì)使用GitHub Desktop, 筆者基于這一年里的git使用體會(huì)為有需要的同學(xué)們提供一些建議.
- 對(duì)筆者而言, SVN更像是一個(gè)文件共享工具, 整個(gè)團(tuán)隊(duì), 包括產(chǎn)品原型, UI切圖和代碼等等的共享工具. git更適合于單純代碼方面的管理, 包括個(gè)人的代碼開(kāi)發(fā)管理和幾個(gè)人之間的團(tuán)隊(duì)協(xié)作.
- git工具的使用很簡(jiǎn)單, 因?yàn)槠匠i_(kāi)發(fā)用得上的語(yǔ)法很少, 不過(guò)對(duì)于完全不了解的同學(xué), 初次使用還是會(huì)覺(jué)得很陌生.
- 首先git工具是用來(lái)做代碼管理和協(xié)作開(kāi)發(fā)的. 你可以把你的開(kāi)發(fā)代碼放到遠(yuǎn)程的GitHub倉(cāng)庫(kù)里(GitHub的私有倉(cāng)庫(kù)是需要付費(fèi)的, 相對(duì)的公開(kāi)倉(cāng)庫(kù)則免費(fèi), 如果你不介意把代碼共享給大家). 每次到了一定的開(kāi)發(fā)階段就把自己的新代碼提交到遠(yuǎn)端的倉(cāng)庫(kù)(比如做一天的開(kāi)發(fā)任務(wù)之后提交, 又比如做一段有影響的代碼之前提交, 這個(gè)就看個(gè)人的判斷了). 這個(gè)功能點(diǎn)上可以理解成云儲(chǔ)存功能.
- git可以建立許多的分支, 每個(gè)分支下開(kāi)發(fā)不同的功能, 或者是不同的人開(kāi)發(fā)不同的分支. 不同的分支之間可以靈活切換, 合并. 分支也可以打上tag(標(biāo)簽)或者回滾, 總之我目前需要的功能他都有了. 這個(gè)功能點(diǎn)上其實(shí)和SVN是類似的.
關(guān)于日常 git 使用.
- 使用git前需要在本地初始化git, 即git init. 然后需要設(shè)置與GitHub倉(cāng)庫(kù)的連接, 有HTTPS和SSL兩種方式, 這方面請(qǐng)參考其他文章.
- 1 假設(shè)已經(jīng)存著遠(yuǎn)端倉(cāng)庫(kù),打開(kāi)終端terminal使用clone命令拉取遠(yuǎn)端倉(cāng)庫(kù). 輸入下方命令, 按照提示輸入密碼, 選擇文件夾等. HTTPS 和 SSH 地址在GitHub 項(xiàng)目里面的綠色 Clone or download 按鈕.
git clone 項(xiàng)目地址(可以使用 HTTPS 或者 SSH 連接方式) - 2 接下來(lái)是主要講的日常操作. 當(dāng)你完成了一個(gè)功能或者一天的工作需要提交的時(shí)候. 打開(kāi) terminal, 進(jìn)入項(xiàng)目文件夾并輸入下面的命令.
git add . //把所有修改的文件加入追蹤庫(kù),當(dāng)然你也可以單獨(dú)選擇部分文件
git commit -m "注釋" //提交到本地并注釋
git push origin issue1 //提交到遠(yuǎn)端, issue1 是遠(yuǎn)端分支名
這三句可能是日常中用到的最多的語(yǔ)句, 添加 - 提交. - 3 如果你在不同的分支開(kāi)發(fā), 或者合并其他的分支時(shí),就需要切換分支. 例如從 issue1分支切換到 issue2 分支.
git checkout issue2 //切換到 issue2 分支 - 4 如果多人開(kāi)發(fā), 需要合并他人的分支的時(shí)候(比如我本地的 issue2 需要合并遠(yuǎn)端的 issue3 ). 我的做法是先新建一個(gè)和遠(yuǎn)端需要合并的分支名字相同的分支(這個(gè)新建的分支是以本地的 issue2 為基礎(chǔ)新建的, 所以合并前是和 issue2 一模一樣的, 相當(dāng)于復(fù)制了 issue2), 然后拉取遠(yuǎn)端分支和新建的分支合并, 解決完沖突之后再合并到本地分支當(dāng)中.
git branch -a //查看所以的分支, 包括本地分支和遠(yuǎn)端分支
git checkout branch -b issue3 //以當(dāng)前分支為基礎(chǔ)新建名為 issue3 的分支并切換到 issue3, 這里是以 issue2 為基礎(chǔ)新建 issue3
git pull origin issue3 //拉取遠(yuǎn)端的 issue3 分支和本地的 issue3 分支進(jìn)行合并, 這時(shí)可能會(huì)提示有沖突, 有沖突時(shí)需要解決沖突
git add . //解決完 issue3 的沖突之后再提交到本地
git commit -m "注釋" //需要先 commit 之后才可以切換分支
git checkout issue2 //切換到 issue2 分支
git merge issue3 // 把解決完沖突的 issue3 分支合并到當(dāng)前分支 issue2
這時(shí)候的 issue2 就已經(jīng)是合并完線上的最新的代碼了, 接下來(lái)在按照正常的程序 push 上去就行了. 合并時(shí)也可以先 fetch 再 merge , 就是先把遠(yuǎn)端的拉下來(lái)不合并, 再通過(guò) merge 命令進(jìn)行合并. 上邊的 pull 其實(shí)是 fetch 和 merge 的集合, 拉取遠(yuǎn)端并直接合并.
關(guān)于協(xié)同開(kāi)發(fā).
協(xié)同開(kāi)發(fā)最難的是代碼庫(kù)的管理和代碼的合并. 我通常是這么做的:
- master 分支, master 分支是主分支, 每個(gè)上線版本都會(huì)合并到 master 分支上, 并打上 tag. master 分支僅由負(fù)責(zé)人進(jìn)行管理.
- develop 分支, 由 master 分支切出來(lái)的 develop 分支是開(kāi)發(fā)的主分支, 每個(gè)開(kāi)發(fā)人員完成自己的任務(wù)之后都會(huì)拉取 develop 分支進(jìn)行合并, 解決沖突之后再提交到 develop 分支上.
- 個(gè)人分支, 比如我叫 ken, 我就從 develop 分支上切出一個(gè)名為 ken 的分支作為我個(gè)人的主分支.
- issue分支, 用來(lái)管理單獨(dú)的功能代碼, 一般采用 issueX 的命名, issue 和 GitHub 庫(kù)的 issue 對(duì)應(yīng). 比如我需要 code 網(wǎng)絡(luò)層的代碼, 我就在 GitHub 倉(cāng)庫(kù)建立一個(gè) issue4, 然后本地以 ken 分支為基礎(chǔ)建立一個(gè) issue4 分支.
我的習(xí)慣是會(huì)頻繁的更新個(gè)人分支, 在 issue 分支的小階段完成后或者大改之前會(huì)把 issue 分支合并到 ken 分支. 等 issue 穩(wěn)定之后會(huì)合并到 ken 分支,再合并到 develop 分支. 以此保證每個(gè)功能, 每個(gè)開(kāi)發(fā)人員代碼的獨(dú)立, 以及 develop 分支的穩(wěn)定.
還有一點(diǎn)就是每個(gè)人盡量只改動(dòng)自己的部分, 需要修改其他人的部分之前如果有可能最好先溝通, 特別是 xib 以及 storyboard. 這樣可以減少90%以上的沖突, 特別是難以用沖突工具解決的沖突.