版本控制git

版本控制
Git
 
 

1.1    什麼是shell    4
1.2    shell分類    4
1.3    認識bash這個shell    5
1.4    vi編輯器    6
1.5    SSH    8

2.1    關於版本控制    10
2.2    本地版本控制系統    10
2.3    集中式版本控制系統    11
2.4    分佈式版本控制系統    12

3.1    Git安裝    13
3.2    Git工做原理    14
3.3    Git本地倉庫    15
3.3.1    Git基礎    15
3.3.2    Git分支    21
3.4    Git遠程(共享)倉庫    26
3.5    gitHub和gitLab    29
3.6    命令彙總    32
3.7    GitLab完整演示    34
3.8    衝突解決    35
3.9    Git高級    35
3.9.1    gitignore忽略文件    35
3.9.2    比較差別    36
3.9.3    更新倉庫    37
3.10    其它    38html


•Shell和vi
•什麼是shell
在計算機科學中,Shell俗稱殼,用來區別於Kernel(核),是指「提供使用者使用界面」的軟件(命令解析器)。它相似於DOS下的command和後來的cmd.exe。它接收用戶命令,而後調用相應的應用程序。node

•shell分類
一、圖形界面shell:經過提供友好的可視化界面,調用相應應用程序,如windows系列操做系統,Linux系統上的圖形化應用程序GNOME、KDE等。
二、命令行shell:經過鍵盤輸入特定命令的方式,調用相應的應用程序,如windows系統的cmd.exe、Windows PowerShell,Linux系統的Bourne shell ( sh)、Bourne Again shell ( bash)等。
•認識bash這個shell
在window系統下使用bash,須要一個軟件,這個軟件模擬集成了bash大部分命令。
各個 shell 的功能都差很少, Linux 默認使用 bash ,因此咱們主要學習bash的使用。
一、bash命令格式
命令 [-options]  [參數],如:tar  zxvf  demo.tar.gz
查看幫助:命令 --help
二、bash常見命令
pwd (Print Working Directory) 查看當前目錄
cd (Change Directory) 切換目錄,如 cd /etc
ls (List) 查看當前目錄下內容,如 ls -al
mkdir (Make Directory) 建立目錄,如 mkdir blog
touch 建立文件,如 touch index.html     
cat 查看文件所有內容,如 cat index.html
more less 查看文件,如more /etc/passwd、less /etc/passwd
rm (remove) 刪除文件,如 rm index.html、rm -rf  blog
rmdir (Remove Directory) 刪除文件夾,只能刪除空文件夾,不經常使用
mv (move) 移動文件或重命名,如 mv index.html ./demo/index.html
cp (copy) 複製文件,cp index.html ./demo/index.html
head 查看文件前幾行,如 head -5 index.html
tail 查看文件後幾行 –n –f,如 tail index.html、tail -f -n 5 index.html 
tab 自動補全,連按兩次會將全部匹配內容顯示出來
history 查看操做歷史
ssh 遠程登陸,如ssh root@gitlab.study.com
> 和 >>重定向,如echo hello world! > README.md,>覆蓋 >>追加
wget 下載,如wget https://nodejs.org/dist/v4.4.0/node-v4.4.0.tar.gz
tar 解壓縮,如tar zxvf node-v4.4.0.tar.gz
curl 網絡請求,如curl http://www.baidu.com
whoami 查看當前用戶
| 管道符能夠將多個命令鏈接使用,上一次(命令)的執行結果當成下一次(命令)的參數。
grep 匹配內容,通常結合管道符使用
•vi編輯器
如同Windows下的記事本,vi編輯器是Linux下的標配,經過它咱們能夠建立、編輯文件。它是一個隨系統一塊兒安裝的文本編輯軟件。
一、三種模式
vi編輯器提供了3種模式,分別是命令模式、插入模式、底行模式,每種模式下用戶所能進行的操做是不同的。
3種模式的切換以下圖所示:git

