Shell和vi
shell
在計(jì)算機(jī)科學(xué)中,Shell俗稱殼,用來區(qū)別于Kernel(核),是指“提供使用者使用界面”的軟件(命令解析器)。它類似于DOS下的command和后來的cmd.exe。它接收用戶命令,然后調(diào)用相應(yīng)的應(yīng)用程序
shell的分類
- 圖形界面shell:通過提供友好的可視化界面,調(diào)用相應(yīng)應(yīng)用程序,如windows系列操作系統(tǒng),Linux系統(tǒng)上的圖形化應(yīng)用程序GNOME、KDE等.
- 命令行shell:通過鍵盤輸入特定命令的方式,調(diào)用相應(yīng)的應(yīng)用程序,如windows系統(tǒng)的cmd.exe、Windows PowerShell,Linux系統(tǒng)的Bourne shell ( sh)、Bourne Again shell ( bash)等。
認(rèn)識(shí)bash這個(gè)shell
在window系統(tǒng)下使用bash,需要一個(gè)軟件,這個(gè)軟件模擬集成了bash大部分命令。
各個(gè) shell 的功能都差不多, Linux 默認(rèn)使用 bash ,所以我們主要學(xué)習(xí)bash的使用。
-
1 bash命令格式
命令 [-options] [參數(shù)],如:tar zxvf demo.tar.gz
查看幫助:命令 --help - 2 bash常見命令
| 命令 | 描述 | 舉例 | |
|---|---|---|---|
| pwd (Print Working Directory) | 查看當(dāng)前目錄 | ||
| cd (Change Directory) | 切換目錄, | 如 cd /etc | |
| ls (List) | 查看當(dāng)前目錄下內(nèi)容, | 如 ls -al | |
| mkdir (Make Directory) | 創(chuàng)建目錄, | 如 mkdir blog | |
| touch | 創(chuàng)建文件, | 如 touch index.html | |
| cat | 查看文件全部內(nèi)容, | 如 cat index.html | |
| more/less | 查看文件, | 如more /etc/passwd、less /etc/passwd | |
| rm (remove) | 刪除文件, | 如 rm index.html、rm -rf blog | |
| rmdir (Remove Directory) | 刪除文件夾,只能刪除空文件夾,不常用 | ||
| mv (move) | 移動(dòng)文件或重命名, | 如 mv index.html ./demo/index.html | |
| cp (copy) | 復(fù)制文件, | cp index.html ./demo/index.html | |
| head | 查看文件前幾行, | 如 head -5 index.html | |
| tail | 查看文件后幾行 –n –f, | 如 tail index.html、tail -f -n 5 index.html | |
| tab | 自動(dòng)補(bǔ)全,連按兩次會(huì)將所有匹配內(nèi)容顯示出來 | ||
| 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 | 網(wǎng)絡(luò)請(qǐng)求, | 如curl http://www.baidu.com | |
| whoami | 查看當(dāng)前用戶 |
管道符可以將多個(gè)命令連接使用,上一次(命令)的執(zhí)行結(jié)果當(dāng)成下一次(命令)的參數(shù)。
grep 匹配內(nèi)容,一般結(jié)合管道符使用
vi 編輯器
如同Windows下的記事本,vi編輯器是Linux下的標(biāo)配,通過它我們可以創(chuàng)建、編輯文件。它是一個(gè)隨系統(tǒng)一起安裝的文本編輯軟件.
三種模式
vi編輯器提供了3種模式,分別是命令模式、插入模式、底行模式,每種模式下用戶所能進(jìn)行的操作是不一樣的。
3種模式的切換如下圖所示

