1. 程式人生 > >git 介紹及其使用總結

git 介紹及其使用總結

實現 之前 demo hang 喜歡 權限 sof 區別 rec

版本控制

Git


目錄

目錄 2

1章 Shellvi 4

1.1 什麽是shell 4

1.2 shell分類 4

1.3 認識bash這個shell 5

1.4 vi編輯器 6

1.5 SSH 8

2章 版本控制 10

2.1 關於版本控制 10

2.2 本地版本控制系統 10

2.3 集中式版本控制系統 11

2.4 分布式版本控制系統 12

3章 Git 13

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 gitHubgitLab 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 其它 38

第1章Shell和vi

1.1 什麽是shell

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

1.2 shell分類

1、圖形界面shell:通過提供友好的可視化界面,調用相應應用程序,如windows系列操作系統UnixLinux系統上的圖形化應用程序GNOME、KDE等。

2、命令行shell:通過鍵盤輸入特定命令的方式,調用相應的應用程序,如windows系統的cmd.exeWindows PowerShellLinux系統的Bourne shell ( sh)、Bourne Again shell ( bash)等。

1.3 認識bash這個shell

window系統下使用bash,需要一個軟件,這個軟件模擬集成bash大部分命令。

個 shell 的功能都差不多, Linux 默認使用

bash 所以我們主要學習bash的使用。

1bash命令格式

命令 [-options] [參數],如:tar zxvf demo.tar.gz

查看幫助:命令 --help

2bash常見命令

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/passwdless /etc/passwd

rm (remove) 刪除文件,如 rm index.htmlrm -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.htmltail -f -n 5 index.html

tab 自動補全,連按兩次會將所有匹配內容顯示出來

history 查看操作歷史

ssh 遠程登錄,如ssh [email protected]

> >>重定向,如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 匹配內容,一般結合管道符使用

1.4 vi編輯器

如同Windows下的記事本,vi編輯器是Linux下的標配,通過它我們可以創建、編輯文件。它是一個隨系統一起安裝的文本編輯軟件。

1、三種模式

vi編輯器提供了3種模式,分別是命令模式、插入模式、底行模式,每種模式下用戶所能進行的操作是不一樣的。

3種模式的切換如下圖所示:

通過上圖我們發現,輸入模式是不能直接切換到末行模式的,必須要先切回到命令模式(按ESC鍵)

2、使用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編輯器的使用相似。

1.5 SSH

SSH是一種網絡協議,用於計算機之間的加密登錄。

SSH只是一種協議,存在多種實現,既有商業實現,也有開源實現。本文針對的是OpenSSH,它是自由軟件,應用非常廣泛。

如果要在Windows系統中使用SSH,會用到另一種軟件PuTTY,我們後面用到的Git客戶也集成了SSH

格式:ssh [email protected]

user 代表真實存在的用戶host代表要登錄的遠程計算機

常見有兩種加密技術,分別是對稱性加密和非對稱性加密SSH屬於後者。

對稱加密算法在加密和解密時使用的是同一個鑰;而非對稱加密算法需要兩個密鑰來進行加密和解密,這兩個秘鑰分別公開密鑰public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)

工作原理

公鑰和私鑰是成對出現,可以通過ssh-keygen -t rsa來創建,既可以通過密鑰來加密數據,也可以通過私鑰來加密數據,如果是以公鑰進行的數據加密,只能與之相對應的私鑰才可以解密,相反如果以私鑰進行的數據加密,則只能與之對應的公鑰才可以將數據進行解密,這樣就可以提高信息傳遞的安全性。

免密碼登錄

我們可以將本地機器上的公鑰保存到特定的遠程計算機上,這樣當我們再次登錄訪問這臺遠程計算機時就可以實現免密碼登錄了。

1ssh-keygen -t rsa會創建公鑰和密鑰(默認在用戶目錄/.ssh目錄下)

2ssh-copy-id [email protected]添加到對應遠程主機的用戶目錄/.ssh目錄下

3、也可以登錄遠程主機,進入到用戶目錄/.ssh目錄下手動創建authorized_keys文件,並將自已的公鑰粘入該文件。