經過上圖咱們發現,輸入模式是不能直接切換到末行模式的,必需要先切回到命令模式(按ESC鍵)
二、使用vi編輯器
    a) 打開/建立文件, vi 文件路徑
    b) 底行模式 :w保存,:w filenme另存爲
    c) 底行模式 :q退出
    d) 底行模式 :wq保存並退出
    e) 底行模式 :e! 撤銷更改,返回到上一次保存的狀態
    f) 底行模式 :q! 不保存強制退出
    g) 底行模式 :set nu 設置行號
    h) 命令模式 ZZ(大寫)保存並退出
    i) 命令模式 u轍銷操做,可屢次使用
    j) 命令模式 dd刪除當前行
    k) 命令模式 yy複製當前行
    l) 命令模式 p 粘貼內容
    m) 命令模式 ctrl+f向前翻頁
    n) 命令模式 ctrl+b向後翻頁
    o) 命令模式 i進入編輯模式,當前光標處插入
    p) 命令模式 a進入編輯模式,當前光標後插入
    q) 命令模式 A進入編輯模式,光標移動到行尾
    r) 命令模式 o進入編輯模式,當前行下面插入新行
    s) 命令模式 O進入編輯模式,當前行上面插入新行
當咱們處在編輯模式的狀況下,和咱們在Windows編輯器的使用類似。
•SSH
SSH是一種網絡協議,用於計算機之間的加密登陸。
SSH只是一種協議,存在多種實現,既有商業實現,也有開源實現。本文針對的是OpenSSH,它是自由軟件,應用很是普遍。
若是要在Windows系統中使用SSH,會用到另外一種軟件PuTTY,咱們後面用到的Git客戶也集成了SSH
格式:ssh user@host
user 表明真實存在的用戶host表明要登陸的遠程計算機
常見有兩種加密技術,分別是對稱性加密和非對稱性加密,SSH屬於後者。
對稱加密算法在加密和解密時使用的是同一個密鑰;而非對稱加密算法須要兩個密鑰來進行加密和解密,這兩個祕鑰分別是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。
工做原理
公鑰和私鑰是成對出現,能夠經過ssh-keygen -t rsa來建立,既能夠經過密鑰來加密數據,也能夠經過私鑰來加密數據,若是是以公鑰進行的數據加密,只能與之相對應的私鑰才能夠解密,相反若是以私鑰進行的數據加密,則只能與之對應的公鑰才能夠將數據進行解密,這樣就能夠提升信息傳遞的安全性。
免密碼登陸
咱們能夠將本地機器上的公鑰保存到特定的遠程計算機上,這樣當咱們再次登陸訪問這臺遠程計算機時就能夠實現免密碼登陸了。
一、ssh-keygen -t rsa會建立公鑰和密鑰(默認在用戶目錄/.ssh目錄下)
二、ssh-copy-id user@host添加到對應遠程主機的用戶目錄/.ssh目錄下
三、也能夠登陸遠程主機,進入到用戶目錄/.ssh目錄下手動建立authorized_keys文件,並將自已的公鑰粘入該文件。
這部分具體實現細節,參照個人演示有個印象就能夠了。 
•版本控制
•;關於版本控制
版本控制(Version Control Systems)是一種記錄一個或若干文件內容變化,以便未來查閱特定版本修訂狀況的系統。這個系統能夠自動幫咱們備份文件的每一次更改,而且能夠很是方便的恢復到任意的備份(版本)狀態。
舉例:咱們一般都是手動的重命名一個文件進行備份的,index.html改爲index1.html或者index.html.bak等形式,而後這種方式對於單個文件咱們還可以管理,可是對於整個項目而言,就會成爲噩夢了!!!咱們不得不借助於軟件來實現。
實現版本控制的軟件有不少種類,大體能夠分爲本地版本控制系統、集中式版本控制系統、分佈式版本控制系統。
•本地版本控制系統
藉助軟件咱們能夠記錄下文件的每一次修改,以下圖所示,文件被修改後,記錄下了3個版本,這樣咱們經過版本控制系統(軟件)即可以很是方便的恢復到任意版本。github

這種類型的版本控制系統,功能比較單一,好比很難實現多人協同開發,因此如今幾乎不多使用了。
•集中式版本控制系統
實際開發環境,一個項目一般是由多人協做共同完成的,如何讓在不一樣終端上的開發者協同工做成了亟待解決的問題,集中式版本控制系統便應運而生了。它經過單一的集中管理的服務器,保存全部文件的修訂版本,協同工做的開發者都經過客戶端連到這臺服務器,取出最新的文件或者提交更新。其表明爲SVN,以下圖所示。算法

