iOS開發之進階篇(3)—— 版本控制

前言

本文僅簡單討論代碼的版本控制, 包括版本提交、分支、遠程倉庫的拉取/推送、版本回退等, 不探討Git指令, 不涉及多人協作, 更多的是客戶端使用過程的記錄.
分別使用Sourcetree和GitHub客戶端實現對代碼的版本控制, 兩者操作起來都差不多, 故分別用於演示管理本地倉庫和遠程倉庫. 遠程倉庫需要服務器來儲存項目代碼, 自從微軟收購GitHub後, 對私有項目也開放免費了, 所以遠程客倉庫的拉取/推送操作將使用GitHub客戶端來演示.

所謂倉庫, 可以理解成一個項目, 或者是這個項目對應的文件夾.

本地倉庫 (使用Sourcetree)

Sourcetree客戶端下載地址https://www.sourcetreeapp.com/

1. 創建本地倉庫

新建一個文件夾LocalRepository, 裝入一個文件README.md, 隨便填入初版信息:

file_readme.png
打開Sourcetree客戶端, 創建本地倉庫

sourcetree_create.png

指定剛纔創建的文件夾

sourcetree_create2.png

成功創建倉庫, 右邊數字代表修改量

sourcetree_create3.png

雙擊進入主界面

sourcetree_commit.png

勾選待定的文件(表示放入暫存區), 填入版本記錄信息, 然後提交, 這時歷史版本中就有版本記錄了.

sourcetree_histories.png

2. 新增版本

我們回到剛纔的README.md文件, 新增一行信息:

file_readme2.png

然後我們看到Sourcetree中文件狀態裏新增了未保存的修改:

sourcetree_file_status.png

勾選文件, 填入版本記錄信息"下雨了", 然後提交:

sourcetree_commit2.png

可以看到歷史中有了版本記錄:

sourcetree_histories2.png

討論
至此, 我們已經完成了第一次版本迭代. 但是有個問題, 本次修改版本是直接在主分支master上面進行的, 而master應該用於儲存可發佈的穩定版本, 不應直接供給開發階段使用.
實際開發中, 我們應先分離出一個分支進行開發, 調試無誤後再合併到master進而發佈. 這樣即可以防止多人協作同時對master進行操作造成衝突, 同時又可以分出多個分支進行多功能"並行"開發.
假設這樣一種情況:

當我們在master上直接開發新功能, 開發到一半的時候發現原來的代碼有bug, 這時候我們只有兩種選擇: 要麼寫完另一半功能再去調試bug, 要麼遺棄現有的一半功能代碼去調試bug. 這種做法好比是"線程阻塞式"的, 似乎不符合我們的需求. 那麼, 此時分支可以閃亮登場了. 創建一個分支去開發這個新功能, 此時我們會有兩個分支: master和新功能分支. 當我們在功能分支上開發到一半的時候發現原來代碼有bug, 我們可以切換到master分支去, 另創建一個臨時分支用於修復bug, bug修復後將臨時分支合併到master用於發佈更新, 功能分支調試無誤後也合併到master, 最後形成穩定的代碼版本.

我們之所以能在各分支之間隨意切換, 是因爲分支之間的版本管理是相互獨立的, 詳見下節.

3. 分支

這個例子的流程如下:

當發佈"下雨了"這個版本後, 我們新建一個買菜分支去買魚和豆腐, 買完魚後纔想起家裏沒有關窗 (代碼有bug). 這時我們可以切換到master, 把窗關上(bug修復), 然後重新切回買菜分支, 繼續買豆腐, 然後回到家裏 (稱爲合併).

新建分支

點擊"分支"按鈕, 或者直接在指定版本上右擊選擇分支…

sourcetree_branch.png

選擇指定節點, 起名買菜

sourcetree_branch2.png

然後我們看到分支那裏, 多了"買菜"這個分支:

sourcetree_master&買菜.png

這時候當前分支已經切換到買菜這裏了, 以後的修改將只對當前分支有效. 要想切換分支, 雙擊分支中的分支名即可.

返回我們的工程項目文件夾LocalRepository, 新增一個買菜文件:

file_買菜.png

然後看到文件狀態那裏有更新, 我們將這個提交一個版本, 備註買魚, 提交到"買菜"分支 (此時我們正處於這個分支上):

sourcetree_買菜_file_status.png

然後點擊歷史, 查看版本記錄:

sourcetree_histories3.png

切換分支
此時, 買菜分支比master超前了一個版本(買魚版本).
我們可以驗證下, 在分支中雙擊master切換到主分支, 此時我們的項目文件夾LocalRepository下買菜文件沒有了:

file_master.png

而切換回買菜分支, 又出現了買菜這個文件:

file_買菜.png

現在我們切換回master, 新建一個temp分支去修復bug (關窗), 過程和新建買菜差不多, 就只貼關鍵步驟了. 在temp分支裏關窗:

file_關窗.png

然後temp和買菜分支各有一版不同的修改, 且都超前於master: temp多了"關窗"版本, 而買菜分支則多了"買魚"版本:

sourcetree_temp.png

合併分支
現在bug修復了, 我們將temp合併到master裏去.
我們要將某個源分支合併到某個目標分支上, 需要到目標分支上進行操作. 比如我們要把temp的關窗版本合併到master, 需要切換到master中, 然後右擊關窗版本選擇合併:

sourcetree_合併.png

sourcetree_合併_確認.png

刪除分支
已經生成穩定版本了, 現在可以把temp分支刪除了:

sourcetree_delete.png

sourcetree_delete_確認.png

好的, bug修復了, 我們切換回買菜分支, 繼續買豆腐:

file_買豆腐.png

