git——分布式版本控制軟件
其實(shí)這個(gè)只是用來(lái)了解一下git,其實(shí)我個(gè)人比較偏向使用圖形化工具,比較清晰直觀,當(dāng)然在寫(xiě)代碼的時(shí)候用終端git add和git commit -m "description"比較快,主要記住這個(gè)就可以了。
注意:<>內(nèi)為可替換內(nèi)容,敲命令行時(shí)不需要敲<>
主要內(nèi)容:創(chuàng)建git repository,將文件添加到版本庫(kù),git的狀態(tài)和文件的變化,版本&回退。
命令概覽:
$ git init #使當(dāng)前目錄變成可以管理的版本倉(cāng)庫(kù)(git repository)
$ git add filename #將文件添加到版本倉(cāng)庫(kù)
$ git commit -m "description" #把文件提交到倉(cāng)庫(kù)
$ git status #查看repository的狀態(tài)
$ git diff #查看修改了哪些內(nèi)容
$ git log #查看提交日志
$ git log --pretty=oneline #簡(jiǎn)潔地顯示提交日志
$ git reset --hard HEAD~<3> #回退到某個(gè)版本,比如這里回退到第前3個(gè)版本
$ git reset --hard <commit ID> #回退到特定ID的版本
$ git reflog #記錄了每個(gè)命令,可以用來(lái)查看每個(gè)操作的編號(hào)
創(chuàng)建git repository
- 找合適的地方,創(chuàng)建一個(gè)空目錄,比如在
/Users/Vector/github路徑下,創(chuàng)建并進(jìn)入,一般不要用中文的目錄名,容易出現(xiàn)問(wèn)題
$ mkdir learnGit
$ cd learnGit
$ pwd
/Users/Vector/github/learnGit
-
git init命令將這個(gè)目錄變成可以管理的版本倉(cāng)庫(kù)(git repository)
VectorLu:learnGit Vector$ git init
Initialized empty Git repository in /Users/Vector/github/learnGit/.git/
可以發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè).git目錄,這個(gè)目錄就是git用來(lái)跟蹤管理版本倉(cāng)庫(kù)的,不要去手動(dòng)修改。ls命令不會(huì)顯示帶.的目錄,用ls -a就可以顯示了
VectorLu:learnGit Vector$ ls
VectorLu:learnGit Vector$ ls -a
. .. .git
將文件添加到版本庫(kù)
注意
首先這里再明確一下,所有的版本控制系統(tǒng),其實(shí)只能跟蹤文本文件的改動(dòng),比如TXT文件,網(wǎng)頁(yè),所有的程序代碼等等,Git也不例外。版本控制系統(tǒng)可以告訴你每次的改動(dòng),比如在第5行加了一個(gè)單詞“Linux”,在第8行刪了一個(gè)單詞“Windows”。而圖片、視頻這些二進(jìn)制文件,雖然也能由版本控制系統(tǒng)管理,但沒(méi)法跟蹤文件的變化,只能把二進(jìn)制文件每次改動(dòng)串起來(lái),也就是只知道圖片從100KB改成了120KB,但到底改了啥,版本控制系統(tǒng)不知道,也沒(méi)法知道。
不幸的是,Microsoft的Word格式是二進(jìn)制格式,因此,版本控制系統(tǒng)是沒(méi)法跟蹤Word文件的改動(dòng)的,前面我們舉的例子只是為了演示,如果要真正使用版本控制系統(tǒng),就要以純文本方式編寫(xiě)文件。
因?yàn)槲谋臼怯芯幋a的,比如中文有常用的GBK編碼,日文有Shift_JIS編碼,如果沒(méi)有歷史遺留問(wèn)題,強(qiáng)烈建議使用標(biāo)準(zhǔn)的UTF-8編碼,所有語(yǔ)言使用同一種編碼,既沒(méi)有沖突,又被所有平臺(tái)所支持。
使用Windows的童鞋要特別注意:
千萬(wàn)不要使用Windows自帶的記事本編輯任何文本文件。原因是Microsoft開(kāi)發(fā)記事本的團(tuán)隊(duì)使用了一個(gè)非常弱智的行為來(lái)保存UTF-8編碼的文件,他們自作聰明地在每個(gè)文件開(kāi)頭添加了0xefbbbf(十六進(jìn)制)的字符,你會(huì)遇到很多不可思議的問(wèn)題,比如,網(wǎng)頁(yè)第一行可能會(huì)顯示一個(gè)“?”,明明正確的程序一編譯就報(bào)語(yǔ)法錯(cuò)誤,等等,都是由記事本的弱智行為帶來(lái)的。
個(gè)人很推薦github官方出品的atom文本編輯器,簡(jiǎn)直好看漂亮好用,當(dāng)然老牌的sublime也不錯(cuò),但是要付費(fèi)(雖然無(wú)限期試用),但是atom是開(kāi)源免費(fèi)的,而且跟git配合天衣無(wú)縫。