這種方式很好解決了多人協同開發的問題,可是也有一個弊端,若是集中管理的服務器出現故障,將會致使數據(版本)丟失的風險,另外協同開發者從集中服務器中更新數據時,嚴重依賴網絡,若是網絡不佳,也給開發帶來諸多不便。
•分佈式版本控制系統
分佈式版本控制系統,則不須要中央服務器,每一個協同開發者都擁有一個完整的版本庫,這麼一來,任何協同開發者用的服務器發生故障,過後均可以用其它協同開發者本地倉庫恢復。
因爲版本庫在本地計算機,也便再也不受網絡影響了。若是要將本地的修改,推送給其它協同開發者,還須要一臺共享服務器,全部開發者經過這臺共享服務器同步和更新數據。以下圖所示。shell

分佈式版本控制系統彌補了前面兩種版本控制系統的缺陷,成爲了版本控制的首選方案。其表明就是Git。
•Git
•Git安裝
Window安裝
http://git-scm.com/download/win下載Git客戶端軟件,和普通軟件安裝方式同樣。
Linux安裝
CentOS發行版:sudo yum install git
Ubuntu發行版:sudo apt-get install git
Mac安裝
打開Terminal直接輸入git命令,會自動提示,按提示引導安裝便可。
•Git工做原理
爲了更好的學習Git,咱們們必須瞭解Git管理咱們文件的3種狀態,分別是已提交(committed)、已修改(modified)和已暫存(staged),由此引入 Git 項目的三個工做區域的概念:Git 倉庫、工做目錄以及暫存區域。
」(IndeGit倉庫目錄是Git用來保存項目的元數據和對象數據庫的地方。 這是Git 中最重要的部分,從其它計算機克隆倉庫時,拷貝的就是這裏的數據。
工做目錄是對項目的某個版本獨立提取出來的內容。這些從Git倉庫的壓縮數據庫中提取出來的文件,放在磁盤上供你使用或修改。
暫存區域是一個文件,保存了下次將提交的文件列表信息,通常在Git倉庫目錄中。有時候也被稱做「索引x),不過通常說法仍是叫暫存區域。數據庫

基本的Git工做流程以下:
    一、在工做目錄中修改文件。
    二、暫存文件,將文件的快照放入暫存區域。
    三、提交文件,找到暫存區域的文件,將快照永久性存儲到Git倉庫目錄。
•Git本地倉庫
Git本地倉庫指的是開發者開發設備中的倉庫。
•Git基礎
命令行方式:任意目錄(建議開發目錄)右鍵 > Git Bash Here
一、配置用戶
配置用戶的意義在於記錄開發者信息,以便在版本控制記錄開發者的操做行爲,如lion於2016-08-24解決了一個bug。
git config --global user.name "自已的名字"
git config --global user.email "自已的郵箱地址"
--global 配置當前用戶全部倉庫
--system 配置當前計算機上全部用戶的全部倉庫
注:配置用戶只須要執行1次,能夠重複使用。
二、初始化倉庫
咱們若是想要利用git進行版本控制,須要將現有項目初始化爲一個倉庫,或者將一個已有的使用git進行版本控制的倉庫克隆到本地。
a) git initwindows

git init只是建立了一個名爲.git的隱藏目錄,這個目錄就是存儲咱們歷史版本的倉庫,ls -al 能夠查看。安全

b) 假如公司已有項目用了Git,那咱們就利用克隆
git clone 倉庫地址bash

執行完這個命令,會在當前目錄下生成一個Monment目錄(默認和倉庫名稱相同),這個即是已有一個使用Git管理的項目。

三、查看文件狀態
初始化倉庫後即可以進行開發了,進入到剛剛建立好並初始爲倉庫的目錄,添加咱們開發須要的文件。
經過git status能夠檢測當前倉庫文件的狀態

注:git會忽略空的目錄
四、添加文件到暫存區
假設通過一段時間的開發後,須要把已開發的部分存起來,使用git add 添加到暫存區。
git add 文件名 「*」或-A表明全部

放到暫存區的文件被標記成了綠色,等待提交。
注:顏色是工具給添加的,目的是增長可讀性並非git統一的。
五、撤銷更改
繼續咱們的開發
再次git status能夠再次查看倉庫狀態

