我見青山多嫵媚孔轴,料青山,見我碎捺,應(yīng)如是路鹰。程序員應(yīng)如是
git簡介
很多人都知道,Linus在1991年創(chuàng)建了開源的Linux收厨,從此晋柱,Linux系統(tǒng)不斷發(fā)展,已經(jīng)成為最大的服務(wù)器系統(tǒng)軟件了诵叁。
Linus雖然創(chuàng)建了Linux雁竞,但Linux的壯大是靠全世界熱心的志愿者參與的,這么多人在世界各地為Linux編寫代碼拧额,那Linux的代碼是如何管理的呢碑诉?
事實是,在2002年以前势腮,世界各地的志愿者把源代碼文件通過diff的方式發(fā)給Linus联贩,然后由Linus本人通過手工方式合并代碼!
你也許會想捎拯,為什么Linus不把Linux代碼放到版本控制系統(tǒng)里呢泪幌?不是有CVS盲厌、SVN這些免費的版本控制系統(tǒng)嗎?因為Linus堅定地反對CVS和SVN祸泪,這些集中式的版本控制系統(tǒng)不但速度慢吗浩,而且必須聯(lián)網(wǎng)才能使用。有一些商用的版本控制系統(tǒng)没隘,雖然比CVS懂扼、SVN好用,但那是付費的右蒲,和Linux的開源精神不符阀湿。
不過,到了2002年瑰妄,Linux系統(tǒng)已經(jīng)發(fā)展了十年了陷嘴,代碼庫之大讓Linus很難繼續(xù)通過手工方式管理了,社區(qū)的弟兄們也對這種方式表達了強烈不滿间坐,于是Linus選擇了一個商業(yè)的版本控制系統(tǒng)BitKeeper灾挨,BitKeeper的東家BitMover公司出于人道主義精神,授權(quán)Linux社區(qū)免費使用這個版本控制系統(tǒng)竹宋。
安定團結(jié)的大好局面在2005年就被打破了劳澄,原因是Linux社區(qū)牛人聚集,不免沾染了一些梁山好漢的江湖習氣蜈七。開發(fā)Samba的Andrew試圖破解BitKeeper的協(xié)議(這么干的其實也不只他一個)秒拔,被BitMover公司發(fā)現(xiàn)了(監(jiān)控工作做得不錯!)飒硅,于是BitMover公司怒了溯警,要收回Linux社區(qū)的免費使用權(quán)。
Linus可以向BitMover公司道個歉狡相,保證以后嚴格管教弟兄們,嗯食磕,這是不可能的尽棕。實際情況是這樣的:
Linus花了兩周時間自己用C寫了一個分布式版本控制系統(tǒng),這就是Git彬伦!一個月之內(nèi)滔悉,Linux系統(tǒng)的源碼已經(jīng)由Git管理了!牛是怎么定義的呢单绑?大家可以體會一下回官。
Git迅速成為最流行的分布式版本控制系統(tǒng),尤其是2008年搂橙,GitHub網(wǎng)站上線了歉提,它為開源項目免費提供Git存儲,無數(shù)開源項目開始遷移至GitHub,包括jQuery苔巨,PHP版扩,Ruby等等。
歷史就是這么偶然侄泽,如果不是當年BitMover公司威脅Linux社區(qū)礁芦,可能現(xiàn)在我們就沒有免費而超級好用的Git了。
git安裝
-
Windows
去官網(wǎng)下載悼尾,選擇安裝路徑柿扣,默認安裝即可 Git官網(wǎng)下載
-
Lunix
- 通常輸入git可以查看如否安裝,如果沒有安裝闺魏,會提示你安裝的命令
- 如果是Ubuntu或Debain可以通過
sudo apt-get install git
即可安裝 - 如果是其他版本的Linux未状,可以采用去官網(wǎng)下載源碼,然后解壓舷胜,依次輸入:
./config
娩践,make
,sudo make install
這幾個命令安裝就好了
-
Mac
在Appstore中下載Xcode這個IDE,這是蘋果系統(tǒng)最好的IDE烹骨,開發(fā)人員一定會下載的那種翻伺,Xcode中集成了Git,不過沒有默認安裝沮焕,需要運行Xcode吨岭,在Preferences中找到Downloads,選擇Command Line Tools,點擊install即可
基本應(yīng)用
創(chuàng)建版本庫
什么是版本庫呢峦树?版本庫又名倉庫辣辫,英文名repository,你可以簡單理解成一個目錄魁巩,這個目錄里面的所有文件都可以被Git管理起來急灭,每個文件的修改、刪除谷遂,Git都能跟蹤葬馋,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”肾扰。
-
選擇一個合適的地方畴嘶,創(chuàng)建一個空目錄
mkdir GitHubRepository cd GitHubRepository pwd #顯示當前目錄
image-20201104191830658注:為了避免莫名其妙的問題,建議目錄(包括父目錄)使用英文
-
通過
git init
命令把此目錄變成Git管理的倉庫git init
image-20201104191855689瞬間Git就把倉庫建好了集晚,而且告訴你是一個空的倉庫(empty Git repository)窗悯,細心的讀者可以發(fā)現(xiàn)當前目錄下多了一個
.git
的目錄,這個目錄是Git來跟蹤管理版本庫的偷拔,沒事千萬不要手動修改這個目錄里面的文件蒋院,不然改亂了亏钩,就把Git倉庫給破壞了。 -
把文件添加到版本庫
首先這里再明確一下悦污,所有的版本控制系統(tǒng)铸屉,其實只能跟蹤文本文件的改動,比如TXT文件切端,網(wǎng)頁彻坛,所有的程序代碼等等,Git也不例外踏枣。版本控制系統(tǒng)可以告訴你每次的改動昌屉,比如在第5行加了一個單詞“Linux”,在第8行刪了一個單詞“Windows”茵瀑。而圖片间驮、視頻這些二進制文件,雖然也能由版本控制系統(tǒng)管理马昨,但沒法跟蹤文件的變化竞帽,只能把二進制文件每次改動串起來,也就是只知道圖片從100KB改成了120KB鸿捧,但到底改了啥屹篓,版本控制系統(tǒng)不知道,也沒法知道匙奴。
不幸的是堆巧,Microsoft的Word格式是二進制格式,因此泼菌,版本控制系統(tǒng)是沒法跟蹤Word文件的改動的谍肤,前面我們舉的例子只是為了演示,如果要真正使用版本控制系統(tǒng)哗伯,就要以純文本方式編寫文件荒揣。
因為文本是有編碼的,比如中文有常用的GBK編碼焊刹,日文有Shift_JIS編碼乳附,如果沒有歷史遺留問題,強烈建議使用標準的UTF-8編碼伴澄,所有語言使用同一種編碼,既沒有沖突阱缓,又被所有平臺所支持非凌。
- 編寫一個
about.txt
文件,內(nèi)容如下
我是程序員應(yīng)如是 Git is a version control system
- 使用
git add
命令荆针,把文件添加到倉庫
git add about.txt
image-20201104191919909注:LF和CRLF是兩種換行方式敞嗡,對于這次學習Git沒影響
- 使用
git commit
命令颁糟,把文件提交到倉庫
git commit -m "This is a message about me" # -m 后面的是本次提交的說明信息,最好寫的有意義喉悴,幫助別人了解此次改動的信息
image-20201104191940296- 使用
git status
查看結(jié)果
git status
image-20201104191958853注:
git add <file>
可以添加多個文件棱貌,反復(fù)使用;git commit -m <message>
可以一次提交多個文件 - 編寫一個
時光穿梭(版本)
-
現(xiàn)在模仿日常工作箕肃,要對項目進行修改婚脱,我們修改
about.txt
文件,添加如下信息Git is a free software.
再使用
git status
查看結(jié)果image-20201104192017163通過
git status
命令勺像,我們可以時刻掌握倉庫當前的狀態(tài)障贸,上面的命令輸出告訴我們,文件被修改了吟宦,但是還沒有提交修改- 使用
git diff
命令查看具體修改的內(nèi)容
git diff about.txt
image-20201104192035542- 再分別使用
git add;git commit;git status
命令查看狀態(tài)
git add about.txt git status #查看此時的狀態(tài) git commit -m "Add a message" git status #再查看此時的狀態(tài)
image-20201104192057057 - 使用
-
版本回退
- 使用
git log
命令查看文件的版本
git log
image-20201104192114962git log
命令顯示從最近到最遠的提交日志如果嫌輸出信息太多篮洁,可以加上
--pretty=oneline
參數(shù)git log --pretty=oneline
image-20201104192132332需要友情提示的是,你看到的一大串類似
4b4258ee...
的是commit id
(版本號)殃姓,和SVN不一樣袁波,Git的commit id
不是1,2蜗侈,3……遞增的數(shù)字篷牌,而是一個SHA1計算出來的一個非常大的數(shù)字,用十六進制表示宛篇,而且你看到的commit id
和我的肯定不一樣娃磺,以你自己的為準。為什么commit id
需要用這么一大串數(shù)字表示呢叫倍?因為Git是分布式的版本控制系統(tǒng)偷卧,后面我們還要研究多人在同一個版本庫里工作,如果大家都用1吆倦,2听诸,3……作為版本號,那肯定就沖突了蚕泽。- 版本回退
在Git中晌梨,用
HEAD
表示當前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一樣)须妻,上一個版本就是HEAD^
仔蝌,上上一個版本就是HEAD^^
,當然往上100個版本寫100個^
比較容易數(shù)不過來荒吏,所以寫成HEAD~100
敛惊。#回到上一個版本 git reset --hard HEAD^
image-20201104192151062我們已經(jīng)乘坐時光機回去了
- 想再回來
如果想要再回來,就必須知道
commit id
绰更,如果不記得了瞧挤,git提供了后悔藥git refolg # 記錄你的每一次命令 git reset --hard 4b4258e cat about.txt
image-20201104192206215誒嘿锡宋,我胡漢三又回來了
注:版本號沒必要寫全,前幾位就可以了特恬,Git會自動去找执俩。當然也不能只寫前一兩位,因為Git可能會找到多個版本號癌刽,就無法確定是哪一個了役首。
- 使用
-
工作區(qū)和暫存區(qū)
Git和其他版本控制系統(tǒng)如SVN的一個不同之處就是有暫存區(qū)的概念。
- 工作區(qū)(Working Directory)
就是你在電腦里能看到的目錄妒穴,比如我的
LearnMysql
文件夾就是一個工作區(qū)- 版本庫(Repository)
工作區(qū)有一個隱藏目錄
.git
宋税,這個不算工作區(qū),而是Git的版本庫讼油。Git的版本庫里存了很多東西杰赛,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支
master
矮台,以及指向master
的一個指針叫HEAD
乏屯。image-20201104192223012- 工作流程
第一步是用
git add
把文件添加進去,實際上就是把文件修改添加到暫存區(qū)瘦赫;第二步是用
git commit
提交更改辰晕,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前分支。 -
管理修改
Git管理的是修改确虱,當你用
git add
命令后含友,在工作區(qū)的第一次修改被放入暫存區(qū),準備提交校辩,但是窘问,在工作區(qū)的第二次修改并沒有放入暫存區(qū),所以宜咒,git commit
只負責把暫存區(qū)的修改提交了惠赫,也就是第一次的修改被提交了,第二次的修改不會被提交故黑。- 可以用
git diff HEAD
命令查看工作區(qū)和版本庫里面最新版本的區(qū)別
git diff HEAD --about.txt
image-20201104192239252 - 可以用
-
撤銷修改
當你在深夜加班修改項目時儿咱,不小心在項目里添加了如下
TMD,stupid boss
嗯,難受场晶!這個月的獎金混埠,嗯~
- 內(nèi)容只在工作區(qū),沒有使用過
git add
git checkout -- about.txt
git checkout -- file
可以丟棄工作區(qū)的修改image-20201104192255744image-20201104192309329修改被刪除了
注:
git checkout -- file
命令中的--
很重要诗轻,沒有--
钳宪,就變成了“切換到另一個分支”的命令,我們在后面的分支管理中會再次遇到git checkout
命令。- 內(nèi)容在暫存區(qū)使套,使用了
git add
命令,沒使用git commit
命令
git reset HEAD about.txt #把文件從暫存區(qū)重新放回工作區(qū)
現(xiàn)在修改在工作區(qū)鞠柄,可以使用上面的命令將工作區(qū)的修改刪除
image-20201104192339336嗯侦高,獎金總算保住了
- 如果腦子一熱,使用了
git commit
命令厌杜,可以通過版本回退奉呛,回到上一個版本
image-20201104192358404 - 內(nèi)容只在工作區(qū),沒有使用過
-
刪除文件
現(xiàn)在我們有一個沒用的文件
test.txt
,想要刪除,文件已經(jīng)在版本庫中首先我們先刪除工作區(qū)的文件夯尽,可以圖形化刪除也可以使用命令
rm <file>
image-20201104192415808現(xiàn)在我們有兩個選擇
- 刪除版本庫中的文件
git rm test.txt #從版本庫中刪除文件 git commit -m "remove test.txt" #也可以使用git add test.txt 代替git rm test.txt 效果一樣
image-20201104192430077- 刪除了瞧壮,從版本庫中恢復(fù)文件
#git checkout 版本庫里文件的版本替換工作區(qū)里文件的版本 git checkout -- test.txt
image-20201104192448870
小提示:
-
git 提交信息
查看其他人提交的修改內(nèi)容或自己的歷史記錄的時候,提交信息是需要用到的重要資料匙握。所以請用心填寫修改內(nèi)容的提交信息咆槽,以方便別人理解。
以下是Git的標準注解:第1行:提交修改內(nèi)容的摘要 第2行:空行 第3行以后:修改的理由
-
git更新
#查看版本 git --version #git版本是2.17.1之前 git update #git版本是2.17.1之后 git update-git-for-windows
END