如圖中所示,剛剛創(chuàng)建未提交的文件名是綠色的,已經(jīng)提交過(guò)的文件但是經(jīng)過(guò)修改后,沒(méi)有提交修改后的文件名是黃色的“。要注意Atom在編輯文件時(shí),點(diǎn)文件編輯窗口的關(guān)閉鍵,如果當(dāng)前的修改沒(méi)有保存,會(huì)彈出提示,但是如果點(diǎn)的是Atom的關(guān)閉鍵。。。它就直接退出了。。。不會(huì)提示沒(méi)有保存,這是個(gè)bug,改天看它更新版本的時(shí)候會(huì)不會(huì)修正把,或者什么時(shí)候去官網(wǎng)說(shuō)一下。
一定要放到learngit目錄下(子目錄也行),因?yàn)檫@是一個(gè)Git倉(cāng)庫(kù)。
把一個(gè)文件放到Git倉(cāng)庫(kù)只需要兩步:
- 把文件添加到倉(cāng)庫(kù),沒(méi)有任何消息就是表示添加成功
$ git add README.md
- 把文件提交到倉(cāng)庫(kù)
VectorLu:learnGit Vector$ git commit -m "wrote a readme file"
[master (root-commit) 3be5479] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 README.md
-m之后是本次提交的說(shuō)明,最好能夠簡(jiǎn)要概括這次提交了什么內(nèi)容,或者做了什么修改。為什么Git添加文件需要add,commit一共兩步呢?因?yàn)閏ommit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt
$ git add file2.txt
$ git add file3.txt
$ git commit -m "add 3 files."
git的狀態(tài)和文件的變化
$ git status查看repository的狀態(tài),$ git diff查看修改了哪些內(nèi)容
版本&回退
$ git log由近到遠(yuǎn)顯示提交日志,可以加上參數(shù)--pretty=oneline,使顯示的信息更加簡(jiǎn)潔
VectorLu:learnGit Vector$ git log --pretty=oneline
8512e8bcdda603a6184128be151174f962221dd2 append GPL
f53fa0eae5a3ad9689473f01ef9b38cab366cfd5 distributed
3be547948169bfa0fcff7d4755949859628f3312 wrote a readme file

HEAD表示當(dāng)前版本,HEAD~100第前100個(gè)版本。git reset --hard HEAD回退到上一個(gè)版本。
VectorLu:SE Vector$ git reset --hard HEAD~3
HEAD is now at 547e18f 迭代計(jì)算梯度
回退到以前的版本A之后,用git log命令就找不到A之后的版本了,如果想回到之后的版本,需要git reset --hard commitID,但是如果不記得commitID(誰(shuí)沒(méi)事會(huì)記這個(gè)),可以用$ git reflog,它記錄了每一個(gè)命令
VectorLu:SE Vector$ git reflog
547e18f HEAD@{0}: reset: moving to HEAD~3
da1401a HEAD@{1}: commit: 修改了精度,使之更加嚴(yán)謹(jǐn)
697c680 HEAD@{2}: commit: 精度有問(wèn)題,重新編寫(xiě)函數(shù)測(cè)算是否重合
5afa969 HEAD@{3}: commit: 測(cè)算是否有圓重合
547e18f HEAD@{4}: commit: 迭代計(jì)算梯度
9c80a1b HEAD@{5}: commit (initial): start code the function
VectorLu:SE Vector$ git reset --hard 547e18f
HEAD is now at 547e18f 迭代計(jì)算梯度
- HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們?cè)诎姹镜臍v史之間穿梭,使用命令git reset --hard commit_id。
- 穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個(gè)版本。
- 要重返未來(lái),用git reflog查看命令歷史,以便確定要回到未來(lái)的哪個(gè)版本。
參考來(lái)源:廖雪峰的git教程