說明index.html再次被修改了,並被標記了紅色。
又通過一段時間後發現新開發的部分有Bug,想要回到以前狀態,可使用git checkout 文件名。

注:從暫存區還原原到工做區
五、提交文件
通過一個相對較長階段開發或者一個功能開發完成了,就能夠提交到本地倉庫了,永久保存了。
git commit -m '備註信息'

將暫存區被標記成綠色的文件,所有提交到本地倉庫存儲。
這時git status查看狀態

沒有什麼可提交的,變的很乾淨。
六、查看提交歷史
反反覆覆開發了不少的功能了,經過git log查看一下提交的歷史。

咱們能夠查看到一次次提交記錄
commit 81b1e4fc2ae178caedf4575596377a80a6f1e73f
表明一次提交的惟一ID,通常稱爲SHA值。傻?
注:按鍵盤q鍵退出。
七、再次檢測倉庫文件狀態
隔了好些天后,繼續開發
git status 查看狀態

又提示有修改,等待從新添加到暫存區。
八、從新添加暫存區而後提交

九、再次查看歷史
git log 可查到全部提交歷史

這時能夠查看到更多提交歷史。
這時關掉全部目錄甚相當機!
十、恢復上一次提交的狀態
經過SHA值能夠回到以前某一次的提交(時光倒流)
git reset --hard c888a614e072e2這樣便回到了支付功能的狀態
git log再次查看發現最後一次提交成了支付功能了

倉庫示意圖

•Git分支
在咱們的現實開發中,需求每每是五花八門的,同時開發個需求的狀況十分常見,好比當你正在專一開發一個功能時,忽然有一個緊急的BUG須要你來修復,這個時候咱們固然是但願在可以保存當前任務進度,再去修改這個BUG,等這個BUG修復完成後再繼續咱們的任務。如何實現呢?
經過Git建立分支來解決實際開發中相似的問題。
在Git的使用過程當中一次提交稱爲歷史記錄(版本),而且會生成一個惟一的字符串,以下圖

這個串能夠表明某一個歷史版本(實際使用只取前面幾位就能夠),
值得注意的是全部的提交(commit)實際上都是在分支(branch)的基礎上進行的。
以下圖所示:

當咱們在初始化倉庫的時候(其實是產生第1次提交時),Git會默認幫咱們建立了一個master的分支,而且有指針(HEAD)指到了末端。
指針(HEAD)用來標明當前處於哪一個分支的哪一個版本,如上圖指的處於master分支的最後1個版本。
咱們也能夠建立自已的分支
一、建立分支
git branch hotfix
新的分支會在當前分支原有歷史版本的結點上進行建立,我稱其爲子分支以下圖

新建的子分支會繼承父分支的全部提交歷史。
二、切換分支
git checkout hotfix

咱們發現HEAD如今又指向了hotfix的末端。
三、再次提交操做
修改bug後,提交

此次的提交歷史版本就會記錄在hotfix這個分支上了,而且HEAD伴隨hotfix在移動。
四、當咱們再次切回到master時

當咱們切換回master後,HEAD指向了master分支的末端,而且咱們觀察發現咱們的文件內容仍是原來的「模樣」。
五、繼續以前的開發

總結:當咱們git checkout branchname時,HEAD會自動指向對應分支的末端,工做目錄中的源碼也會隨之發生改變。
這個時候咱們就在hotfix這個分支上修復了這個BUG,而咱們原來在master分支上的操做並未受到影響。
思考一個問題:
如今master這個分支上是否包含了hotfix的修復呢?
實際上從上圖能夠看出這時的master分支並無包含有hotfix的修復。
六、合併(融合)分支

這時master會有兩個父結點了,master便包含了hotfix裏的修復了
七、刪除分支
git branch -d hotfix
這時用來修復BUG建立的hotfix分支已經沒有用處了,咱們能夠將它刪除。