這部分具體實現細節,參照我的演示有個印象就可以了。

第2章版本控制

2.1 關於版本控制

版本控制(Version Control Systems)是一種記錄一個或若幹文件內容變化,以便將來查閱特定版本修訂情況的系統。這個系統可以自動幫我們備份文件的每一次更改,並且可以非常方便的恢復到任意的備份(版本)狀態。

舉例:我們通常都是手動的重命名一個文件進行備份的,index.html改成index1.html或者index.html.bak等形式,然後這種方式對於單個文件我們還能夠管理,但是對於整個項目而言,就會成為噩夢了!!!我們不得不借助於軟件來實現。

實現版本控制的軟件有很多種類,大致可以分為本地版本控制系統、集中式版本控制系統、分布式版本控制系統。

2.2 本地版本控制系統

借助軟件我們可以記錄下文件的每一次修改,如下圖所示,文件被修改後,記錄下了3個版本,這樣我們通過版本控制系統(軟件)便可以非常方便的恢復到任意版本。

這種類型的版本控制系統,功能比較單一,比如很難實現多人協同開發,所以現在幾乎很少使用了。

2.3 集中式版本控制系統

實際開發環境,一個項目通常是由多人協作共同完成的,如何讓在不同終端上的開發者協同工作成了亟待解決的問題,集中式版本控制系統便應運而生了。它通過單一的集中管理的服務器,保存所有文件的修訂版本,協同工作的開發者都通過客戶端連到這臺服務器,取出最新的文件或者提交更新。其代表為SVN,如下圖所示。

這種方式很好解決了多人協同開發的問題,但是也有一個弊端,如果集中管理的服務器出現故障,將會導致數據(版本)丟失的風險,另外協同開發者從集中服務器中更新數據時,嚴重依賴網絡,如果網絡不佳,也給開發帶來諸多不便。

2.4 分布式版本控制系統

分布式版本控制系統,則不需要中央服務器,每個協同開發者都擁有一個完整的版本庫,這麽一來,任何協同開發者用的服務器發生故障,事後都可以用其它協同開發者本地倉庫恢復。

由於版本庫在本地計算機,也便不再受網絡影響了。如果要將本地的修改,推送給其它協同開發者,還需要一臺共享服務器,所有開發者通過這臺共享服務器同步和更新數據。如下圖所示。

分布式版本控制系統彌補了前面兩種版本控制系統的缺陷,成為了版本控制的首選方案。其代表就是Git。

第3章Git

3.1 Git安裝

Window安裝

http://git-scm.com/download/win下載Git客戶端軟件,和普通軟件安裝方式一樣。

Linux安裝

CentOS發行版:sudo yum install git

Ubuntu發行版:sudo apt-get install git

Mac安裝

打開Terminal直接輸入git命令,會自動提示,按提示引導安裝即可。

3.2 Git工作原理

為了更好的學習Git,我們們必須了解Git管理我們文件的3種狀態,分別是已提交committed)、已修改(modified)和已暫存(staged由此引入 Git 項目的三個工作區域的概念:Git 倉庫、工作目錄以及暫存區域。

Git倉庫目錄是Git用來保存項目的元數據和對象數據庫的地方。 這是Git 中最重要的部分,從其它計算機克隆倉庫時,拷貝的就是這裏的數據。

工作目錄是對項目的某個版本獨立提取出來的內容。這些從Git倉庫的壓縮數據庫中提取出來的文件,放在磁盤上供你使用或修改

暫存區域是一個文件,保存了下次將提交的文件列表信息,一般在Git倉庫目錄中。有時候也被稱作索引”(Index,不過一般說法還是叫暫存區域。

基本的Git工作流程如下

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

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

3提交文件,找到暫存區域的文件,將快照永久性存儲到Git倉庫目錄。

3.3 Git本地倉庫

Git本地倉庫指的是開發者開發設備中的倉庫。

3.3.1 Git基礎

命令行方式:任意目錄(建議開發目錄)右鍵 > Git Bash Here

1、配置用戶

配置用戶的意義在於記錄開發者信息,以便在版本控制記錄開發者的操作行為,如lion2016-08-24解決了一個bug

git config --global user.name "自已的名字"

git config --global user.email "自已的郵箱地址"

--global 配置當前用戶所有倉庫

--system 配置當前計算機上所有用戶的所有倉庫

註:配置用戶只需要執行1次,可以重復使用。

2、初始化倉庫

我們如果想要利用git進行版本控制,需要將現有項目初始化為一個倉庫,或者將一個已有的使用git進行版本控制的倉庫克隆到本地。

a) git init

git init只是創建了一個名為.git的隱藏目錄,這個目錄就是存儲我們歷史版本的倉庫,ls -al 可以查看。

b) 假如公司已有項目用了Git,那我們就利用克隆