通過上圖我們發(fā)現(xiàn),輸入模式是不能直接切換到末行模式的,必須要先切回到命令模式(按ESC鍵)
使用vi編輯器
- a) 打開/創(chuàng)建文件, vi 文件路徑
- b) 底行模式 :w保存,:w filenme另存為
- c) 底行模式 :q退出
- d) 底行模式 :wq保存并退出
- e) 底行模式 :e! 撤銷更改,返回到上一次保存的狀態(tài)
- f) 底行模式 :q! 不保存強(qiáng)制退出
- g) 底行模式 :set nu 設(shè)置行號(hào)
- h) 命令模式 ZZ(大寫)保存并退出
- i) 命令模式 u轍銷操作,可多次使用
- j) 命令模式 dd刪除當(dāng)前行
- k) 命令模式 yy復(fù)制當(dāng)前行
- l) 命令模式 p 粘貼內(nèi)容
- m) 命令模式 ctrl+f向前翻頁
- n) 命令模式 ctrl+b向后翻頁
- o) 命令模式 i進(jìn)入編輯模式,當(dāng)前光標(biāo)處插入
- p) 命令模式 a進(jìn)入編輯模式,當(dāng)前光標(biāo)后插入
- q) 命令模式 A進(jìn)入編輯模式,光標(biāo)移動(dòng)到行尾
- r) 命令模式 o進(jìn)入編輯模式,當(dāng)前行下面插入新行
- s) 命令模式 O進(jìn)入編輯模式,當(dāng)前行上面插入新行
當(dāng)我們處在編輯模式的情況下,和我們?cè)赪indows編輯器的使用相似
SSH
SSH是一種網(wǎng)絡(luò)協(xié)議,用于計(jì)算機(jī)之間的加密登錄。
SSH只是一種協(xié)議,存在多種實(shí)現(xiàn),既有商業(yè)實(shí)現(xiàn),也有開源實(shí)現(xiàn)。本文針對(duì)的是OpenSSH,它是自由軟件,應(yīng)用非常廣泛。
如果要在Windows系統(tǒng)中使用SSH,會(huì)用到另一種軟件PuTTY,我們后面用到的Git客戶也集成了SSH
格式:ssh user@host
user 代表真實(shí)存在的用戶host代表要登錄的遠(yuǎn)程計(jì)算機(jī)
常見有兩種加密技術(shù),分別是對(duì)稱性加密和非對(duì)稱性加密,SSH屬于后者。
對(duì)稱加密算法在加密和解密時(shí)使用的是同一個(gè)密鑰;而非對(duì)稱加密算法需要兩個(gè)密鑰來進(jìn)行加密和解密,這兩個(gè)秘鑰分別是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。
工作原理
公鑰和私鑰是成對(duì)出現(xiàn),可以通過ssh-keygen -t rsa來創(chuàng)建,既可以通過密鑰來加密數(shù)據(jù),也可以通過私鑰來加密數(shù)據(jù),如果是以公鑰進(jìn)行的數(shù)據(jù)加密,只能與之相對(duì)應(yīng)的私鑰才可以解密,相反如果以私鑰進(jìn)行的數(shù)據(jù)加密,則只能與之對(duì)應(yīng)的公鑰才可以將數(shù)據(jù)進(jìn)行解密,這樣就可以提高信息傳遞的安全性。
免密碼登錄
我們可以將本地機(jī)器上的公鑰保存到特定的遠(yuǎn)程計(jì)算機(jī)上,這樣當(dāng)我們?cè)俅蔚卿浽L問這臺(tái)遠(yuǎn)程計(jì)算機(jī)時(shí)就可以實(shí)現(xiàn)免密碼登錄了。
- 1、ssh-keygen -t rsa會(huì)創(chuàng)建公鑰和密鑰(默認(rèn)在用戶目錄/.ssh目錄下)
- 2、ssh-copy-id user@host添加到對(duì)應(yīng)遠(yuǎn)程主機(jī)的用戶目錄/.ssh目錄下
- 3、也可以登錄遠(yuǎn)程主機(jī),進(jìn)入到用戶目錄/.ssh目錄下手動(dòng)創(chuàng)建authorized_keys文件,并將自已的公鑰粘入該文件。
版本控制
關(guān)于版本控制
版本控制(Version Control Systems)是一種記錄一個(gè)或若干文件內(nèi)容變化,以便將來查閱特定版本修訂情況的系統(tǒng)。這個(gè)系統(tǒng)可以自動(dòng)幫我們備份文件的每一次更改,并且可以非常方便的恢復(fù)到任意的備份(版本)狀態(tài)。
舉例:我們通常都是手動(dòng)的重命名一個(gè)文件進(jìn)行備份的,index.html改成index1.html或者index.html.bak等形式,然后這種方式對(duì)于單個(gè)文件我們還能夠管理,但是對(duì)于整個(gè)項(xiàng)目而言,就會(huì)成為噩夢了?。?!我們不得不借助于軟件來實(shí)現(xiàn)。
實(shí)現(xiàn)版本控制的軟件有很多種類,大致可以分為本地版本控制系統(tǒng)、集中式版本控制系統(tǒng)、分布式版本控制系統(tǒng)。
本地版本控制
借助軟件我們可以記錄下文件的每一次修改,如下圖所示,文件被修改后,記錄下了3個(gè)版本,這樣我們通過版本控制系統(tǒng)(軟件)便可以非常方便的恢復(fù)到任意版本。

