团队源代码管理
(1)?你的團隊的源代碼控制在哪里?用的是什么系統?
答:我們的源代碼控制在Github上,使用與之相匹配的Git系統。
(2)?一個代碼文件被簽出之后,另一個人可以簽出這個文件,并修改么?
a)?有幾種設計,各有什么優缺點?
答:有兩種設計:①簽出文件后,此文件就加鎖,別人無法簽出。②所有人都可以自由簽出文件。
????優缺點是:由于現階段的開發規模比較小,于是為了最大化效率,我們沒有對文件遷入遷出進行過多的限制。將文件在遷入遷出時加鎖,顯然可以保證源代碼修改的同步性,減少不必要的沖突和錯誤,但是這樣的缺點是顯而易見的,由于缺乏了并行性,項目開發的效率就被極大地降低了,極端情況下很有可能因為一個人的失誤,導致全隊項目的擱淺。反之,我們采用自由遷入遷出的方式,則與前者的優缺點互反了。
(3)?如何看到這個文件和之前版本的差異?
答:①在git管理中,?使用git diff即可看到文件和之前版本的差異。
git diff:是查看working tree(工作目錄)與index file(暫存區)的差別的
git diff --cached:是查看index file(暫存區)與commit(本地倉庫)的差別的。
git diff HEAD:是查看working tree(工作目錄)和commit(本地倉庫)的差別的。
在git里,這三個概念是很重要的,其中 git add的一個功能是將修改從工作目錄添加到index file,commit的工能就是從index file的修改添加到 commit。
?
查看兩個提交版本id的修改記錄差異
$ git diff commit-id1 commit-id2
?
?
查看兩個提交版本id修改了那些文件,可以使用
$ git diff commit-id1 commit-id2 --stat
?
?
提交日志顯示每個版本的提交主題和具體修改的文件名字
$ git log --name-only
?
?
②在Github中,也可以通過可視化的界面來看到每次修改的代碼(包括增加,刪除)文件與修改的具體位置,修改的具體內容。可以看到每次修改的文件路徑、文件的內容、紅色代表刪除掉的內容,綠色代表添加的內容。
(4)?如果某個文件在你簽出之后已經被別人修改,那么你如何合并不同的修改(merge)??
答:我們使用Git來幫助我們完成了這件事。在一般情況下,git pull后git會自動合并Git修改的部分,自動的Merge。但是,也存在無法自動合并的情況:比如遠程數據庫和本地數據庫的同一個地方都發生了修改的情況下,因為Git無法自動判斷要選用哪一個修改,所以就會發生沖突。但是,Git會在發生沖突的地方打個標記!比如這樣式的:
<<<<<<< HEAD
test in Local
=======
test in Remote
>>>>>>> 17c805…(Commit的Hash值)
==分割線上方是本地數據庫的內容
==分割線下方是遠程數據庫的某次產生沖突的commit所修改的內容。這時候我們需要通過一雙慧眼來識別哪些都可以保留,哪些保留遠程數據庫的內容,哪些保留本地數據庫的內容。在將文件沖突的內容合并后,刪除掉<<<<< 和=====,>>>>>這樣的東西,重新add,commit,push,即完成了一次手工合并。不過因為大家都是新手入門,不太會合理地人工合并沖突,所以項目經理本身在分配任務時,遵循了一個原則:盡量不讓兩個人的任務在同一個文件上產生重疊。每個人修改的文件范圍或者其他都是固定的,一般不會存在兩個人同時修改同樣的文件。當然,前端和后端在修改時大部分時候都會產生沖突,這時候我們就使用了另一套機制來幫我們實現這一點:新建分支與分支合并。
(5)?你有20個文件都是關于同一個功能的修改,你要如何保證這些文件都同時簽入成功(修改的原子性)
答:Branch的出現,可以讓任何一位開發者基于其他人的代碼或環境都完整可用(即stable版)的環境下進行自己的部分的獨立開發?。最后的合并工作可以放在一天之內,將所有的Branch上的feature合并到一個dev分支上來。但是這樣面臨的風險也是有的,多個分支同時合并時如果出現了比較大的沖突,合并起來必須小心翼翼。同時,在解決一個Issue的時候,也可以新建一個Issue分支,在解決了Issue后,可以使用分支合并的技術將兩個或多個分支合并。
(6)?你的PC 上有關于三個bug 的修改, 但是都沒有完成,這時你要緊急修改第四個bug,如何把本地修改放一邊,保證在干凈的環境中修改第四個bug, 并簽入修改?
答:在Git里,不能完整地保證commit后整個環境處于可編譯或可運行狀態下的commit是不好的提交。所以在文件半完工的狀態下,我們不可以使用commit來將文件修改的內容留下來。Git為我們提供了一種類似于操作系統里的保存現場的指令,那就是stash。 它可以把當前工作現場"儲藏"起來,等以后恢復現場后繼續工作,使用方法類似下面:
$ git stash
Saved working directory and index state WIP on master: 5655bdc Merge branch 'mas
ter' of https://github.com/buaase/Phylab-Web
HEAD is now at 5655bdc Merge branch 'master' of https://github.com/buaase/Phylab
-Web
這時候就會發現,add了以后的東西都被"雪藏"起來,現在的工作區非常干凈,我們這時候可以在一個干凈的環境中修復緊急的bug并提交,簽入,在push后,再使用git stash apply 或者 git stash pop來將保存起來的內容取出來繼續開開心心地開發啦。
(7)?如何給你的源代碼建立分支?
答:?直接點擊 Branch,然后在彈出的文本框中添加自己的 Branch Name 例如code-edits然后點擊藍色的Create branch就可以了,這樣一來,你這個項目就有2個分支了(master 和 code-edits),下面顯示了創建過程以及創建后而界面:
?
?
?
?
?
*由上面的分支合并的流程圖可以發現,1 個庫可以有多個分支并行的進行開發,但是最后只有 1 個會被 merge 進來,因此當某一個分支被合并到進 master 分支后,其他的并行分支的提交都會被是作為沖突 conflict,解決這個沖突的唯一辦法就是,每次做修改之前,記得更新版本庫,使自己的分支與 master 分支保持一致。
具體操作步驟如下:
1、Git init (在本地工程目錄下),生成.git 文件夾
?
?
?
2、上傳修改的文件
?
(*可替換成具體要上傳的文件名,*表示提交所有有變化的文件)
3、添加上傳文件的描述
?
?
?(” code-edits “為分支名)
4、(創建分支)
?
?
git branch code-edits
5、(切換分支)
?
?
git checkout code-edits
6、與遠程分支相關聯
?
?
git remote add origin https://github.com/xingpengzhang/lcb.git
? ?(” lcb “ 為工程名)
7、(將分支上傳)
?
?
git push origin code-edits
*我們這里出現了一點問題但是低下也給出了一些可能的原因,以及尋求解決辦法的方式,這里我們就不再詳細介紹了,感興趣的同學可以根據提示自己去連接一下。
下面是.git文件中新增的一些信息,有關分支的詳細信息都可以在里面找到:
?
?
(8)?一個源文件,如何知道它的每一行都是什么時候簽入的??
答:針對一個源文件的每一行是在什么時候簽入,在github里有非常好的支持,如下圖:
?
?
?
在上圖中我們可以看到,這個安卓程序在5次提交中被修改了,分別是在上圖所示commit中被修改過,但是可惜的是沒有帶有比較清晰的commit日志,無法知道它是為何被簽入,修改又是為了什么。以及所有跟它有關的所有commit提交信息。所以在這里要特別提醒:一個良好的團隊應當維護一個良好的commit日志,并且有所規范,但是我們組在這一點上還非常欠缺...
(9)?如何給一個系統的所有源文件都打上標簽,這樣別人可以同步所有有這個標簽的文件版本?
答:使用git來打標簽這件事,在Github中是可以很方便來做這件事。
?????每次發布到一定成果后,就需要發布一個realease版本,但是這樣的話,是對commit本身打標簽。在git里,標簽分為兩種類型:輕量標簽和附注標簽。輕量標簽是指向提交對象的引用,附注標簽則是倉庫中的一個獨立對象。
想查看tag的話,可以使用git tag來查看,如下:
?
?
如果想回到某個標簽時某個文件的狀態,那么只要使用git checkout tag(標簽名) 即可,如下面這個gif所示:
?
?
(10)?你的團隊是否能部署自動構建的任務
- (自動同步所有文件,自動構建,自動運行單元測試,碰到錯誤能自動發郵件給團隊)
決意采用了drone.io來進行自動化的單元測試,每次測試都會自動按照預定的腳本運行單元測試,單元測試通過以后可以在Github的ReadMe里體現出來。
是這樣的標志:
?
?
點開build passing的示例,我們可以看到在drone.io中我們部署的自動化測試:
?
?
每一次commit都會觸發自動化測試,在部署成功后(只針對master分支),已經test了38次。
?
?
在Setting中也可以看到,我們在build出錯時,會自動通知我的郵箱(qianlxc@126.com)
?
?
?
轉載于:https://www.cnblogs.com/blackDuck/p/10928344.html
總結
- 上一篇: @Singleton能保证单例吗
- 下一篇: java版spring cloud+sp