Shell和vi
shell
在計算機科學中,Shell俗稱殼,用來區別于Kernel(核),是指“提供使用者使用界面”的軟件(命令解析器)。它類似于DOS下的command和后來的cmd.exe。它接收用戶命令,然后調用相應的應用程序
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的使用。
-
1 bash命令格式
命令 [-options] [參數],如:tar zxvf demo.tar.gz
查看幫助:命令 --help - 2 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 | 查看操作歷史 | ||
> 和 >> | 重定向, | 如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種模式的切換如下圖所示
通過上圖我們發現,輸入模式是不能直接切換到末行模式的,必須要先切回到命令模式(按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
來創建,既可以通過密鑰來加密數據,也可以通過私鑰來加密數據,如果是以公鑰進行的數據加密,只能與之相對應的私鑰才可以解密,相反如果以私鑰進行的數據加密,則只能與之對應的公鑰才可以將數據進行解密,這樣就可以提高信息傳遞的安全性。
免密碼登錄
我們可以將本地機器上的公鑰保存到特定的遠程計算機上,這樣當我們再次登錄訪問這臺遠程計算機時就可以實現免密碼登錄了。
- 1、ssh-keygen -t rsa會創建公鑰和密鑰(默認在用戶目錄/.ssh目錄下)
- 2、ssh-copy-id user@host添加到對應遠程主機的用戶目錄/.ssh目錄下
- 3、也可以登錄遠程主機,進入到用戶目錄/.ssh目錄下手動創建authorized_keys文件,并將自已的公鑰粘入該文件。
版本控制
關于版本控制
版本控制(Version Control Systems)是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。這個系統可以自動幫我們備份文件的每一次更改,并且可以非常方便的恢復到任意的備份(版本)狀態。
舉例:我們通常都是手動的重命名一個文件進行備份的,index.html改成index1.html或者index.html.bak等形式,然后這種方式對于單個文件我們還能夠管理,但是對于整個項目而言,就會成為噩夢了?。?!我們不得不借助于軟件來實現。
實現版本控制的軟件有很多種類,大致可以分為本地版本控制系統、集中式版本控制系統、分布式版本控制系統。
本地版本控制
借助軟件我們可以記錄下文件的每一次修改,如下圖所示,文件被修改后,記錄下了3個版本,這樣我們通過版本控制系統(軟件)便可以非常方便的恢復到任意版本。
這種類型的版本控制系統,功能比較單一,比如很難實現多人協同開發,所以現在幾乎很少使用了。
集中式版本控制
實際開發環境,一個項目通常是由多人協作共同完成的,如何讓在不同終端上的開發者協同工作成了亟待解決的問題,集中式版本控制系統便應運而生了。它通過單一的集中管理的服務器,保存所有文件的修訂版本,協同工作的開發者都通過客戶端連到這臺服務器,取出最新的文件或者提交更新。其代表為SVN,如下圖所示
這種方式很好解決了多人協同開發的問題,但是也有一個弊端,如果集中管理的服務器出現故障,將會導致數據(版本)丟失的風險,另外協同開發者從集中服務器中更新數據時,嚴重依賴網絡,如果網絡不佳,也給開發帶來諸多不便。
分布式版本控制系統
分布式版本控制系統,則不需要中央服務器,每個協同開發者都擁有一個完整的版本庫,這么一來,任何協同開發者用的服務器發生故障,事后都可以用其它協同開發者本地倉庫恢復。
由于版本庫在本地計算機,也便不再受網絡影響了。如果要將本地的修改,推送給其它協同開發者,還需要一臺共享服務器,所有開發者通過這臺共享服務器同步和更新數據。如下圖所示。
分布式版本控制系統彌補了前面兩種版本控制系統的缺陷,成為了版本控制的首選方案。其代表就是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 倉庫
、工作目錄
以及暫存區域
。
Git倉庫
目錄是Git用來保存項目的元數據和對象數據庫的地方。 這是Git 中最重要的部分,從其它計算機克隆倉庫時,拷貝的就是這里的數據。
工作目錄
是對項目的某個版本獨立提取出來的內容。這些從Git倉庫的壓縮數據庫中提取出
來的文件,放在磁盤上供你使用或修改。
暫存區域
是一個文件,保存了下次將提交的文件列表信息,一般在Git倉庫目錄中。有時候也被稱作“索引”(Index),不過一般說法還是叫暫存區域。
基本的Git工作流程如下:
- 1、在工作目錄中修改文件。
- 2、暫存文件,將文件的快照放入暫存區域。
- 3、提交文件,找到暫存區域的文件,將快照永久性存儲到Git倉庫目錄。
Git本地倉庫
Git本地倉庫值得是開發者開發設備中倉庫
Git基礎
命令行方式:任意目錄(建議開發根目錄)右鍵 > Git Bash Here
1.配置用戶
配置用戶的意義在于記錄開發者信息,以便在版本控制記錄開發者的操作行為,如lion于2016-08-24解決了一個bug。
git config --global user.name
"自已的名字"
git config --global user.email
"自已的郵箱地址"
--global
配置當前用戶所有倉庫
--system
配置當前計算機上所有用戶的所有倉庫
注:配置用戶只需要執行1次,可以重復使用。
2.初始化倉庫
我們如果想要利用git進行版本控制,需要將現有項目初始化為一個倉庫,或者將一個已有的使用git進行版本控制的倉庫克隆到本地.
- git init
git init
只是創建了一個名為.git
的隱藏目錄,這個目錄就是存儲我們歷史版本的倉庫,ls -al
可以查看。
- 假如公司已有項目用了Git,那我們就利用克隆
git clone
倉庫地址
執行完這個命令,會在當前目錄下生成一個
Monment目錄
(默認和倉庫名稱相同),這個便是已有一個使用Git管理的項目
查看文件狀態
初始化倉庫后便可以進行開發了,進入到剛剛創建好并初始為倉庫的目錄,添加我們開發需要的文件。
通過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
再次查看發現最后一次提交成了支付功能了
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
分支已經沒有用處了,我們可以將它刪除
Git遠程(共享)倉庫
通過上面學習我們可以很好的管理本地版本控制了,可是如果我們下班回到家里突然來了靈感覺得有部分代碼可以優化,如果能接著公司電腦上的代碼繼續寫該有多好呀!另一種情形,假設項目比較大,不同的功能模塊由不同的開發人員完成,不同模塊兒之間又難免會依賴關系,這時如果我們的代碼互相合并(融合)該有多好呀!所有模塊開發完畢后,需要整合到一起,要能做到準確無誤該有多好呀!
借助一個遠程倉庫,大家可以共享代碼、歷史版本等數據,便可以解決以上遇到的所有問題,在學習遠程倉庫前我們先來學習git clone path
這個命令。
創建共享倉庫
Git要求共享倉庫是一個以.git
結尾的目錄。
mkdir repo.git
創建以.git
結尾目錄
cd repo.git
進入這個目錄
git init --bare
初始化一個共享倉庫,也叫裸倉庫 注意選項--bare
這樣我們就建好了一個共享的倉庫,但這時這個倉庫是一個空的倉庫,并且不允在這個倉庫中進行任何修改
向共享倉庫共享(同步)內容
將自已開發的項目同步到這個目錄中,其它開發者就可以共享你開發的項目了。
- 1、進入到
yike
目錄 - 2、
git push ../repo.git master
這樣便把yike
中的項目同步進了repo.git
中。
5.從共享倉庫里取出內容
1、新創建一個目錄(模擬另一個開發者)
2、git 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
倉庫。
驚喜不斷,問題也總是不斷,我們發現我們這個共享的倉庫只是放到了本地的,其它人是沒有辦法從我們這個共享倉庫共享內容的?。?!
然而現實是,辦法總是有的?。。。?br>
我們把這個共享的倉庫放到一臺遠程服務器上,問題不就解決了嗎?
gitHub和gitLab
如果我們熟悉服務器的話,我們完全可以將上述的步驟在我們的遠程服務器上進行操作,然后再做一些登錄權限的設置,就可非常完美的搭建一個共享服務器了。其實為了更好的管理我們的倉庫,一些第三方機構開發出了Web版倉庫管理程序,通過Web界面形式管理倉庫。
gitHub關于它的名氣與意義,大家可以自行查閱,我們這里介紹它的使用
1、注冊賬號并完善資料
自行注冊略過
2、創建共享倉庫
3、填寫倉庫資料
4、共享倉庫
遠程地址特別長,我們可以給他起一個別名
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
5、生成密鑰
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 deevelope | r 他健并切到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非常強大!
但是,如果我們的分支不加以規范管理,也
有可能適得其反!
- 1、不要有太多的樹杈(子分支)
- 2、要有一個“穩定分支”,即master分支不要輕意被修改
- 3、要有一個開發分支(developer),保證master分支的穩定性
- 4、所有的功能分支(feature)從developer創建
-
5、所有功能開發完成后新建發布分支(release)
Git工作流-1.png
沖突解決
假如兩個開發同時改到同一文件的同一段內容會發生什么事情呢?
這時就會就會產生沖突了,當沖突產生后,需要開發者進行協商確認沖突的原因,然后將沖突代碼刪除重新提交就可以了。
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的指向。
- 1、git reset
--hard
工作區會變、歷史(HEAD)會變, 暫存區也變
--soft
只會變歷史(HEAD)
--mixed
(默認是這個選項)歷史(HEAD)會變、暫存區也變,工作區不變 - 2、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 :分支名稱