sourcetree_買豆腐.png

sourcetree_histories5.png

OK, 現在可以回家了. 將買菜分支合併到master.

過程不再重複, 直接看結果:

sourcetree_histories6.png

4. 版本回退

我們在master上疊加兩個新版本進行測試:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-x6za7TKI-1591860419618)(https://upload-images.jianshu.io/upload_images/8900795-f2864101dea16252.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

如果我們想回退到天晴了這個版本, 可以右鍵選擇重置到這次提交:

sourcetree_rollback.png

然後有三種重置方式供我們選擇:

sourcetree_merge_mode.png

軟合併和混合合併都不會刪除開窗版本的內容, 都是變成天晴了版本提交之後開窗版本提交之前的狀態. 不同的是, 軟合併會將這些修改添加到已暫存區, 而混合合併則還在未暫存區.
強行合併則是丟棄整個開窗版本, 項目文件夾內容變成天晴了這個版本.

暫存文件
我們提交的時候, 只會將暫存文件的內容進行提交記錄. 所以我們修改了內容之後, 要確保想要提交的內容放到已暫存文件, 否則提交的時候不會記錄該修改內容.

軟合併
不會刪除開窗版本的內容, 只是將開窗版本的修改置爲未提交狀態

sourcetree_軟合併.png

file_軟合併.png

修改的內容被默認添加到已暫存文件區:

sourcetree_軟合併_文件狀態.png

混合合併
和軟合併唯一不同點是, 修改的內容還在爲暫存文件區. 這時如果我們點擊選中未暫存文件, 則會被添加到已暫存文件, 這就和軟合併一樣了.

sourcetree_混合合併_文件狀態.png

強行合併
丟棄開窗版本, 內容變成天晴了版本內容:

sourcetree_強行合併.png

file_強行合併.png

5. Sourcetree&Git部分名詞解釋

摘自https://www.cnblogs.com/fisherbook/p/11397168.html

克隆(clone):從遠程倉庫URL加載創建一個與遠程倉庫一樣的本地倉庫
提交(commit):將暫存文件上傳到本地倉庫(我們在Finder中對本地倉庫做修改後一般都得先提交一次,再推送)
檢出(checkout):切換不同分支
添加(add):添加文件到緩存區
移除(remove):移除文件至緩存區
暫存(git stash):保存工作現場
重置(reset):回到最近添加(add)/提交(commit)狀態
合併(merge):將多個同名文件合併爲一個文件,該文件包含多個同名文件的所有內容,相同內容抵消
抓取(fetch):從遠程倉庫獲取信息並同步至本地倉庫
拉取(pull):從遠程倉庫獲取信息並同步至本地倉庫,並且自動執行合併(merge)操作,即 pull=fetch+merge
推送(push):將本地倉庫同步至遠程倉庫,一般推送(push)前先拉取(pull)一次,確保一致
分支(branch):創建/修改/刪除分枝
標籤(tag):給項目增添標籤
工作流(Git Flow):團隊工作時,每個人創建屬於自己的分枝(branch),確定無誤後提交到master分枝
終端(terminal):可以輸入git命令行

遠程倉庫 (使用GitHub)

如果只需要上傳代碼到GitHub而不涉及後續修改迭代, 那麼使用網頁就夠了.

1. 上傳 (Push)

註冊GitHub賬號, 在右上角點擊+號創建遠程倉庫 (保存在GitHub):

newRepository.png

選擇public表示公開, 任何人可見; 選擇private則自己可見, 也可設置成指定人可見. 一般項目都會帶有一個自述文件(README.md)用於描述項目以及使用方法等.

firstCommit.png

點擊Upload files以上傳代碼文件:

view1.png

直接拖動文件到窗口或者點擊選擇上傳:

HelloWord.png

例子中文件內容爲一個HelloWord文件夾, 然後裏面有個版本記錄的文本文件:

localFile.png

因爲初版內容相對於原始空內容來說也是一種修改, 所以上傳完成後GitHub會提示我們提交這個修改:

commit.png

然後返回項目首頁, 發現這個文件夾已經上傳成功了:

view2.png

2. 下載 (Pull)

點擊克隆或者下載按鈕, 可以直接下載壓縮文件ZIP:

download.png

解壓後就會看到我們的HelloWord文件以及README文件:

download2.png

3. GitHub客戶端

如果要克隆遠程倉庫到本地, 在本地修改內容後push同步到遠程倉庫, 那麼最佳方案就是下載GitHub客戶端.

下載地址: https://desktop.github.com/

克隆遠程倉庫到本地

克隆遠程倉庫到本地. 點擊克隆和下載按鈕, 選擇Open in Desktop進行克隆:

clone

克隆完成後就在我們指定的本地文件夾看到HelloWord文件夾和README文件了:

file_HelloWord.png

push

我們在本地修改README文件:

file_README.png

然後GitHub客戶端有提示有新的修改:

desktopCommit.png

我們提交這個修改, 備註等外賣. 注意, 此次提交僅記錄在本地, 如果需要同步到遠程倉庫, 需要進行push推送操作.
點擊History版本記錄, 將指定版本push到遠端. 點擊上傳箭頭:

desktopPush.png

然後我們查看網頁端, HelloWord項目已經有更新了:

view3.png

pull

相反地, 我們在GitHub網頁 (遠程倉庫) 修改內容, 然後拉取同步到本地.

pull1.png

pull2.png

pull3.png

然後打開GitHub客戶端, 刷新一下:

pull4.png

然後我們看到遠端有一個新版本:

pull5.png

點擊Pull origin拉取之. 然後History就多了個版本記錄:

pull6.png

同時本地文件也被更新了:

pull7.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章