很多人都知道,linus在2023年建立了開源的linux,從此,linux系統不斷發展,已經成為最大的伺服器系統軟體了。
linus雖然建立了linux,但linux的壯大是靠全世界熱心的志願者參與的,這麼多人在世界各地為linux編寫**,那linux的**是如何管理的呢?
事實是,在2023年以前,世界各地的志願者把源**檔案通過diff的方式發給linus,然後由linus本人通過手工方式合併**!
你也許會想,為什麼linus不把linux**放到版本控制系統裡呢?不是有cvs、svn這些免費的版本控制系統嗎?因為linus堅定地反對cvs和svn,這些集中式的版本控制系統不但速度慢,而且必須聯網才能使用。有一些商用的版本控制系統,雖然比cvs、svn好用,但那是付費的,和linux的開源精神不符。
不過,到了2023年,linux系統已經發展了十年了,**庫之大讓linus很難繼續通過手工方式管理了,社群的弟兄們也對這種方式表達了強烈不滿,於是linus選擇了乙個商業的版本控制系統bitkeeper,bitkeeper的東家bitmover公司出於人道主義精神,授權linux社群免費使用這個版本控制系統。
安定團結的大好局面在2023年就被打破了,原因是linux社群牛人聚集,不免沾染了一些梁山好漢的江湖習氣。開發samba的andrew試圖破解bitkeeper的協議(這麼幹的其實也不只他乙個),被bitmover公司發現了(監控工作做得不錯!),於是bitmover公司怒了,要收回linux社群的免費使用權。
linus可以向bitmover公司道個歉,保證以後嚴格管教弟兄們,嗯,這是不可能的。實際情況是這樣的:
linus花了兩周時間自己用c寫了乙個分布式版本控制系統,這就是git!乙個月之內,linux系統的原始碼已經由git管理了!牛是怎麼定義的呢?大家可以體會一下。
git迅速成為最流行的分布式版本控制系統,尤其是2023年,github**上線了,它為開源專案免費提供git儲存,無數開源專案開始遷移至github,包括jquery,php,ruby等等。
歷史就是這麼偶然,如果不是當年bitmover公司威脅linux社群,可能現在我們就沒有免費而超級好用的git了。
svn與git的區別:
在公司工作時,往往都是多個同事同時做乙個專案,每個人做個人模組的功能,**往同乙個**庫中提交,這時候就需要乙個版本控制工具。
現在大多數的公司都會選擇用git了,或者從svn往git去做遷移。svn和git到底有什麼區別呢?本質區別就是svn是集中式的版本管理,git是分布式的版本管理。
集中式版本控制:
分布式版本控制:
svn採用這種集中式版本控制,只有乙個**倉庫,成需要開發時,需要從遠端倉庫進行**拉取,如果遠端倉庫所在的伺服器宕機,或者斷電,就會影響開發進度,另外svn和git比,有乙個明顯的短板就是版本控制。而git採取的分布式的版本控制方式,每乙個開發人員可以管理乙個自己的本地倉庫,在不聯網時也可以不影響開發進度,不同的開發者提交**時,會將提交記錄提交到同乙個分支的其他開發人員,方便分支管理。
解釋一下working directory是你的工作區,stage相當於是乙個暫存區,你需要將working directory下的檔案,add到stage下,這樣就可以被git管理。
用git commit提交到history,就是你的本地倉庫。你可以在完全不聯網的情況下完成開發任務,如果需要乙個團隊同時開發,這個時候就需要乙個遠端倉庫,每個人從遠端倉庫上pull最新分支**,或者把修改的**push到遠端倉庫。常用的遠端倉庫有github,gitee,bitbucket等
git bash,與git cmd的區別是git bash是linux下支援的命令,git cmd則是windows下支援的命令,命令會有區別,比如linux下清屏的命令是clear,而windows下則是cls。我們常用的是git bash。注意git gui是圖形化介面,不推薦初學者使用,初學者還是多使用git bash,多練習使用指令,達到熟練的程度。
這裡說一下安裝完記得要配置一下使用者名稱和郵箱,這個是後面連線遠端倉庫的時候需要用到。
命令:
$ git config --global user.name "your name"
$ git config --global user.email "[email protected]"
比較常用的**託管平台就是github,但是由於伺服器在國外,有時比較慢,甚至打不開。這裡推薦gitee,也就是碼雲,國內做的比較好的**託管平台。至於bitbucket我寫在這裡是因為現在的公司在用,過段時間我會更新一下bitbucket的使用感受和與github/gitee的區別。
配置:需要在git bash 執行
$ ssh-keygen
會在c:\users\xuzhenyu.ssh(這是我的目錄)生成乙個id_rsa.pub的公鑰,複製公鑰到gitee/github上的ssh配置的選項下即可。
github/bitbuket也是同理。
使用git前,需要先建立乙個倉庫(repository)。您可以使用乙個已經存在的目錄作為git倉庫或建立乙個空目錄。
使用您當前目錄作為git倉庫,我們只需使它初始化。
git init
使用我們指定目錄作為git倉庫。
git init newrepo
從現在開始,我們將假設您在git倉庫根目錄下,除非另有說明。
新增新檔案
我們有乙個倉庫,但什麼也沒有,可以使用add命令新增檔案。
git add filename
可以使用add… 繼續新增任務檔案。
提交版本
現在我們已經新增了這些檔案,我們希望它們能夠真正被儲存在git倉庫。
為此,我們將它們提交到倉庫。
git commit -m 「adding files」
如果您不使用-m,會出現編輯器來讓你寫自己的注釋資訊。
當我們修改了很多檔案,而不想每乙個都add,想commit自動來提交本地修改,我們可以使用-a標識。
git commit -a -m 「changed some files」
git commit 命令的-a選項可將所有被修改或者已刪除的且已經被git管理的文件提交到倉庫中。
千萬注意,-a不會造成新檔案被提交,只能修改。
發布版本
我們先從伺服器轉殖乙個庫並上傳。
git clone ssh:
現在我們修改之後可以進行推送到伺服器。
git push ssh:
取回更新
如果您已經按上面的進行push,下面命令表示,當前分支自動與唯一乙個追蹤分支進行合併。
git pull
從非預設位置更新到指定的url。
git pull
已經超過了五分鐘?
刪除如何你想從資源庫中刪除檔案,我們使用rm。
git rm file
分支與合併
分支在本地完成,速度快。要建立乙個新的分支,我們使用branch命令。
git branch test
branch命令不會將我們帶入分支,只是建立乙個新分支。所以我們使用checkout命令來更改分支。
git checkout test
第乙個分支,或主分支,被稱為"master"。
git checkout master
對其他分支的更改不會反映在主分支上。如果想將更改提交到主分支,則需切換回master分支,然後使用合併。
git checkout master
git merge test
如果您想刪除分支,我們使用-d標識。
git branch -d test
後面補充
關於makefile的一點思考
在gnu編譯工具軟體中,如果對單一的原始檔進行編譯,可執行指令如下 gcc o x x.c 此指令會將原始檔編譯為目標檔案。若是對執行緒類檔案進行編譯,則在末尾加上 lpthread指令。但若是對多檔案進行編譯,即若是編譯的目標檔案同時包含另一檔案中的函式。則在編譯的時候需將另一檔案加到編譯原始檔中...
關於指標的一點思考
指標是乙個變數,所不同的是,它存的是位址。因為資料型別決定著如何解釋這個位址 位元組數和操作 因此根據的資料型別的不同,指標又有不同的型別。某個物件 a 的位址範圍為 a,a size n 其中size n是a所佔的位元組數 比如乙個一維陣列int a 10 位址範圍為 a,a 10 sizeof ...
關於演算法的一點思考。。。
關於演算法的一點思考。在實踐過程中,我發現 有時候要解決乙個問題,可以設計幾個演算法分步完成任務,這樣處理起來比較簡單,但是情況並非總是如此,有時,我們需要將幾個步驟放在同乙個演算法內連帶處理,這樣才比較容易處理問題。我還發現,有時候,解決問題的演算法,是被發現出來的,並加以一步一步的檢驗才得以確定...