git clone 倉庫地址

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

3、查看文件狀態

初始化倉庫後便可以進行開發了,進入到剛剛創建好並初始為倉庫的目錄,添加我們開發需要的文件。

通過git status可以檢測當前倉庫文件的狀態

註:git會忽略空的目錄

4、添加文件到暫存區

假設經過一段時間的開發後,需要把已開發的部分存起來,使用git add 添加到暫存區。

git add 文件名 “*”或-A代表所有

放到暫存區的文件被標記成了綠色,等待提交。

註:顏色是工具給添加的,目的是增加可讀性並不是git統一的。

5、撤銷更改

繼續我們的開發

再次git status可以再次查看倉庫狀態

說明index.html再次被修改了,並被標記了紅色。

又經過一段時間後發現新開發的部分有Bug,想要回到之前狀態,可以使用git checkout 文件名。

註:從暫存區還原原到工作區

5、提交文件

經過一個相對較長階段開發或者一個功能開發完成了,就可以提交到本地倉庫了,永久保存了。

git commit -m ‘備註信息

將暫存區被標記成綠色的文件,全部提交到本地倉庫存儲。

這時git status查看狀態

沒有什麽可提交的,變的很幹凈。

6、查看提交歷史

反反復復開發了很多的功能了,通過git log查看一下提交的歷史。

我們可以查看到一次次提交記錄

commit 81b1e4fc2ae178caedf4575596377a80a6f1e73f

代表一次提交的唯一ID,一般稱為SHA值。傻?

註:按鍵盤q鍵退出。

7、再次檢測倉庫文件狀態

隔了好些天後,繼續開發

git status 查看狀態

又提示有修改,等待重新添加到暫存區。

8、重新添加暫存區然後提交

9、再次查看歷史

git log 可查到所有提交歷史

這時可以查看到更多提交歷史。

這時關掉所有目錄甚至關機!

10、恢復上一次提交的狀態

通過SHA值可以回到之前某一次的提交(時光倒流)

git reset --hard c888a614e072e2這樣便回到了支付功能的狀態

git log再次查看發現最後一次提交成了支付功能了

倉庫示意圖

3.3.2 Git分支

在我們的現實開發中,需求往往是五花八門的,同時開發個需求的情況十分常見,比如當你正在專註開發一個功能時,突然有一個緊急的BUG需要你來修復,這個時候我們當然是希望在能夠保存當前任務進度,再去修改這個BUG,等這個BUG修復完成後再繼續我們的任務。如何實現呢?

通過Git創建分支來解決實際開發中類似的問題

Git的使用過程中一次提交稱為歷史記錄(版本),並且會生成一個唯一的字符串,如下圖

這個串可以代表某一個歷史版本(實際使用只取前面幾位就可以),

值得註意的是所有的提交commit)實際上都是在分支branch)的基礎上進行的。

如下圖所示:

當我們在初始化倉庫的時候(實際上是產生第1次提交時),Git默認幫我們創建了一個master的分支,並且有指針HEAD)指到了末端。

指針(HEAD)用來標明當前處於哪個分支的哪個版本,如上圖指的處於master分支的最後1個版本。

我們也可以創建自已的分支

1、創建分支

git branch hotfix

新的分支會在當前分支原有歷史版本的結點上進行創建,我稱其為子分支如下圖

新建的子分支會繼承父分支的所有提交歷史。

2、切換分支

git checkout hotfix

我們發現HEAD現在又指向了hotfix末端。

3、再次提交操作

修改bug後,提交

