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

目錄

  1. 前言
  2. 本地倉庫 (使用Sourcetree)
  3. 遠程倉庫 (使用GitHub)

前言

本文僅簡單討論代碼的版本控制, 包括版本提交、分支、遠程倉庫的拉取/推送、版本回退等, 不探討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上疊加兩個新版本進行測試:

sourcetree_histories7.png

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

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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容