這種類型的版本控制系統(tǒng),功能比較單一,比如很難實(shí)現(xiàn)多人協(xié)同開發(fā),所以現(xiàn)在幾乎很少使用了。
集中式版本控制
實(shí)際開發(fā)環(huán)境,一個(gè)項(xiàng)目通常是由多人協(xié)作共同完成的,如何讓在不同終端上的開發(fā)者協(xié)同工作成了亟待解決的問題,集中式版本控制系統(tǒng)便應(yīng)運(yùn)而生了。它通過單一的集中管理的服務(wù)器,保存所有文件的修訂版本,協(xié)同工作的開發(fā)者都通過客戶端連到這臺(tái)服務(wù)器,取出最新的文件或者提交更新。其代表為SVN,如下圖所示

這種方式很好解決了多人協(xié)同開發(fā)的問題,但是也有一個(gè)弊端,如果集中管理的服務(wù)器出現(xiàn)故障,將會(huì)導(dǎo)致數(shù)據(jù)(版本)丟失的風(fēng)險(xiǎn),另外協(xié)同開發(fā)者從集中服務(wù)器中更新數(shù)據(jù)時(shí),嚴(yán)重依賴網(wǎng)絡(luò),如果網(wǎng)絡(luò)不佳,也給開發(fā)帶來諸多不便。
分布式版本控制系統(tǒng)
分布式版本控制系統(tǒng),則不需要中央服務(wù)器,每個(gè)協(xié)同開發(fā)者都擁有一個(gè)完整的版本庫,這么一來,任何協(xié)同開發(fā)者用的服務(wù)器發(fā)生故障,事后都可以用其它協(xié)同開發(fā)者本地倉庫恢復(fù)。
由于版本庫在本地計(jì)算機(jī),也便不再受網(wǎng)絡(luò)影響了。如果要將本地的修改,推送給其它協(xié)同開發(fā)者,還需要一臺(tái)共享服務(wù)器,所有開發(fā)者通過這臺(tái)共享服務(wù)器同步和更新數(shù)據(jù)。如下圖所示。

分布式版本控制系統(tǒng)彌補(bǔ)了前面兩種版本控制系統(tǒng)的缺陷,成為了版本控制的首選方案。其代表就是Git
Git
window安裝
http://git-scm.com/download/win下載Git客戶端軟件,和普通軟件安裝方式一樣。
Linux安裝
CentOS發(fā)行版:sudo yum install git
Ubuntu發(fā)行版:sudo apt-get install git
Mac安裝
打開Terminal直接輸入git命令,會(huì)自動(dòng)提示,按提示引導(dǎo)安裝即可。
Git工作原理
為了更好的學(xué)習(xí)Git,我們們必須了解Git管理我們文件的3種狀態(tài),分別是已提交(committed)、已修改(modified)和已暫存(staged),由此引入 Git 項(xiàng)目的三個(gè)工作區(qū)域的概念:Git 倉庫、工作目錄以及暫存區(qū)域。
Git倉庫目錄是Git用來保存項(xiàng)目的元數(shù)據(jù)和對(duì)象數(shù)據(jù)庫的地方。 這是Git 中最重要的部分,從其它計(jì)算機(jī)克隆倉庫時(shí),拷貝的就是這里的數(shù)據(jù)。
工作目錄是對(duì)項(xiàng)目的某個(gè)版本獨(dú)立提取出來的內(nèi)容。這些從Git倉庫的壓縮數(shù)據(jù)庫中提取出
來的文件,放在磁盤上供你使用或修改。
暫存區(qū)域是一個(gè)文件,保存了下次將提交的文件列表信息,一般在Git倉庫目錄中。有時(shí)候也被稱作“索引”(Index),不過一般說法還是叫暫存區(qū)域。