這次的提交歷史版本就會記錄在hotfix這個分支上了,並且HEAD伴隨hotfix在移動

4、當我們再次切回到master

當我們切換回master後,HEAD指向了master分支的末端,並且我們觀察發現我們的文件內容還是原來的“模樣”。

5、繼續之前的開發

總結:當我們git checkout branchname時,HEAD會自動指向對應分支的末端,工作目錄中的源碼也會隨之發生改變。

這個時候我們就在hotfix這個分支上修復了這個BUG,而我們原來在master分支上的操作並未受到影響。

思考一個問題:

現在master這個分支上是否包含了hotfix的修復呢?

實際上從上圖可以看出這時的master分支並沒有包含有hotfix的修復。

6、合並(融合)分支

這時master會有兩個父結點了,master便包含了hotfix裏的修復了

7、刪除分支

git branch -d hotfix

這時用來修復BUG創建的hotfix分支已經沒有用處了,我們可以將它刪除。

3.4 Git遠程(共享)倉庫

通過上面學習我們可以很好的管理本地版本控制了,可是如果我們下班回到家裏突然來了靈感覺得有部分代碼可以優化,如果能接著公司電腦上的代碼繼續寫該有多好呀!另一種情形,假設項目比較大,不同的功能模塊由不同的開發人員完成,不同模塊兒之間又難免會依賴關系,這時如果我們的代碼互相合並(融合)該有多好呀!所有模塊開發完畢後,需要整合到一起,要能做到準確無誤該有多好呀!

借助一個遠程倉庫,大家可以共享代碼、歷史版本等數據,便可以解決以上遇到的所有問題,在學習遠程倉庫前我們先來學習git clone path這個命令。

3、創建共享倉庫

Git要求共享倉庫是一個以.git結尾的目錄。

mkdir repo.git 創建以.git結尾目錄

cd repo.git 進入這個目錄

git init --bare 初始化一個共享倉庫,也叫裸倉庫 註意選項--bare

這樣我們就建好了一個共享的倉庫,但這時這個倉庫是一個空的倉庫,並且不允在這個倉庫中進行任何修改。

4、向共享倉庫共享(同步)內容

將自已開發的項目同步到這個目錄中,其它開發者就可以共享你開發的項目了。

1、進入到yike目錄

2git push ../repo.git master

這樣便把yike中的項目同步進了repo.git中。

5、從共享倉庫裏取出內容

1、新創建一個目錄(模擬另一個開發者)

2git clone ./repo.git demo

通過repo.git共享倉庫,我們輕松得到了一個yike的副本

6、通過demo倉庫向repo.git共享內容

進入到demo裏,我們做一些修改

cd demo

git push ../repo.git master

7、在360倉庫從repo.git獲取共享的內容

cd yike

git pull ../repo.git master

奇跡似乎發生了,我們輕松的將demo倉庫裏的內容,通過repo.git共享給了yike倉庫。

驚喜不斷,問題也總是不斷,我們發現我們這個共享的倉庫只是放到了本地的,其它人是沒有辦法從我們這個共享倉庫共享內容的!!!

然而現實是,辦法總是有的!!!!

我們把這個共享的倉庫放到一臺遠程服務器上,問題不就解決了嗎?

3.5 gitHubgitLab

如果我們熟悉服務器的話,我們完全可以將上述的步驟在我們的遠程服務器上進行操作,然後再做一些登錄權限的設置,就可非常完美的搭建一個共享服務器了。其實為了更好的管理我們的倉庫,一些第三方機構開發出了Web版倉庫管理程序,通過Web界面形式管理倉庫。

gitHub關於它的名氣與意義,大家可以自行查閱,我們這裏介紹它的使用

1、註冊賬號並完善資料

自行註冊略過

2、創建共享倉庫

3、填寫倉庫資料

4、共享倉庫

遠程地址特別長,我們可以給他起一個別名

git remote add origin [email protected]:Botue/repo.git

這樣origin 就代表 [email protected]:Botue/repo.git

當我們通過git clone 從共享倉庫獲內容時,會自動幫我們添加origin到對應的倉庫地址,例如:git clone [email protected]:Botue/repo.git 會自動添加origin 對應 [email protected]:Botue/repo.git

