Git分佈式版本控制系統最佳實踐

  1. Git誕生歷史

    我想大家還記得Linus torvalds在1991年時發佈了Linux操作系統吧,從那以後Linux系統變不斷髮展壯大,因爲Linux系統開源的特性,所以一直接受着來自全球Linux技術愛好者的貢獻,志願者們通過郵件向Linus發送着自己編寫的源代碼文件,然後由Linus本人通過手工的方式將代碼合併,但這樣不僅沒有效率,而且真的是太痛苦了。
    一直到2002年,Linux系統經過十餘年的不斷髮展,代碼庫已經龐大到無法再讓Linus通過手工的方式管理了,但是Linus真的很不喜歡CVS或者Subversion版本控制系統,於是商業公司BitMover決定將其公司的BitKeeper分佈式版本控制系統授權給Linux開發社區來免費使用,當時的BitKeeper可以比較文件內容的不同,還能夠將出錯的文檔還原到歷史某個狀態,Linus終於放下了心裏的石頭。


    分佈式版本控制流程圖

    CVS和Subversion屬於傳統的版本控制系統,而分佈式版本控制系統最大的特點是不需要每次提交都把文件推送到版本控制服務器,而是採用分佈式版本庫的機制,使得每個開發人員都夠從服務器中克隆一份完整的版本庫到自己計算機本地,不必再完全依賴於版本控制服務器,使得源代碼的發佈和合並更加方便,並且因爲數據都在自己本地,不僅效率提高了,而且即便我們離開了網絡依然可以執行提交文件、查看歷史版本記錄、創建分支等等操作,真的是開發者的福音啊。

    就這樣平靜的度過了三年時間,但是Linux社區聚集着太多的黑客人物,2005年時,那位曾經開發Samba服務程序的Andrew因爲試圖破解BitKeeper軟件協議而激怒了BitMover公司,當即決定不再向Linux社區提供免費的軟件授權了,此時的Linus其實也早已有自己編寫分佈式版本控制系統的打算了,於是便用C語言花了2周創建了Git分佈式版本控制系統,並上傳了Linux系統的源代碼。

    git_logo

    Git不僅是一款開源的分佈式版本控制系統,而且有其獨特的功能特性,例如大多數的分佈式版本控制系統只會記錄每次文件的變化,說白了就是隻會關心文件的內容變化差異,而Git則是關注於文件數據整體的變化,直接會將文件提交時的數據保存成快照,而非僅記錄差異內容,並且使用SHA-1加密算法保證數據的完整性。

    Git爲了提高效率,對於沒有被修改的文件,則不會重複存儲,而是創建一個鏈接指向之前存儲過的文件。


    git提交流程圖

    在正式使用前,我們還需要弄清楚Git的三種重要模式,分別是已提交、已修改、已暫存

    已提交(committed):表示數據文件已經順利提交到Git數據庫中。

    已修改(modified):表示數據文件已經被修改,但未被保存到Git數據庫中。

    已暫存(staged):表示數據文件已經被修改,並會在下次提交時提交到Git數據庫中。

    提交前的數據文件可能會被隨意修改或丟失,但只要把文件快照順利提交到Git數據庫中,那就可以完全放心了,流程爲:

    1.在工作目錄中修改數據文件。

    2.將文件的快照放入暫存區域。

    3.將暫存區域的文件快照提交到Git倉庫中。

    git工作模式

  2. Git環境準備

    [root@git-node1 ~]# cat /etc/redhat-release #查看系統版本

    CentOS Linux release 7.1.1503 (Core)

    [root@git-node1 ~]# uname -r #查看內核版本

    3.10.0-229.el7.x86_64

    [root@git-node1 ~]# getenforce #確認Selinux關閉狀態

    Disabled

    [root@git-node1 ~]# systemctl stop firewalld #關閉防火牆

    [root@git-node1 ~]# ifconfig eth0|awk -F ‘[ ]+’ ‘NR==2{print $3}’ #查看當前主機IP地址

    192.168.56.115

  3. Git安裝部署

    Git是分佈式的版本控制系統,我們只要有了一個原始Git版本倉庫,就可以讓其他主機克隆走這個原始版本倉庫,從而使得一個Git版本倉庫可以被同時分佈到不同的主機之上,並且每臺主機的版本庫都是一樣的,沒有主次之分,極大的保證了數據安全性,並使得用戶能夠自主選擇向那個Git服務器推送文件了,其實部署一個git服務器是非常簡單的。

    [root@git-node1 ~]# yum install git 
    #
    安裝Git

    [root@git-node1 ~]# git config –global user.name “xubusi” 
    #
    配置git使用用戶

    [root@git-node1 ~]# git config –global user.email “[email protected]” 
    #
    配置git使用郵箱

    [root@git-node1 ~]# git config –global color.ui true

    [root@git-node1 ~]# git config –list

    user.name=xubusi

    [email protected]

    color.ui=true

  4. Git常用命令

    add #添加文件內容至索引

    bisect #通過二分查找定位引入 bug 的變更

    branch #列出、創建或刪除分支

    checkout #檢出一個分支或路徑到工作區

    clone #克隆一個版本庫到一個新目錄

    commit #記錄變更到版本庫

    diff #顯示提交之間、提交和工作區之間等的差異

    fetch #從另外一個版本庫下載對象和引用

    grep #輸出和模式匹配的行

    init #創建一個空的 Git 版本庫或重新初始化一個已存在的版本庫

    log #顯示提交日誌

    merge #合併兩個或更多開發歷史

    mv #移動或重命名一個文件、目錄或符號鏈接

    pull #獲取併合並另外的版本庫或一個本地分支

    push #更新遠程引用和相關的對象

    rebase #本地提交轉移至更新後的上游分支中

    reset #重置當前HEAD到指定狀態

    rm #從工作區和索引中刪除文件

    show #顯示各種類型的對象

    status #顯示工作區狀態

    tag #創建、列出、刪除或校驗一個GPG簽名的 tag 對象

  5. Git基本操作

  6. Git提交數據

    我們可以簡單的把工作目錄理解成是一個被Git服務程序管理的目錄,Git會時刻的追蹤目錄內文件的改動,另外在安裝好了Git服務程序後,默認就會創建好了一個叫做master的分支,我們直接可以提交數據到了

    [root@git-node1 ~]# mkdir xubusi 
    #
    創建本地工作目錄

    [root@git-node1 ~]# cd xubusi/ 
    #
    進入本地工作目錄

    [root@git-node1 xubusi]# git init #初始git工作目錄

    Initialized empty Git repository in /root/xubusi/.git/

    [root@git-node1 xubusi]# touch readme
    #
    創建文件

    [root@git-node1 xubusi]# git status 
    #
    查看git狀態

    # Untracked files:

    # (use “git add <file>…” to include in what will be committed)

    readme.txt 
    #
    發現新建的readme.txt文件


    [root@git-node1 xubusi]# git add readme.txt 
    #git
    添加文件至暫存區

    [root@git-node1 xubusi]# git status #次查看狀態

    # Changes to be committed:

    # (use “git rm –cached <file>…” to unstage)

    new file: readme.txt #發現新建立的文件readme.txt已經變綠


    [root@git-node1 xubusi]# git commit -m “the first commit” #git cmmit提交暫存取文件至git版本倉庫

    [master (root-commit) dde9e40] the first commit

    1 file changed, 1 insertion(+)

    create mode 100644 readme.txt

  7. Git移除數據

    有些時候會向把已經添加到暫存區的文件移除,但仍然希望文件在工作目錄中不丟失,換句話說,就是把文件從追蹤清單中刪除。

    [root@git-node1 xubusi]# touch database 
    #
    建立文件

    [root@git-node1 xubusi]# git add database 
    #
    添加文件至暫存區

    [root@git-node1 xubusi]# git status #查看當前git狀態

    # On branch master

    # Your branch is ahead of ‘origin/master’ by 4 commits.

    # (use “git push” to publish your local commits)

    #

    # Changes to be committed:

    # (use “git reset HEAD <file>…” to unstage)

    #

    # new file: database

    [root@git-node1 xubusi]# git rm –cached database 
    #
    將文件從git暫存區域的追蹤列表移除(並不會刪除當前工作目錄內的數據文件)

    rm ‘database’

    [root@git-node1 xubusi]# git status #此時文件已經是未追蹤狀態了

    # On branch master

    # Untracked files:

    # (use “git add <file>…” to include in what will be committed)

    #

    # database

    no changes added to commit (use “git add” and/or “git commit -a”)

    #如果想將文件數據從git暫存區和工作目錄一起刪除,可以做如下操作。

    [root@git-node1 xubusi]# git add database
    #
    再將database文件提交到git暫存區

    [root@git-node1 xubusi]# git rm -f database #但如果在刪除之前數據文件已經被放入到暫存區域的話,git會擔心你誤刪未提交的文件而報錯信息,此時可追加強制刪除-f參數。

    rm ‘database’

    [root@git-node1 xubusi]# ls #查看工作區也沒database文件

    LICENSE deploy help.md readme.txt

    [root@git-node1 xubusi]# git status #查看當前狀態

    # On branch master

    no changes added to commit (use “git add” and/or “git commit -a”)

  8. Git移動數據

    [root@git-node1 xubusi]# git mv readme.txt test.txt #git如果要修改文件名稱,則使用git mv命令

    [root@git-node1 xubusi]# git status 
    #
    查看狀態發現下次提交會有一個改名操作

    # On branch master

    # Changes to be committed:

    # (use “git reset HEAD <file>…” to unstage)

    #

    # renamed: readme.txt -> test.txt

    [root@git-node1 xubusi]# git commit -m “changed name” 
    #
    提交到git版本倉庫

    [master 88f3791] changed name

    2 files changed, 31 deletions(-)

    delete mode 100644 1

    rename readme.txt => test.txt (100%)

    #其實可以如下方法改名

    [root@git-node1 xubusi]# mv test.txt readme.txt #先修改名稱

    [root@git-node1 xubusi]# git rm test.txt #然後刪除git版本倉庫內的文件快照

    rm ‘test.txt’

    [root@git-node1 xubusi]# git add readme.txt #最後再將新的文件添加進入

    [root@git-node1 xubusi]# git commit -m “changed the file name” #提交至git版本倉庫

    [master 2caa209] changed the file name

    1 file changed, 0 insertions(+), 0 deletions(-)

    rename test.txt => readme.txt (100%)

  9. Git歷史記錄

    [root@git-node1 xubusi]# git log #查看提交歷史記錄

    commit 2caa2090efa1aaf5c32524a13c500c1524e0a5ee

    Author: xubusi <[email protected]>

    Date: Sat Jan 16 18:32:53 2016 +0800

    changed the file name

    commit 88f379175b5ead7e0d84e47bd6db6f5a3b072921

    Author: xubusi <[email protected]>

    Date: Sat Jan 16 18:31:03 2016 +0800

    changed name

    commit 76c486fcf5d70b6a443ba9e7dad209c6722c8bee

    Author: xubusi <[email protected]>

    Date: Sat Jan 16 18:22:39 2016 +0800

    tet

    [root@git-node1 xubusi]# git log -2 #查看最近幾條記錄

    commit 2caa2090efa1aaf5c32524a13c500c1524e0a5ee

    Author: xubusi <[email protected]>

    Date: Sat Jan 16 18:32:53 2016 +0800

    changed the file name

    commit 88f379175b5ead7e0d84e47bd6db6f5a3b072921

    Author: xubusi <[email protected]>

    Date: Sat Jan 16 18:31:03 2016 +0800

    changed name

    [root@git-node1 xubusi]#

    [root@git-node1 xubusi]# git log -p -1 #-p顯示每次提交的內容差異,例如僅查看最近一次差異

    commit 2caa2090efa1aaf5c32524a13c500c1524e0a5ee

    Author: xubusi <[email protected]>

    Date: Sat Jan 16 18:32:53 2016 +0800

    changed the file name

    diff –git a/readme.txt b/readme.txt

    new file mode 100644

    index 0000000..a9b574e

    — /dev/null

    +++ b/readme.txt

    @@ -0,0 +1,3 @@

    +1 hehe

    +Create new mode two

    +Create new branch is linux

    diff –git a/test.txt b/test.txt

    deleted file mode 100644

    index a9b574e..0000000

    — a/test.txt

    +++ /dev/null

    @@ -1,3 +0,0 @@

    -1 hehe

    -Create new mode two

    -Create new branch is linux

    [root@git-node1 xubusi]# git log –stat -2
    #–stat
    簡要顯示數據增改行數,這樣能夠看到提交中修改過的內容,對文件添加或移動的行數,並在最後列出所有增減行的概要信息

    commit 2caa2090efa1aaf5c32524a13c500c1524e0a5ee

    Author: xubusi <[email protected]>

    Date: Sat Jan 16 18:32:53 2016 +0800

    changed the file name

    readme.txt | 3 +++

    test.txt | 3 —

    2 files changed, 3 insertions(+), 3 deletions(-)

    commit 88f379175b5ead7e0d84e47bd6db6f5a3b072921

    Author: xubusi <[email protected]>

    Date: Sat Jan 16 18:31:03 2016 +0800

    changed name

    1 | 31 ——————————-

    readme.txt | 3 —

    test.txt | 3 +++

    3 files changed, 3 insertions(+), 34 deletions(-)

    [root@git-node1 xubusi]# git log –pretty=oneline #–pretty根據不同的格式展示提交的歷史信息

    2caa2090efa1aaf5c32524a13c500c1524e0a5ee changed the file name

    88f379175b5ead7e0d84e47bd6db6f5a3b072921 changed name

    76c486fcf5d70b6a443ba9e7dad209c6722c8bee tet

    [root@git-node1 xubusi]# git log –pretty=fuller -2 #以更詳細的模式輸出提交的歷史記錄

    commit 2caa2090efa1aaf5c32524a13c500c1524e0a5ee

    Author: xubusi <[email protected]>

    AuthorDate: Sat Jan 16 18:32:53 2016 +0800

    Commit: xubusi <[email protected]>

    CommitDate: Sat Jan 16 18:32:53 2016 +0800

    changed the file name

    commit 88f379175b5ead7e0d84e47bd6db6f5a3b072921

    Author: xubusi <[email protected]>

    AuthorDate: Sat Jan 16 18:31:03 2016 +0800

    Commit: xubusi <[email protected]>

    CommitDate: Sat Jan 16 18:31:03 2016 +0800

    changed name

    還可以使用format參數來指定具體的輸出格式,這樣非常便於後期編程的提取分析哦,常用的格式有:

    %s    提交說明。

    %cd    提交日期。

    %an    作者的名字。

    %cn    提交者的姓名。

    %ce    提交者的電子郵件。

    %H    提交對象的完整SHA-1哈希字串。

    %h    提交對象的簡短SHA-1哈希字串。

    %T    樹對象的完整SHA-1哈希字串。

    %t    樹對象的簡短SHA-1哈希字串。

    %P    父對象的完整SHA-1哈希字串。

    %p    父對象的簡短SHA-1哈希字串。

    %ad    作者的修訂時間。

    [root@git-node1 xubusi]# git log –pretty=fomat:”%h %cn”
    #
    查看當前所有提交記錄的簡短SHA-1哈希字串與提交着的姓名

    fomat:2caa209 xubusi

    fomat:88f3791 xubusi

    fomat:76c486f xubusi

  10. Git還原數據

    [root@git-node1 xubusi]# echo “Git is a version control system” >> readme.txt
    #
    追加一段話

    [root@git-node1 xubusi]# git add readme.txt #添加至暫存區

    [root@git-node1 xubusi]# git commit -m “introduction software” #提交至git版本倉庫

    [master 4bf5b29] introduction software

    1 file changed, 1 insertion(+)

    此時覺得寫得不妥,想還原某一次提交的文件快照

    [root@git-node1 xubusi]# git log –pretty=oneline #提交的歷史信息

    4bf5b296db9678f1851b896ed040fe37e6d7efb5 introduction software

    2caa2090efa1aaf5c32524a13c500c1524e0a5ee changed the file name

    88f379175b5ead7e0d84e47bd6db6f5a3b072921 changed name

    Git服務程序中有一個叫做HEAD的版本指針,當用戶申請還原數據時,其實就是將HEAD指針指向到某個特定的提交版本,但是因爲Git是分佈式版本控制系統,爲了避免歷史記錄衝突,故使用了SHA-1計算出十六進制的哈希字串來區分每個提交版本,另外默認的HEAD版本指針會指向到最近的一次提交版本記錄,而上一個提交版本會叫HEAD^,上上一個版本則會叫做HEAD^^,當然一般會用HEAD~5來表示往上數第五個提交版本。

    [root@git-node1 xubusi]# git reset –hard HEAD^ 
    #
    還原歷史提交版本上一次

    HEAD is now at 2caa209 changed the file name

    [root@git-node1 xubusi]# cat readme.txt 
    #
    查看文件內容(已經還原)

    Create new branch is linux

    剛剛的操作實際上就是改變了一下HEAD版本指針的位置,就是你將HEAD指針放在那裏,那麼你的當前工作版本就會定位在那裏,要想把內容再還原到最新提交的版本,先看查看下提交版本號

    [root@git-node1 xubusi]# git log –pretty=oneline

    2caa2090efa1aaf5c32524a13c500c1524e0a5ee changed the file name

    88f379175b5ead7e0d84e47bd6db6f5a3b072921 changed name

    怎麼搞得?竟然沒有了Introduction software這個提交版本記錄?

    原因很簡單,因爲我們當前的工作版本是歷史的一個提交點,這個歷史提交點還沒有發生過Introduction software更新記錄,所以當然就看不到了,要是想”還原到未來”的歷史更新點,可以用git reflog命令來查看所有的歷史記錄:

    [root@git-node1 xubusi]# git reflog #查看未來歷史更新點

    2caa209 HEAD@{0}: reset: moving to HEAD^

    4bf5b29 HEAD@{1}: commit: introduction software

    2caa209 HEAD@{2}: commit: changed the file name

    [root@git-node1 xubusi]# git reset –hard 4bf5b29 #找到歷史還原點的SHA-1值後,就可以還原(值不寫全,系統會自動匹配)

    HEAD is now at 4bf5b29 introduction software

    [root@git-node1 xubusi]# cat readme.txt #查看文件內容(已經還原)

    Create new branch is linux

    Git is a version control system

    如是隻是想把某個文件內容還原,就不必這麼麻煩,直接用git checkout命令就可以的,先寫一段話

    [root@git-node1 xubusi]# echo “Some mistkes words” >> readme.txt

    [root@git-node1 xubusi]# cat readme.txt #查看內容

    Git is a version control system

    Some mistkes words

    我們突然發現不應該寫一句話的,可以手工刪除(當內容比較多的時候會很麻煩),還可以將文件內容從暫存區中恢復

    [root@git-node1 xubusi]# git checkout — readme.txt

    [root@git-node1 xubusi]# cat readme.txt 

    Git is a version control system

    這其中是有一套規則,如果暫存區中有該文件,則直接從暫存區恢復,如果暫存區沒有該文件,則將還原成最近一次文件提交時的快照。

  11. Git管理分支結構

    分支即是平行空間,假設你在爲某個手機系統研發拍照功能,代碼已經完成了80%,但如果將這不完整的代碼直接提交到git倉庫中,又有可能影響到其他人的工作,此時我們便可以在該軟件的項目之上創建一個名叫”拍照功能”的分支,這種分支只會屬於你自己,而其他人看不到,等代碼編寫完成後再與原來的項目主分支合併下即可,這樣即能保證代碼不丟失,又不影響其他人的工作。

    一般在實際的項目開發中,我們要儘量保證master分支是非常穩定的,僅用於發佈新版本,平時不要隨便直接修改裏面的數據文件,而工作的時候則可以新建不同的工作分支,等到工作完成後在合併到master分支上面,所以團隊的合作分支看起來會像上面圖那樣。


    生產代碼提交方式

  12. Git創建分支

    [root@git-node1 xubusi]# git branch linux
    #
    創建分支

    [root@git-node1 xubusi]# git checkout linux #切換分支

    Switched to branch ‘linux’

    [root@git-node1 xubusi]# git branch 
    #
    查看當前分支情況,當前分支前有*

    * linux

    master

    [root@git-node1 xubusi]# echo “Create new branch is linux” >> readme.txt
    #
    我們對文件追加一行字符串

    [root@git-node1 xubusi]# git add readme.txt #提交到暫存區

    [root@git-node1 xubusi]# git commit -m “new branch” 
    #
    提交到git版本倉庫

    [linux 8bf5757] new branch

    1 file changed, 1 insertion(+)

    [root@git-node1 xubusi]# git checkout master #我們在提交文件後再切回master分支

    Switched to branch ‘master’

    [root@git-node1 xubusi]# cat readme.txt #查看文件內容,發現並沒有新追加的字符串

    1 hehe

  13. Git合併分支

    現在,我們想把linux的工作成果合併到master分支上了,則可以使用”git merge”命令來將指定的的分支與當前分支合併

    git合併分之示意圖

    [root@git-node1 xubusi]# git branch 
    #
    查看是否在master分支

    linux

    * master

    [root@git-node1 xubusi]# git merge linux #合併Linux分支至master

    Updating 185d668..8bf5757

    Fast-forward

    readme.txt | 1 +

    1 file changed, 1 insertion(+)

    [root@git-node1 xubusi]# cat readme.txt #查看合併後的readme文件

    1 hehe

    Create new branch is linux

    [root@git-node1 xubusi]# git branch -d linux #確認合併完成後,可以放心地刪除Linux分支

    Deleted branch linux (was 8bf5757).

    [root@git-node1 xubusi]# git branch #刪除後,查看branch,只剩下master分支了

    * master

  14. Git分支衝突

    但是Git並不能每次都爲我們自動的合併分支,當遇到了內容衝突比較複雜的情況,則必須手工將差異內容處理點,比如這樣的情況:

    git分支衝突示意圖

    [root@git-node1 xubusi]# git checkout -b linux 
    #
    創建分支並切換到該分支

    [root@git-node1 xubusi]# git branch #查看分支

    * linux

    master

    [root@git-node1 xubusi]# vim readme.txt #編輯readme文件

    [root@git-node1 xubusi]# git add readme.txt 
    #
    Linux分支添加readme至暫存區

    [root@git-node1 xubusi]# git commit -m “create two” #Linux分支提交readme

    [linux 13a42ad] create two

    1 file changed, 1 insertion(+), 2 deletions(-)

    [root@git-node1 xubusi]# git checkout master 
    #
    切換到master分支

    Switched to branch ‘master’

    [root@git-node1 xubusi]# git branch 
    #
    查看是否切換至master分支

    linux

    * master

    [root@git-node1 xubusi]# vim readme.txt #編在master分支上修改readme文件同一行的內容

    [root@git-node1 xubusi]# git add readme.txt
    #
    添加至暫存區

    [root@git-node1 xubusi]# git commit -m ‘create to master’ 
    #
    提交至Git版本倉庫

    [master 75bd55c] create to master

    1 file changed, 1 insertion(+)

    [root@git-node1 xubusi]# git merge linux 
    #
    合併Linux分支(衝突)

    Auto-merging readme.txt

    CONFLICT (content): Merge conflict in readme.txt

    Automatic merge failed; fix conflicts and then commit the result.

    #那麼此時,我們在masterlinux分支上都分別對中readme文件進行了修改並提交了,那這種情況下Git就沒法再爲我們自動的快速合併了,它只能告訴我們readme文件的內容有衝突,需要手工處理衝突的內容後才能繼續合併

    [root@git-node1 xubusi]# cat readme.txt #衝突內容如下

    #Git< <<<<<<=======>>>>>>>分割開了各個分支衝突的內容,我們需要手工的刪除這些符號,並將內容修改

    1 hehe

    <<<<<<< HEAD

    =======

    >>>>>>> linux

    Create new branch is linux

    [root@git-node1 xubusi]# git add readme.txt #再次添加至暫存區

    [root@git-node1 xubusi]# git commit -m ‘config’ #提交至git版本倉庫

    [master eb9bb83] config

    [root@git-node1 xubusi]# git branch -d linux #最後刪除Linux分支結束

    Deleted branch linux (was 13a42ad).

    [root@git-node1 xubusi]# git branch #檢查是否刪除完畢

    * master

  15. Git管理標籤

    當版本倉庫內的數據有個大的改善或者功能更新,我們經常會打一個類似於軟件版本號的標籤,這樣通過標籤就可以將版本庫中的某個歷史版本給記錄下來,方便我們隨時將特定歷史時期的數據取出來用,另外打標籤其實只是像某個歷史版本做了一個指針,所以一般都是瞬間完成的。

    [root@git-node1 ~]# cd xubusi/ #進入git版本控制系統

    [root@git-node1 xubusi]# git tag v1.0 #當前提交內容打一個標籤(方便快速回滾)

    [root@git-node1 xubusi]# git tag #查看當前所有的標籤

    v1.0

    [root@git-node1 xubusi]# git show v1.0 #查看當前1.0版本的詳細信息

    commit 4bf5b296db9678f1851b896ed040fe37e6d7efb5

    Author: xubusi <[email protected]>

    Date: Sat Jan 16 19:02:14 2016 +0800

    introduction software

    diff –git a/readme.txt b/readme.txt

    index a9b574e..412b267 100644

    — a/readme.txt

    +++ b/readme.txt

    @@ -1,3 +1,4 @@

    1 hehe

    Create new mode two

    Create new branch is linux

    +Git is a version control system

    [root@git-node1 xubusi]# git tag v1.2 -m “version 1.2 release is test” #創建帶有說明的標籤,-a指定標籤名字,-m指定說明文字

    [root@git-node1 xubusi]# git tag -d v1.0 #我們爲同一個提交版本設置了兩次標籤,刪除之前的v1.0

    Deleted tag ‘v1.0’ (was 4bf5b29)

    [root@git-node1 xubusi]# git tag 
    #
    再次查看,v1.0已經被刪除

    v1.2

  16. GitLab安裝部署

    1. 安裝和配置必要的依賴關係Install and configure the necessary dependencies

    如果你安裝postfix發送郵件,請選擇”網站設置”中。而不是使用後綴也可以用郵件或 配置自定義SMTP服務器。如果你想使用的進出口,請 配置爲SMTP服務器。

    CentOS7,下面的命令將在系統防火牆打開HTTPSSH訪問。

    yum install curl openssh-server postfix

    systemctl enable sshd postfix

    systemctl start sshd postfix

    firewall-cmd –permanent –add-service=http

    systemctl reload firewalld

    2. 添加gitlab包服務器安裝包Add the GitLab package server and install the package

    curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

    yum install gitlab-ce

    3. 配置並啓動gitlab Configure and start GitLab

    gitlab-ctl reconfigure

    gitlab-ctl status

    gitlab-ctl stop

    gitlab-ctl start

    4. 瀏覽到主機名和登錄Browse to the hostname and login

    Username: root 
    Password:
     5iveL!fe

  17. GitLab配置ssh

    gitlab搭配ssh默認端口引發的血戰

    問題如下:

    仔細發現故障情況

    [root@git-node1 xubusi]# sed -i ‘s/#Port 22/Port 52113/g’ /etc/ssh/sshd_config
    #
    果是默認的22,就必須修改,否則不生效,我這裏改爲了52113

    [root@git-node1 xubusi]# systemctl restart sshd #重啓sshd服務

    [root@git-node1 xubusi]# grep “ssh_port” /etc/gitlab/gitlab.rb #修改gitlab裏面的ssh_prot端口爲自己服務器的sshd端口,聲明gitlab.yml中的配置會被這個給覆蓋

    gitlab_rails[‘gitlab_shell_ssh_port’] = 52113

    [root@git-node1 xubusi]# gitlab-ctl reconfigure #gitlab重新加載配置文件即可


    解決後效果,做一個對比,細心的朋友肯定能發現

    gitlab和github其實pull和push是一樣的,所以我會在下面介紹如何用github來pull和push

  18. GitHub託管服務

    Github顧名思義是一個Git版本庫的託管服務,是目前全球最大的軟件倉庫,擁有上百萬的開發者用戶,也是軟件開發和尋找資源的最佳途徑,Github不僅可以託管各種Git版本倉庫,還擁有了更美觀的Web界面,您的代碼文件可以被任何人克隆,使得開發者爲開源項貢獻代碼變得更加容易,當然也可以付費購買私有庫,這樣高性價比的私有庫真的是幫助到了很多團隊和企業。
    大多數用戶都是爲了尋找資源而愛上Github的,首先進入網站,點擊註冊(Sign up):

    如果沒有註冊的朋友點擊註冊

    填寫註冊信息

    選擇倉庫類型,默認免費,點擊底下finish sign up註冊

    我們的GitHub賬號註冊完成我們的GitHub賬號註冊完成

    我們在向Github推送文件時,可以選擇SSH協議模式,在本機生成密鑰

    [root@git-node1 ~]# ssh-keygen #生成密鑰命令

    Generating public/private rsa key pair.

    Enter file in which to save the key (/root/.ssh/id_rsa):

    Enter passphrase (empty for no passphrase):

    Enter same passphrase again:

    Your identification has been saved in /root/.ssh/id_rsa.

    Your public key has been saved in /root/.ssh/id_rsa.pub.

    The key fingerprint is:

    00:93:62:97:fd:a8:7a:7b:33:0f:2d:81:e1:11:17:b2 [email protected]

    The key’s randomart image is:

    +–[ RSA 2048]—-+

    | =+o. |

    | o +B. |

    | . oE .o |

    | . +… |

    | o.. S |

    | . o |

    | . o . |

    | . . +o |

    | ..o +. |

    +—————–+

    [root@git-node1 ~]# cat ~/.ssh/id_rsa.pub #查看公鑰

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCXv4xsa4l9fvKCDTWMvG0meoMveklG/beOvkw9xVnmFVhTg4qOCVhLXaaQtR1PJnKVhMok1vtYZu+ldAMHsSmHMuUCK2KMNFrZZaEloMeCNRkFY2vhY5XHuUBK2NjwgLjDXCYtIU40UmlFCU974ybWZJaCteIoHstLLQPoG/5PF5gqBOCeNLxkpq35jJTO9JvexeBMr2hG7NSzg9uZEDyRPUwEVY2yYZkq7hlAnR5H4f1X6HPePc64ZWLT3ZyddlK/9EXDLPu2VLMC7lj5mTGrJlQ54TU3dqSYQXzIV88GsdqxfZj8xbb9JOUZJK4KjAvqUkVmtaVFTTM77zCPUJSN [email protected]

    點擊setting賬戶配置

    點擊SSH keys


    添加git服務器上生成的公鑰id_rsa.pub點擊Add key添加

    查看ssh公鑰信息

    準備工作已經完畢,右上角點擊創建一個新的倉庫

    填寫倉庫的信息

    創建成功後會跳轉到該倉庫,選擇ssh模式,複製版本倉庫克隆地址

    創建成功後會跳轉到該倉庫,選擇ssh模式,複製版本倉庫克隆地址[root@git-node1 ~]# git clone [email protected]:xubusi3/demo.git
    #
    手動克隆測試

    Cloning into ‘demo’…

    remote: Counting objects: 3, done.

    remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0

    Receiving objects: 100% (3/3), done.

    [root@git-node1 ~]# cat demo/README.md 
    #
    查看詳細信息

    # demo

    描述信息可以不寫

    [root@git-node1 ~]# cd demo/ #進入github clone下來的倉庫

    [root@git-node1 demo]# echo “test is git” >>test.txt #添加新文件

    [root@git-node1 demo]# git add test.txt #添加git暫存區

    [root@git-node1 demo]# git commit -m “add test file” #提交git版本倉庫

    [master 66cace0] add test file

    1 file changed, 1 insertion(+)

    create mode 100644 test.txt

    [root@git-node1 demo]# git remote #查看本機列表

    origin

    [root@git-node1 demo]# git push -u origin master
    #
    然後將本地的
    Git倉庫同步到遠程Github服務器上(第一次請加上參數-u,代表關聯本地與遠程)

    Counting objects: 4, done.

    Compressing objects: 100% (2/2), done.

    Writing objects: 100% (3/3), 281 bytes | 0 bytes/s, done.

    Total 3 (delta 0), reused 0 (delta 0)

    To [email protected]:xubusi3/demo.git

    1b836ba..66cace0 master -> master

    Branch master set up to track remote branch master from origin.

    刷新一下web,果然看到版本倉庫已經同步了

  19. Git客戶端工具

    https://www.sourcetreeapp.com/

    GitMercurialWindowsMac的客戶端


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