基本的Git工作流程如下:
- 1、在工作目錄中修改文件。
- 2、暫存文件,將文件的快照放入暫存區(qū)域。
- 3、提交文件,找到暫存區(qū)域的文件,將快照永久性存儲(chǔ)到Git倉庫目錄。
Git本地倉庫
Git本地倉庫值得是開發(fā)者開發(fā)設(shè)備中倉庫
Git基礎(chǔ)
命令行方式:任意目錄(建議開發(fā)根目錄)右鍵 > Git Bash Here
1.配置用戶
配置用戶的意義在于記錄開發(fā)者信息,以便在版本控制記錄開發(fā)者的操作行為,如lion于2016-08-24解決了一個(gè)bug。
git config --global user.name "自已的名字"
git config --global user.email"自已的郵箱地址"
--global 配置當(dāng)前用戶所有倉庫
--system 配置當(dāng)前計(jì)算機(jī)上所有用戶的所有倉庫
注:配置用戶只需要執(zhí)行1次,可以重復(fù)使用。
2.初始化倉庫
我們?nèi)绻胍胓it進(jìn)行版本控制,需要將現(xiàn)有項(xiàng)目初始化為一個(gè)倉庫,或者將一個(gè)已有的使用git進(jìn)行版本控制的倉庫克隆到本地.
- git init

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

- 假如公司已有項(xiàng)目用了Git,那我們就利用克隆
git clone倉庫地址

執(zhí)行完這個(gè)命令,會(huì)在當(dāng)前目錄下生成一個(gè)
Monment目錄(默認(rèn)和倉庫名稱相同),這個(gè)便是已有一個(gè)使用Git管理的項(xiàng)目

查看文件狀態(tài)
初始化倉庫后便可以進(jìn)行開發(fā)了,進(jìn)入到剛剛創(chuàng)建好并初始為倉庫的目錄,添加我們開發(fā)需要的文件。
通過git status可以檢測當(dāng)前倉庫文件的狀態(tài)

注:git會(huì)忽略空的目錄
4.添加文件到暫緩區(qū)
假設(shè)經(jīng)過一段時(shí)間的開發(fā)后,需要把已開發(fā)的部分存起來,使用git add 添加到暫存區(qū)。
git add 文件名/ 文件路徑 “*”或-A代表所有

放到暫存區(qū)的文件被標(biāo)記成了
綠色,等待提交。注:顏色是工具給添加的,目的是增加可讀性并不是git統(tǒng)一的。
5、撤銷更改
繼續(xù)我們的開發(fā)
再次git status可以再次查看倉庫狀態(tài)

說明index.html再次被修改了,并被標(biāo)記了
紅色。又經(jīng)過一段時(shí)間后發(fā)現(xiàn)新開發(fā)的部分有Bug,想要回到之前狀態(tài),可以使用
git checkout 文件名.

注:從暫存區(qū)還原原到工作區(qū)
5.提交文件
經(jīng)過一個(gè)相對(duì)較長階段開發(fā)或者一個(gè)功能開發(fā)完成了,就可以提交到本地倉庫了,永久保存了。
git commit -m '備注信息'

將暫存區(qū)被標(biāo)記成綠色的文件,全部提交到
本地倉庫存儲(chǔ)。這時(shí)
git status查看狀態(tài)

沒有什么可提交的,變的很干凈.
6.查看提交歷史
反反復(fù)復(fù)開發(fā)了很多的功能了,通過git log查看一下提交的歷史

