請各位讀者新增一下作者的微信公眾號,以後有新的文章,將在微信公眾號直接推送給各位,非常感謝。
0.前言
注意:若文章中出現圖片無法載入的情況,請移步作者的其他部落格。
最近 S 君進入某網際網路公司進行開發,可是進入公司工作的第一件事就是要將自己每天開發的成果遞交給老大。
可是,這時候 S 君遇到一個問題。
“你們每天的程式碼要上傳到倉庫裡,記得檢查衝突。”
倉庫?程式碼上傳?這些都是什麼意思呀?
抱著試試看的心態,S 君找到了我,於是也就有了今天的文章。
1.版本控制
首先在文章的開始前,先來介紹一下,什麼叫做版本控制。
版本控制(Revision control)是一種軟體工程技巧,籍以在開發的過程中,確保由不同人所編輯的同一檔案都得到更新。
說白了,所謂的版本控制其實就是我們在日常的開發過程中,將每天、每個階段、每個功能等要求完成之後,將我們的程式碼再提供給他人的一種行為。
這個行為的目的就是,讓每一個人的開發過程都有據可查,最後實現多人合作開發的目的。
而版本控制的過程中,非常重要的一個問題就是,儲存庫(也就是倉庫)的建立。
接下來我們來介紹一下,關於倉庫的概念。
2.資料倉儲
一般在開發的過程中,專案 leader 一般會將你們的專案倉庫進行劃分。
但是一般來說,不管怎麼劃分,都離不開以下幾個內容。
首先來說一下上圖中出現單詞的含義。
- Master : 領導,一般是你們 leader
- Hotfix : 熱修復,一般是有問題了,之後通知使用者自己下載補丁
- Release :釋出,就是上線了
- Develop :開發者,不用說了,就是我們
- Feature :特色,備用版本
除此之外,在開發過程中,其實跟程式息息相關的卻是另外幾個倉庫。
這裡會設計到一些公司 CTO 的想法和意見,所以每個公司都不相同,請選擇檢視。
一般公司內部都會有一個研發規範,而我們們需要注意的就是在研發規範中,對於倉庫的使用。
PS:我居然能找到這個,當時自己都驚了。
倉庫名稱 | 穩定程度 | 許可權 | 說明 |
---|---|---|---|
branches | 開發分支,不穩定 | 開發team有許可權 | 有開發任務時,從trunk打分支到branches,分支命名以dev_為字首,加上日期(如果trunk分支在測試且證明極度不穩定,想取穩定分支,從tags取)。開發完成時,並且開發自測完成,由研發Leader合併到主幹trunk,測試從trunk發包進行測試。 |
trunk | 主幹分支,趨於穩定 | 開發Leader有許可權 | 最新趨於穩定版本程式碼存放地。開發Leader有許可權從開發分支merge程式碼到主幹,然後質量部進行測試,測試通過由運維部打上線分支到tags。研發leader要控制trunk的時序性。(也就是說盡量避免一個brances合併到trunk進行測試之後,在沒有完成測試前又合併一個分支,導致測試返工。) |
tags | 上線分支,穩定 | 運維有許可權 | 方便回滾和記錄。以日期命名,如201 * |
實際開發中,大概就是這個樣子。
當然,如果你們公司使用的是 Git ,其實效果也是一樣,具體的都會由你們 leader 來完成。
3.版本控制的工具
上面說了這麼多的內容,我們在開發的過程中,使用到了各種倉庫。
可以,我們又回到了 S 君的問題,就是,我們怎麼去進行版本控制呢?
在此,我想說明的是,如果遇到一個問題,你第一個反應不應該是去詢問他人,而是看看自己是否能夠解決。你是自己查詢資料也好,是在網路上搜尋也罷,只要是你自己獨立解決的問題,你的記憶會非常深刻的。
好了,迴歸正題。
關於程式碼版本控制常用的兩個倉庫分別是 SVN 和 Github,當然,也有很多其他的控制工具。
對於純程式碼的方式,大家可以優先學習一下,而且網上教程一堆,在此就不做更多說明了。
而作者在此給大家推薦兩個圖形化倉庫管理工具。
也就是 SourceTree 以及 Cornerstone。
關於下載地址,大家可以自行在網上搜尋一下,作者在這裡就不做更多說明了。
4.將你的程式碼上傳至倉庫
因為作者平常使用的都是 Git,所以這裡的演示也以 Git 為準。
除此之外,今天只演示如何將一個本地的檔案上傳至 Git 上,如果在公司的話,請按照公司自己的標準來。
最後,在開始操作前,你需要保證自己已經有了以下內容。
- SourceTree 的客戶端
- Github 的賬號
如果大家之前已經使用過 SourceTree 或者已經登入過某賬號了,請在 SourceTree 中刪除原本賬號。
之後請開啟你的 Github,並登入。
之後請在右下角處,選擇 New repository 去建立一個新的倉庫。
點選過後會出現這個介面。
建立完畢,這時候我們就已經得到我們的倉庫了。
可是,想要向倉庫中新增內容,這裡還只是個開始。
這時候我們找到我們的倉庫的地址,複製下來。
開啟我們的 SourceTree 工具。
同樣點選 New Repository。
選擇 Clone from URL。
選擇完成後會要求你填寫三個內容。
- 第一個指的是你 Github 上的那個地址連結。
- 第二個是指你需要克隆所使用的資料夾地址
- 第三個會根據第二個自動生成,當然,你也可以修改
當克隆完畢之後,我們當前這個資料夾就和 Git 上的那個資料夾相連啦。
這時候我們只需要將我們對應的檔案直接拖進當前資料夾即可。
之後我們需要做的就是,回到我們的 SourceTree 中,開始提交。
當然,提交的過程中,會提示你,讓你輸入你 GIT 的賬號和密碼。
正常輸入即可,當提交完畢之後,你就會發現我們的內容已經上傳到 Git 上啦。
5.通過程式碼來完成程式碼的上傳
5.1 初始化
通常有兩種方式來進行初始化:
1)git clone是一種較為簡單的初始化方式,當你已經有一個遠端的git版本庫時,只需要在本地克隆一份即可。 例如在終端中輸入:
git clone git://github.com/someone/some_project.git some_project複製程式碼
上面的命令就是將遠端版本庫克隆到本地電腦的some_project目錄下。
2)git init和git remote。這種方式稍微複雜一些。當你本地建立了一個工作目錄,你可以進入這個目錄,使用git init命令建立一個git版本管理庫。這時候如果需要將工程放到遠端伺服器上,可以在遠端伺服器上建立一個目錄,並把可訪問的URL記錄下來,此時就可以使用git remote add命令來增加一個遠端伺服器版本了。例如:
git remote add origin git://github.com/someone/another_project.git複製程式碼
上面的命令就會增加該URL地址且名稱為origin的遠端伺服器。以後提交的程式碼只需要使用origin這個別名即可。
5.2 分支操作
- 檢視本地分支:git branch
- 檢視遠端分支:git branch -r
- 檢視所有的分支:git branch -a
- 建立本地分支:git branch name
- 注意新分支建立後不會自動切換為當前分支
切換分支:git checkout name
- 這裡需要注意的一點就是,如果是要同步遠端的分支(比如同事建立了新的分支,以保證針對某個版本的修改在該分支下),請不要在本地新建一個跟遠端同名的分支,也就是說不要使用git branch name這個命令,而是直接使用git checkout name命令把遠端的分支拉下來即可。以避免把新的程式碼合併到舊的分支裡。
建立新分支並立即切換到新分支:git checkout -b name
- 刪除分支:git branch -d name
- -d選項只能刪除已經參與了合併的分支,對於未有合併的分支是無法刪除的。如果想強制刪除一個分支,可以使用-D選項
- 合併分支:git merge name
- 將名稱為name的分支與當前分支合併,是合併到當前分支,而不是合併到name分支。要注意的合併前先使用 git branch檢視下當前所處的分支。
- 可以在後面加引數
比如我要把issue340分支合併到dev分支,可以先checkout到dev分支並使用以下命令:
git merge issue340 -n --ff複製程式碼
建立遠端分支(本地分支push到遠端):git push origin name
刪除遠端分支:git push origin :heads/name 或 git push origin : name。
這裡需要注意的是,在開發新功能、測試或者重構部分程式碼時,最好是新建一條分支來操作,測試新功能OK後再合併回主分支,以避免干擾到主分支。
5.3版本操作
檢視版本:git tag
建立版本:git tag name
刪除版本:git tag -d name
5.4 撤銷檔案更改
git checkout有兩個作用,其中一個功能是在不同的branch之間進行切換,例如git checkout another_branch就會切換到another_branch的分支上去。
另一個功能是還原始碼的作用,例如git checkout app/model/user.rb就會將user.rb檔案從上一個已提交的版本中更新回來,未提交的內容全部會回滾到改動前的狀態。
5.5 檢視git配置
git config --list該指令可以檢視所有關於git的配置,使用者和郵箱,遠端庫的URL等。
5.6 版本回滾
git版本管理的好處就在於有無限的反悔權。git reset HEAD^就會回到前一版本(一個^表示是前一版),並把其中的 changes 繼續留在 working tree 中。適合發現前一次 commit 有問題或是想要修改 commit log,可以修改後再重新 commit。
git reset如果加上–soft引數則會把 changes 直接加到 staging area(暫存區)。加上–hard參數列示不留 staging area 也不留 working tree(完全刪除任何修改記錄)。例如git reset --hard指令會清楚所有與最近一次commit不同的修改,也就是說放棄當前所有的更改。
如果在合併(merge)過程中發生衝突了,想放棄這次合併,也可以使用git reset --hard來取消。
git reset --hard ORIG_HEAD指令會取消最近一次成功的合併以及所有你在這次合併後所做的修改。
5.7 修改上一次提交的資訊
有時候手抖,在還沒有輸入完提交資訊的時候按了回車,可以用如下指令修改提交的資訊:
git commit -m"your message" --amend複製程式碼
5.8 單個檔案回滾
有時候為了改了一個功能,沒完全測試OK就推到伺服器了,發現改的功能還不如之前的好用怎麼辦? 有兩種情況,第一種是,在你提交錯誤的程式碼到伺服器後,隊友還有沒有提交過,可以使用該指令:
git reset --hard commit_id複製程式碼
其中commit_id是提交記錄的代號,可以使用指令:
git log複製程式碼
來檢視所有的提交記錄,找到你需要回滾的版本即可(鍵盤方向鍵可滾動檢視所有記錄,滑鼠目測不行)。
這裡要注意的是,git會回滾到你最近一次提交的commit_id之後的版本,而不是commit_id之前的版本。在本次操作中,由於隊友都沒有更新,只需要找到當前提交的上一次的commit_id即可。比如今天是3月21日,你提交了錯誤的程式碼到伺服器,服務端在之前3月20日有一次更新,那你找到3月20日的commit_id即可。
第二種情況是,如果你提交了錯誤程式碼後隊友也有新的提交,直接版本回退會把隊友新提交的程式碼也搞沒了,這時候如果你改動的檔案不多的話,可以使用單個檔案回滾的方式: 1)執行git log test.h檢視該檔案的提交記錄,找到需要回滾的commit版本,複製版本號。 2)執行git reset “commit版本號” test.h 3)繼續執行git checkout test.h,檔案回滾成功。
需要注意的是,如果檔案在比較深的目錄下,上述操作室需要輸入目錄結構的,比如git log aaa/bbb/test.h。
5.9 其他
提交程式碼的通常步驟git status檢視當前狀態,有改動則使用git add.把所有改動新增到本地倉庫or暫存區?然後git commit -m"your commit message"後,先it pull拉下伺服器的最新程式碼,確認沒有問題後可以git push提交程式碼。
git pull之後,或者進入其他介面,都可使用:wq退回到git的操作介面
如果在git pull或者git push時,提示沒有設定pull或者push的預設分支,按照提示的指令設定預設分支即可。
再次強調,在開發新功能、測試或者重構部分程式碼時,最好是新建一條分支來操作!
6.後記
前前後後花了 6 個多小時,總算是寫完了。
希望能夠幫到你們吧。
看完記得點個贊。
最後,本文由 李鵬 手打完成,請勿隨意轉載。
作者保留法律追究權利。