•Git遠程(共享)倉庫
經過上面學習咱們能夠很好的管理本地版本控制了,但是若是咱們下班回到家裏忽然來了靈感受得有部分代碼能夠優化,若是能接着公司電腦上的代碼繼續寫該有多好呀!另外一種情形,假設項目比較大,不一樣的功能模塊由不一樣的開發人員完成,不一樣模塊兒之間又不免會依賴關係,這時若是咱們的代碼互相合並(融合)該有多好呀!全部模塊開發完畢後,須要整合到一塊兒,要能作到準確無誤該有多好呀!
藉助一個遠程倉庫,你們能夠共享代碼、歷史版本等數據,即可以解決以上遇到的全部問題,在學習遠程倉庫前咱們先來學習git clone path這個命令。
三、建立共享倉庫
Git要求共享倉庫是一個以.git結尾的目錄。
mkdir repo.git 建立以.git結尾目錄
cd repo.git 進入這個目錄
git init --bare 初始化一個共享倉庫,也叫裸倉庫 注意選項--bare

這樣咱們就建好了一個共享的倉庫,但這時這個倉庫是一個空的倉庫,而且不允在這個倉庫中進行任何修改。
四、向共享倉庫共享(同步)內容
將自已開發的項目同步到這個目錄中,其它開發者就能夠共享你開發的項目了。
一、進入到yike目錄
二、git push ../repo.git master

這樣便把yike中的項目同步進了repo.git中。
五、從共享倉庫裏取出內容
一、新建立一個目錄(模擬另外一個開發者)
二、git clone ./repo.git demo

經過repo.git共享倉庫,咱們輕鬆獲得了一個yike的副本
六、經過demo倉庫向repo.git共享內容
進入到demo裏,咱們作一些修改
cd demo
git push ../repo.git master

七、在360倉庫從repo.git獲取共享的內容
cd yike
git pull ../repo.git master

奇蹟彷佛發生了,咱們輕鬆的將demo倉庫裏的內容,經過repo.git共享給了yike倉庫。
驚喜不斷,問題也老是不斷,咱們發現咱們這個共享的倉庫只是放到了本地的,其它人是沒有辦法從咱們這個共享倉庫共享內容的!!!
然而現實是,辦法老是有的!!!!
咱們把這個共享的倉庫放到一臺遠程服務器上,問題不就解決了嗎?
•gitHub和gitLab
若是咱們熟悉服務器的話,咱們徹底能夠將上述的步驟在咱們的遠程服務器上進行操做,而後再作一些登陸權限的設置,就可很是完美的搭建一個共享服務器了。其實爲了更好的管理咱們的倉庫,一些第三方機構開發出了Web版倉庫管理程序,經過Web界面形式管理倉庫。
gitHub關於它的名氣與意義,你們能夠自行查閱,咱們這裏介紹它的使用
一、註冊帳號並完善資料
自行註冊略過
二、建立共享倉庫

三、填寫倉庫資料

四、共享倉庫

遠程地址特別長,咱們能夠給他起一個別名
git remote add origin git@github.com:Botue/repo.git
這樣origin 就表明 git@github.com:Botue/repo.git
當咱們經過git clone 從共享倉庫獲內容時,會自動幫咱們添加origin到對應的倉庫地址,例如:git clone git@github.com:Botue/repo.git 會自動添加origin 對應 git@github.com:Botue/repo.git
五、生成密鑰
ssh-keygen -t rsa 而後一路回車,這裏會在當前用戶生成了一個.ssh的文件夾

將id_rsa.pub公鑰的內容複製
打開gitHub的我的中心

打到SSH keys