我們可以查看到一次次提交記錄
commit 81b1e4fc2ae178caedf4575596377a80a6f1e73f代表一次提交的唯一ID,一般稱為SHA值。傻?
注:按鍵盤q鍵退出。
7.再次檢測倉庫文件狀態(tài)
隔了好些天后,繼續(xù)開發(fā)
git status 查看狀態(tài)

又提示有修改,等待重新添加到暫存區(qū).
8.重新添加暫存區(qū)然后提交

9.再次查看歷史
git log 可查到所有提交歷史

這時(shí)可以查看到更多提交歷史。
這時(shí)關(guān)掉所有目錄甚至關(guān)機(jī)!
10.恢復(fù)上一次提交的狀態(tài)
通過SHA值可以回到之前某一次的提交(時(shí)光倒流)
git reset --hard c888a614e072e2這樣便回到了支付功能的狀態(tài)
git log再次查看發(fā)現(xiàn)最后一次提交成了支付功能了


Git分支
在我們的現(xiàn)實(shí)開發(fā)中,需求往往是五花八門的,同時(shí)開發(fā)個(gè)需求的情況十分常見,比如當(dāng)你正在專注開發(fā)一個(gè)功能時(shí),突然有一個(gè)緊急的BUG需要你來修復(fù),這個(gè)時(shí)候我們當(dāng)然是希望在能夠保存當(dāng)前任務(wù)進(jìn)度,再去修改這個(gè)BUG,等這個(gè)BUG修復(fù)完成后再繼續(xù)我們的任務(wù)。如何實(shí)現(xiàn)呢?
通過Git創(chuàng)建分支來解決實(shí)際開發(fā)中類似的問題。
在Git的使用過程中一次提交稱為歷史記錄(版本),并且會(huì)生成一個(gè)唯一的字符串,如下圖

這個(gè)串可以代表某一個(gè)歷史版本(實(shí)際使用只取前面幾位就可以),
值得注意的是所有的提交(commit)實(shí)際上都是在分支(branch)的基礎(chǔ)上進(jìn)行的。

當(dāng)我們?cè)诔跏蓟瘋}庫的時(shí)候(實(shí)際上是產(chǎn)生第1次提交時(shí)),Git會(huì)默認(rèn)幫我們創(chuàng)建了一個(gè)master的分支,并且有指針(HEAD)指到了末端。
指針(HEAD)用來標(biāo)明當(dāng)前處于哪個(gè)分支的哪個(gè)版本,如上圖指的處于master分支的最后1個(gè)版本。
我們也可以創(chuàng)建自已的分支
1、創(chuàng)建分支
git branch hotfix
新的分支會(huì)在當(dāng)前分支原有歷史版本的結(jié)點(diǎn)上進(jìn)行創(chuàng)建,我稱其為子分支如下圖

新建的子分支會(huì)繼承父分支的所有提交歷史。
2.切換分支
git checkout hotfix

我們發(fā)現(xiàn)HEAD現(xiàn)在又指向了hotfix的末端。
3.再次提交操作
修改bug后,提交

這次的提交歷史版本就會(huì)記錄在hotfix這個(gè)分支上了,并且
HEAD伴隨hotfix在移動(dòng)。
4.當(dāng)我們?cè)俅吻谢氐絤aster時(shí)

當(dāng)我們切換回master后,HEAD指向了master分支的末端,并且我們觀察發(fā)現(xiàn)我們的文件內(nèi)容還是原來的“模樣”。
5.繼續(xù)之前的開發(fā)

總結(jié):當(dāng)我們git checkout branchname時(shí),HEAD會(huì)自動(dòng)指向?qū)?yīng)分支的末端,工作目錄中的源碼也會(huì)隨之發(fā)生改變。
這個(gè)時(shí)候我們就在hotfix這個(gè)分支上修復(fù)了這個(gè)BUG,而我們?cè)瓉碓趍aster分支上的操作并未受到影響。
思考一個(gè)問題:
現(xiàn)在master這個(gè)分支上是否包含了hotfix的修復(fù)呢?
實(shí)際上從上圖可以看出這時(shí)的master分支并沒有包含有hotfix的修復(fù)
6.合并(融合)分支