5、生成密鑰

ssh-keygen -t rsa 然後一路回車,這裏會在當前用戶生成了一個.ssh的文件夾

id_rsa.pub公鑰的內容復制

打開gitHub的個人中心

打到SSH keys

到此我們便可以通過gitHub 提供的Web界面來管理我們的倉庫了。

我們發現通過gitHub管理倉庫實在是太方便了,可是只能免費使用公開倉庫,自已公司的代碼當然不能公開了,可是私有倉庫又是需要交“保護費”的,無耐國人還是比較喜歡免費的,網絡界總是有很多雷峰的,比如gitLab!!!

gitLab也是一個可以通過Web界面管理倉庫的網站程序,我們可以把它架設到公司自已的服務器上,實現倉庫私有化,這也是大部分公司通常采用的方法,其使用方法與gitHub十分相似。

我將閑置電腦配置成了一臺服務器,上面架設了gitLab程序,我們接下來的練習全部會在gitLab上進行演示。

省略很多內容.....

3.6 命令匯總

git config配置本地倉庫

常用git config --global user.namegit 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 “主機名稱”可以查看遠程主機的信息

3.7 GitLab完整演示

沒錯,Git非常強大!

但是,如果我們的分支不加以規範管理,也有可能適得其反!

1、不要有太多的樹杈(子分支)

2、要有一個“穩定分支”,即master分支不要輕意被修改

3、要有一個開發分支(developer),保證master分支的穩定性

4、所有的功能分支(feature)從developer創建

5、所有功能開發完成後新建發布分支(release

3.8 沖突解決

假如兩個開發同時改到同一文件的同一段內容會發生什麽事情呢?

這時就會就會產生沖突了,當沖突產生後,需要開發者進行協商確認沖突的原因,然後將沖突代碼刪除重新提交就可以了。

3.9 Git高級

熟悉掌握以上操作,基本上是可以滿足日常開的需要的,但是在解決一些特殊問題時,就又需要我們能夠掌握更多的命令。

3.9.1 gitignore忽略文件

在項目根目錄下創建一個.gitignore文件,可以將不希望提交的羅列在這個文件裏,如項目的配置文件、node_modules等

https://github.com/github/gitignore

3.9.2 比較差異

當內容被修改,我們無法確定修改哪些內容時,可以通過git diff來進行差異比較。

git difftool 比較的是工作區和暫存的差異

git difftool SHA”比較與特定提交的差異

git difftool SHA”“SHA”比較某兩次提交的差異

git difftool 分支名稱 比較與某個分支的差異

2、回滾(撤銷)操作

HEAD 默認指向當前分支的“末端”,即最後的一次提交,但是我們通過git reset 可以改變HEAD的指向。

看情況解釋(稍微復雜一些,理解就好)

1git reset

--hard 工作區會變、歷史(HEAD)會變, 暫存區也變

--soft 只會變歷史(HEAD)

--mixed(默認是這個選項)歷史(HEAD)會變、暫存區也變,工作區不變

2git checkout

git checkout SHA -- "某個文件",代表只是從SHA這個版中取出特定的文件,

git reset 是有區別的,reset 重寫了歷史,checkout 則沒有

3.9.3 更新倉庫

在項目開發過程中,經常性的會遇到遠程(共享)倉庫和本地倉庫不一致,我們可以通過git fetch 命令來更新本地倉庫,使本地倉庫和遠程(共享)倉庫保持一致。

git fetch “遠程主機”

或者

git fetch “遠程主機” “分支名稱”

我們要註意的是,利用git fetch 獲取的更新會保存在本地倉庫中,但是並沒有體現到我們的工作目錄中,需要我們再次利用git merge來將對應的分支合並(融合)到特定分支。如下

git pull origin 某個分支, 上操作相當於下面兩步

git fetch

git merge origin/某個分支

問題:如何查看遠程主機上總共有多少個分支?

git branch -a 便可以查看所有(本地+遠程倉庫)分支了

3.10 其它

刪除遠程分支git push origin --delete 分支名稱

刪除遠程分支git push origin :分支名稱

git 介紹及其使用總結