到此咱們即可以經過gitHub 提供的Web界面來管理咱們的倉庫了。
咱們發現經過gitHub管理倉庫實在是太方便了,但是隻能無償使用公開倉庫,自已公司的代碼固然不能公開了,但是私有倉庫又是須要交「保護費」的,無耐國人仍是比較喜歡免費的,網絡界老是有不少雷峯的,好比gitLab!!!
gitLab也是一個能夠經過Web界面管理倉庫的網站程序,咱們能夠把它架設到公司自已的服務器上,實現倉庫私有化,這也是大部分公司一般採用的方法,其使用方法與gitHub十分類似。
我將閒置電腦配置成了一臺服務器,上面架設了gitLab程序,咱們接下來的練習所有會在gitLab上進行演示。
省略不少內容.....
•命令彙總
git config配置本地倉庫
經常使用git config --global user.name、git config --global user.email
git config --list查看配置詳情
git init 初始一個倉庫,添加--bare能夠初始化一個共享(裸)倉庫
git status 能夠查看當前倉庫的狀態
git add「文件」 將工做區中的文件添加到暫存區中,其中file但是一個單獨的文件,也能夠是一個目錄、「*」、-A
git commit -m '備註信息' 將暫存區的文件,提交到本地倉庫
git log 能夠查看本地倉庫的提交歷史
git branch查看分支
git branch「分支名稱」 建立一個新的分支
git checkout「分支名稱」 切換分支
git checkout -b deeveloper 建立並切到developer分支
git merge「分支名稱」 合併分支
git branch -d 「分支名稱」 刪除分支
git clone 「倉庫地址」獲取已有倉庫的副本
git push origin 「本地分支名稱:遠程分支名稱」將本地分支推送至遠程倉庫,
git push origin hotfix(一般的寫法)至關於
git push origin hotfix:hotfix
git push origin hotfix:newfeature
本地倉庫分支名稱和遠程倉庫分支名稱同樣的狀況下能夠簡寫成一個,即git push 「倉庫地址」 「分支名稱」,若是遠程倉庫沒有對應分支,將會自動建立
git remote add 「主機名稱」 「遠程倉庫地址」添加遠程主機,即給遠程主機起個別名,方便使用
git remote 能夠查看已添加的遠程主機
git remote show 「主機名稱」能夠查看遠程主機的信息
•GitLab完整演示
沒錯,Git很是強大!
可是,若是咱們的分支不加以規範管理,也有可能拔苗助長!
一、不要有太多的樹杈(子分支)
二、要有一個「穩定分支」,即master分支不要輕意被修改
三、要有一個開發分支(developer),保證master分支的穩定性
四、全部的功能分支(feature)從developer建立
五、全部功能開發完成後新建發佈分支(release)

•衝突解決
假如兩個開發同時改到同一文件的同一段內容會發生什麼事情呢?
這時就會就會產生衝突了,當衝突產生後,須要開發者進行協商確認衝突的緣由,而後將衝突代碼刪除從新提交就能夠了。
•Git高級
熟悉掌握以上操做,基本上是能夠知足平常開的須要的,可是在解決一些特殊問題時,就又須要咱們可以掌握更多的命令。
•gitignore忽略文件
在項目根目錄下建立一個.gitignore文件,能夠將不但願提交的羅列在這個文件裏,如項目的配置文件、node_modules等
https://github.com/github/gitignore
•比較差別
當內容被修改,咱們沒法肯定修改哪些內容時,能夠經過git diff來進行差別比較。
git difftool 比較的是工做區和暫存的差別
git difftool 「SHA」比較與特定提交的差別
git difftool 「SHA」「SHA」比較某兩次提交的差別
git difftool 分支名稱 比較與某個分支的差別
二、回滾(撤銷)操做

HEAD 默認指向當前分支的「末端」,即最後的一次提交,可是咱們經過git reset 能夠改變HEAD的指向。
看狀況解釋(稍微複雜一些,理解就好)
一、git reset
--hard 工做區會變、歷史(HEAD)會變, 暫存區也變
--soft 只會變歷史(HEAD)
--mixed(默認是這個選項)歷史(HEAD)會變、暫存區也變,工做區不變
二、git checkout
git checkout SHA -- "某個文件",表明只是從SHA這個版中取出特定的文件,
和git reset 是有區別的,reset 重寫了歷史,checkout 則沒有。
•更新倉庫
在項目開發過程當中,常常性的會遇到遠程(共享)倉庫和本地倉庫不一致,咱們能夠經過git fetch 命令來更新本地倉庫,使本地倉庫和遠程(共享)倉庫保持一致。
git fetch  「遠程主機」
或者
git fetch 「遠程主機」 「分支名稱」
咱們要注意的是,利用git fetch 獲取的更新會保存在本地倉庫中,可是並無體現到咱們的工做目錄中,須要咱們再次利用git merge來將對應的分支合併(融合)到特定分支。以下
git pull origin 某個分支, 上操做至關於下面兩步
git fetch 
git merge origin/某個分支
問題:如何查看遠程主機上總共有多少個分支?
git branch -a 即可以查看全部(本地+遠程倉庫)分支了

•其它 刪除遠程分支git push origin --delete 分支名稱 刪除遠程分支git push origin :分支名稱

相關文章
相關標籤/搜索