這時(shí)
master會(huì)有兩個(gè)父結(jié)點(diǎn)了,master便包含了`hotfix里的修復(fù)了
7.刪除分支
git branch -d hotfix
這時(shí)用來修復(fù)BUG創(chuàng)建的hotfix分支已經(jīng)沒有用處了,我們可以將它刪除

Git遠(yuǎn)程(共享)倉庫
通過上面學(xué)習(xí)我們可以很好的管理本地版本控制了,可是如果我們下班回到家里突然來了靈感覺得有部分代碼可以優(yōu)化,如果能接著公司電腦上的代碼繼續(xù)寫該有多好呀!另一種情形,假設(shè)項(xiàng)目比較大,不同的功能模塊由不同的開發(fā)人員完成,不同模塊兒之間又難免會(huì)依賴關(guān)系,這時(shí)如果我們的代碼互相合并(融合)該有多好呀!所有模塊開發(fā)完畢后,需要整合到一起,要能做到準(zhǔn)確無誤該有多好呀!
借助一個(gè)遠(yuǎn)程倉庫,大家可以共享代碼、歷史版本等數(shù)據(jù),便可以解決以上遇到的所有問題,在學(xué)習(xí)遠(yuǎn)程倉庫前我們先來學(xué)習(xí)git clone path這個(gè)命令。
創(chuàng)建共享倉庫
Git要求共享倉庫是一個(gè)以.git結(jié)尾的目錄。
mkdir repo.git 創(chuàng)建以.git結(jié)尾目錄
cd repo.git 進(jìn)入這個(gè)目錄
git init --bare 初始化一個(gè)共享倉庫,也叫裸倉庫 注意選項(xiàng)--bare

這樣我們就建好了一個(gè)共享的倉庫,但這時(shí)這個(gè)倉庫是一個(gè)空的倉庫,并且不允在這個(gè)倉庫中進(jìn)行任何修改
向共享倉庫共享(同步)內(nèi)容
將自已開發(fā)的項(xiàng)目同步到這個(gè)目錄中,其它開發(fā)者就可以共享你開發(fā)的項(xiàng)目了。
- 1、進(jìn)入到
yike目錄 - 2、
git push ../repo.git master

這樣便把yike中的項(xiàng)目同步進(jìn)了repo.git中。
5.從共享倉庫里取出內(nèi)容
1、新創(chuàng)建一個(gè)目錄(模擬另一個(gè)開發(fā)者)
2、git clone ./repo.git demo

通過
repo.git共享倉庫,我們輕松得到了一個(gè)yike的副本
6.通過demo倉庫向repo.git共享內(nèi)容
進(jìn)入到demo里,我們做一些修改
cd demo
git push ../repo.git master

7.在360倉庫從repo.git獲取共享的內(nèi)容
cd yike
git pull ../repo.git master

奇跡似乎發(fā)生了,我們輕松的將demo倉庫里的內(nèi)容,通過repo.git共享給了yike倉庫。
驚喜不斷,問題也總是不斷,我們發(fā)現(xiàn)我們這個(gè)共享的倉庫只是放到了本地的,其它人是沒有辦法從我們這個(gè)共享倉庫共享內(nèi)容的?。。?br>
然而現(xiàn)實(shí)是,辦法總是有的?。。?!
我們把這個(gè)共享的倉庫放到一臺(tái)遠(yuǎn)程服務(wù)器上,問題不就解決了嗎?
gitHub和gitLab
如果我們熟悉服務(wù)器的話,我們完全可以將上述的步驟在我們的遠(yuǎn)程服務(wù)器上進(jìn)行操作,然后再做一些登錄權(quán)限的設(shè)置,就可非常完美的搭建一個(gè)共享服務(wù)器了。其實(shí)為了更好的管理我們的倉庫,一些第三方機(jī)構(gòu)開發(fā)出了Web版?zhèn)}庫管理程序,通過Web界面形式管理倉庫。
gitHub關(guān)于它的名氣與意義,大家可以自行查閱,我們這里介紹它的使用
1、注冊(cè)賬號(hào)并完善資料
自行注冊(cè)略過
2、創(chuàng)建共享倉庫

3、填寫倉庫資料

4、共享倉庫

遠(yuǎn)程地址特別長,我們可以給他起一個(gè)別名
git remote add origin
git@github.com:Botue/repo.git
這樣origin 就代表 git@github.com:Botue/repo.git
當(dāng)我們通過git clone從共享倉庫獲內(nèi)容時(shí),會(huì)自動(dòng)幫我們添加origin到對(duì)應(yīng)的倉庫地址,例如:git clone git@github.com:Botue/repo.git 會(huì)自動(dòng)添加origin 對(duì)應(yīng) git@github.com:Botue/repo.git
5、生成密鑰
ssh-keygen -t rsa然后一路回車,這里會(huì)在當(dāng)前用戶生成了一個(gè).ssh的文件夾

將
id_rsa.pub公鑰的內(nèi)容復(fù)制
打開gitHub的個(gè)人中心

打到SSH keys

到此我們便可以通過gitHub 提供的Web界面來管理我們的倉庫了。
我們發(fā)現(xiàn)通過gitHub管理倉庫實(shí)在是太方便了,可是只能免費(fèi)使用公開倉庫,自已公司的代碼當(dāng)然不能公開了,可是私有倉庫又是需要交“保護(hù)費(fèi)”的,無耐國人還是比較喜歡免費(fèi)的,網(wǎng)絡(luò)界總是有很多雷峰的,比如gitLab!!!
gitLab也是一個(gè)可以通過Web界面管理倉庫的網(wǎng)站程序,我們可以把它架設(shè)到公司自已的服務(wù)器上,實(shí)現(xiàn)倉庫私有化,這也是大部分公司通常采用的方法,其使用方法與gitHub十分相似。
我將閑置電腦配置成了一臺(tái)服務(wù)器,上面架設(shè)了gitLab程序,我們接下來的練習(xí)全部會(huì)在gitLab上進(jìn)行演示。
命令匯總
| 命令 | 描述 |
|---|---|
| git config | 配置本地倉庫,常用git config --global user.name、git config --global user.email |
| git config --list | 查看配置詳情 |
| git init | 初始一個(gè)倉庫,添加--bare可以初始化一個(gè)共享(裸)倉庫 |
| git status | 可以查看當(dāng)前倉庫的狀態(tài) |
| git add“文件” | 將工作區(qū)中的文件添加到暫存區(qū)中,其中file可是一個(gè)單獨(dú)的文件,也可以是一個(gè)目錄、“*”、-A |
| git commit -m '備注信息' | 將暫存區(qū)的文件,提交到本地倉庫 |
| git log | 可以查看本地倉庫的提交歷史 |
| git branch | 查看分支 |
| git branch“分支名稱” | 創(chuàng)建一個(gè)新的分支 |
| git checkout“分支名稱” | 切換分支 |
| git checkout -b deevelope | r 他健并切到developer分支 |
| git merge“分支名稱” | 合并分支 |
| git branch -d “分支名稱” | 刪除分支 |
| git clone “倉庫地址” | 獲取已有倉庫的副本 |
| git push origin “本地分支名稱:遠(yuǎn)程分支名稱” | 將本地分支推送至遠(yuǎn)程倉庫, |
| git push origin hotfix(通常的寫法) | 相當(dāng)于git push origin hotfix:hotfix, git push origin hotfix:newfeature |
本地倉庫分支名稱和遠(yuǎn)程倉庫分支名稱一樣的情況下可以簡寫成一個(gè),即git push “倉庫地址” “分支名稱”,如果遠(yuǎn)程倉庫沒有對(duì)應(yīng)分支,將會(huì)自動(dòng)創(chuàng)建
git remote add “主機(jī)名稱” “遠(yuǎn)程倉庫地址”添加遠(yuǎn)程主機(jī),即給遠(yuǎn)程主機(jī)起個(gè)別名,方便使用
git remote可以查看已添加的遠(yuǎn)程主機(jī)
git remote show “主機(jī)名稱”可以查看遠(yuǎn)程主機(jī)的信息
GitLab完整演示
沒錯(cuò),Git非常強(qiáng)大!
但是,如果我們的分支不加以規(guī)范管理,也
有可能適得其反!
- 1、不要有太多的樹杈(子分支)
- 2、要有一個(gè)“穩(wěn)定分支”,即master分支不要輕意被修改
- 3、要有一個(gè)開發(fā)分支(developer),保證master分支的穩(wěn)定性
- 4、所有的功能分支(feature)從developer創(chuàng)建
-
5、所有功能開發(fā)完成后新建發(fā)布分支(release)
Git工作流-1.png


沖突解決
假如兩個(gè)開發(fā)同時(shí)改到同一文件的同一段內(nèi)容會(huì)發(fā)生什么事情呢?
這時(shí)就會(huì)就會(huì)產(chǎn)生沖突了,當(dāng)沖突產(chǎn)生后,需要開發(fā)者進(jìn)行協(xié)商確認(rèn)沖突的原因,然后將沖突代碼刪除重新提交就可以了。
Git高級(jí)
熟悉掌握以上操作,基本上是可以滿足日常開的需要的,但是在解決一些特殊問題時(shí),就又需要我們能夠掌握更多的命令。
gitignore忽略文件
在項(xiàng)目根目錄下創(chuàng)建一個(gè).gitignore文件,可以將不希望提交的羅列在這個(gè)文件里,如項(xiàng)目的配置文件、node_modules等
https://github.com/github/gitignore
比較差異
當(dāng)內(nèi)容被修改,我們無法確定修改哪些內(nèi)容時(shí),可以通過git diff來進(jìn)行差異比較。
git difftool 比較的是工作區(qū)和暫存的差異
git difftool “SHA”比較與特定提交的差異
git difftool “SHA”``“SHA”比較某兩次提交的差異
git difftool 分支名稱 比較與某個(gè)分支的差異
回滾(撤銷)操作

HEAD 默認(rèn)指向當(dāng)前分支的“末端”,即最后的一次提交,但是我們通過git reset 可以改變HEAD的指向。
- 1、git reset
--hard工作區(qū)會(huì)變、歷史(HEAD)會(huì)變, 暫存區(qū)也變
--soft只會(huì)變歷史(HEAD)
--mixed(默認(rèn)是這個(gè)選項(xiàng))歷史(HEAD)會(huì)變、暫存區(qū)也變,工作區(qū)不變 - 2、git checkout
git checkout SHA -- "某個(gè)文件",代表只是從SHA這個(gè)版中取出特定的文件,
和git reset是有區(qū)別的,reset重寫了歷史,checkout則沒有。
更新倉庫
在項(xiàng)目開發(fā)過程中,經(jīng)常性的會(huì)遇到遠(yuǎn)程(共享)倉庫和本地倉庫不一致,我們可以通過git fetch 命令來更新本地倉庫,使本地倉庫和遠(yuǎn)程(共享)倉庫保持一致。
git fetch “遠(yuǎn)程主機(jī)”
或者
git fetch “遠(yuǎn)程主機(jī)” “分支名稱”
我們要注意的是,利用git fetch 獲取的更新會(huì)保存在本地倉庫中,但是并沒有體現(xiàn)到我們的工作目錄中,需要我們?cè)俅卫?code>git merge來將對(duì)應(yīng)的分支合并(融合)到特定分支。如下
git pull origin 某個(gè)分支, 上操作相當(dāng)于下面兩步
git fetch
git merge origin/某個(gè)分支
問題:如何查看遠(yuǎn)程主機(jī)上總共有多少個(gè)分支?
git branch -a便可以查看所有(本地+遠(yuǎn)程倉庫)分支了

刪除遠(yuǎn)程分支
git push origin --delete 分支名稱刪除遠(yuǎn)程分支
git push origin :分支名稱
