1濒生、git init
初始化一個(gè)git倉(cāng)庫(kù),即把這個(gè)文件夾下面所有的文件納入到版本控制之中
2秉撇、添加一個(gè)read.TXT文件甜攀,內(nèi)容如下:
Git is a version control system.
Git is free software.
3、git add read.TXT
可以反復(fù)使用琐馆,添加多個(gè)文件
4规阀、git commit -m "wrote a readme file"
可以一次提交多個(gè)文件
修改文件如下:
Git is a distributed version control system.
Git is free software distributed.
4、git status
查看狀態(tài)瘦麸,下圖是我修改文件谁撼,但是沒(méi)有使用add命令的時(shí)候,調(diào)用該命令出現(xiàn)的結(jié)果
5滋饲、
git diff readme.TXT
查看差異厉碟,在4的基礎(chǔ)上,沒(méi)有進(jìn)行add屠缭,此時(shí)查看不同結(jié)果如下:6箍鼓、執(zhí)行完git add命令之后,再查看狀態(tài)如下:
執(zhí)行g(shù)it diff命令結(jié)果如下:
可以得出結(jié)論:git status是查看工作區(qū)是否有被修改的文件以及被修改文件被提交到哪一步了呵曹,而git diff是用來(lái)比較工作區(qū)與暫存區(qū)的文件的差異
調(diào)用完git commit之后款咖,再調(diào)用git status,結(jié)果如下:
可以看到此時(shí)工作區(qū)沒(méi)有修改的文件了奄喂,也就是工作區(qū)跟版本庫(kù)保持一致了铐殃。
7、修改readme文件如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
8跨新、git add
9富腊、git commit -m "append GPL"
10、
11域帐、
git log
查看提交歷史
當(dāng)使用
git log --pretty=oneline
的時(shí)候赘被,結(jié)果如下:在第一張圖中的commit后面(也就是標(biāo)黃的那部分)的是commit id
,是git計(jì)算的一個(gè)數(shù)俯树,用來(lái)區(qū)別每次操作
12帘腹、版本回退
在git中,用HEAD表示當(dāng)前版本许饿,也就是最新的提交阳欲,上一個(gè)版本就是HEAD,上上一個(gè)版本就是HEAD陋率,當(dāng)然往上100個(gè)版本寫100個(gè)比較容易數(shù)不過(guò)來(lái)球化,所以寫成HEAD~100。
git reset --hard HEAD^
瓦糟,結(jié)果如下:
可以看到筒愚,現(xiàn)在版本回退到上一個(gè)版本了。
此時(shí)查看文件內(nèi)容:
可見(jiàn)菩浙,內(nèi)容確實(shí)回退到上一個(gè)版本了巢掺。
但是此時(shí)調(diào)用git log的時(shí)候句伶,結(jié)果如下:
最后的那次提交不見(jiàn)了,只剩下了兩次陆淀,此時(shí)如果想要到那個(gè)版本考余,該怎么辦?
如果此時(shí)你沒(méi)有關(guān)掉命令行窗口轧苫,則可以往上翻到最后一次提交楚堤,找到那次提交的commit id,然后調(diào)用命令
git reset --hard 58b58
含懊,結(jié)果如下:查看文件內(nèi)容:
確實(shí)回來(lái)了身冬。
如果關(guān)掉了命令行窗口,該怎么辦岔乔?因?yàn)橹耙呀?jīng)到最后的版本了酥筝,所以這里先進(jìn)行一次版本回退操作,到 add distributed版本雏门。
此時(shí)使用
git reflog
命令查看命令歷史
樱哼,結(jié)果如下:可以看到我所有的提交以及版本回退操作,在這里就能找到最后一次提交的commit id了剿配,然后進(jìn)行版本回退即可:
13搅幅、工作區(qū)、暫存區(qū)與版本庫(kù)
- 工作區(qū)可以理解為ide工具寫的代碼放的地方呼胚,比如eclipse每次進(jìn)入的時(shí)候你選的那個(gè)文件夾茄唐。
- 在工作區(qū)中有一個(gè)隱藏目錄:
.git文件
,這個(gè)是git的版本庫(kù)蝇更,Git的版本庫(kù)里存了很多東西恃逻,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)闷祥,還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫HEAD。 -
暫存區(qū)擁有跟上一個(gè)版本完全一樣的目錄結(jié)構(gòu)和文件
前面講了我們把文件往Git版本庫(kù)里添加的時(shí)候赁豆,是分兩步執(zhí)行的:
第一步是用git add把文件添加進(jìn)去姨裸,實(shí)際上就是把文件修改添加到暫存區(qū)蹄溉;
第二步是用git commit提交更改屎暇,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。
因?yàn)槲覀儎?chuàng)建Git版本庫(kù)時(shí)况脆,Git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支饭宾,所以,現(xiàn)在格了,git commit就是往master分支上提交更改看铆。
你可以簡(jiǎn)單理解為,需要提交的文件修改通通放到暫存區(qū)盛末,然后弹惦,一次性提交暫存區(qū)的所有修改否淤。
14、接13
修改readme文件如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
新增一個(gè)LICENSE文本文件(內(nèi)容隨便寫)棠隐。
This is LICENSE file.
然后查看狀態(tài)如下:
Git非常清楚地告訴我們叹括,readme.txt被修改了,而LICENSE還從來(lái)沒(méi)有被添加過(guò)宵荒,所以它的狀態(tài)是Untracked。
調(diào)用兩次add命令再查看狀態(tài)如下:
下面這個(gè)圖中stage中沒(méi)有完全把目錄結(jié)構(gòu)寫出來(lái)
提交之后如下:
這個(gè)版本控制有點(diǎn)厲害啊净嘀,應(yīng)該是我操作的時(shí)候復(fù)制粘貼刪除等报咳,雖然內(nèi)容一樣,但是這都能整出來(lái)挖藏。暑刃。
15、針對(duì)暫存區(qū)再做一次測(cè)試:
現(xiàn)在版本庫(kù)和工作區(qū)中的文件是:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
修改文件如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
1
此時(shí)未執(zhí)行add命令膜眠,調(diào)用git diff readme.TXT
岩臣,結(jié)果如下:
再一次修改文件如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
2
結(jié)果如下:
因?yàn)闀捍鎱^(qū)中有完整的上一個(gè)版本的內(nèi)容,所以git diff比較的就是工作區(qū)跟暫存區(qū)之間的差異宵膨。
此時(shí)調(diào)用git diff --cached readme.TXT
架谎,結(jié)果如下:
說(shuō)明該命令是比較版本庫(kù)與暫存區(qū)的差異。
此時(shí)調(diào)用
git diff HEAD
辟躏,結(jié)果如下:跟git diff的結(jié)果完全一致谷扣,說(shuō)明:確實(shí)是跟版本庫(kù)做對(duì)比,查看當(dāng)前工作區(qū)修改的內(nèi)容捎琐。
16会涎、接15
執(zhí)行一次add命令,
修改readme文件如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
2
3
此時(shí)分別執(zhí)行g(shù)it diff和gitdiff head和git diff --cached readme.TXT瑞凑,如下:
可以看到末秃,git diff比較的是工作區(qū)與暫存區(qū)的差異,git diff head比較的是上一個(gè)版本與工作區(qū)的差異籽御。
綜上:git diff
在沒(méi)有add之前比較的是上一個(gè)版本跟當(dāng)前工作區(qū)的差異练慕,在add之后比較的是工作區(qū)與暫存區(qū)的差異;git diff HEAD
一直比較的是上一個(gè)版本跟當(dāng)前工作區(qū)的差異技掏,git diff caches
比較的是暫存區(qū)與上一個(gè)版本的差異贺待。
這樣理解是錯(cuò)的,git diff
一直比較的是工作區(qū)跟暫存區(qū)的差異零截,只是因?yàn)闀捍鎱^(qū)中有上一個(gè)版本而已麸塞,所以在沒(méi)add之前,跟add之后會(huì)出現(xiàn)差異涧衙。
git diff 本身只顯示尚未暫存的改動(dòng)哪工,而不是自上次提交以來(lái)所做的所有改動(dòng)奥此。尚未暫存的改動(dòng),用詞真的是精辟
17雁比、修改的撤銷
首先將文件恢復(fù)至原始狀態(tài):
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
修改文件:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
1
此時(shí)沒(méi)有add操作稚虎,調(diào)用
git checkout -- readme.TXT
命令之后,結(jié)果如下:可以看到修改被撤銷了偎捎。
然后再進(jìn)行如下操作:
修改文件:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
1
add之后再修改文件:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
1
2
調(diào)用git checkout 命令結(jié)果如下:
說(shuō)明
git checkout -- readme.TXT
命令是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)蠢终。這個(gè)時(shí)候文件已經(jīng)進(jìn)暫存區(qū)了,還沒(méi)有提交茴她,要想撤銷暫存區(qū)的修改寻拂,可以使用
git reset HEAD readme.TXT
命令,結(jié)果如下:此時(shí)調(diào)用git status和gitdiff結(jié)果如下:
可以看到文件恢復(fù)至未add的狀態(tài)丈牢,此時(shí)再調(diào)用checkout命令祭钉,結(jié)果如下:
可以看到修改被完全撤銷了。
如果已經(jīng)commit了己沛,則可以使用版本回退功能慌核。
18、刪除
執(zhí)行rm
命令申尼,刪除文件垮卓,如下所示:
這個(gè)時(shí)候,Git知道你刪除了文件师幕,因此扒接,工作區(qū)和版本庫(kù)就不一致了,git status命令會(huì)立刻告訴你哪些文件被刪除了∶茄茫現(xiàn)在你有兩個(gè)選擇钾怔,一是確實(shí)要從版本庫(kù)中刪除該文件,那就用命令git rm刪掉蒙挑,并且git commit宗侦。
另一種情況是刪錯(cuò)了,因?yàn)榘姹編?kù)里還有呢忆蚀,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:
此時(shí)文件就恢復(fù)了矾利。
19、遠(yuǎn)程倉(cāng)庫(kù)
首先注冊(cè)github'賬號(hào)馋袜,因?yàn)檫@里是使用ssh加密男旗,所以要先進(jìn)行一些設(shè)置:
第1步:創(chuàng)建SSH Key。在用戶主目錄下欣鳖,看看有沒(méi)有.ssh目錄察皇,如果有,再看看這個(gè)目錄下有沒(méi)有id_rsa和id_rsa.pub這兩個(gè)文件,如果已經(jīng)有了什荣,可直接跳到下一步矾缓。如果沒(méi)有,打開(kāi)Shell(Windows下打開(kāi)Git Bash)稻爬,創(chuàng)建SSH Key:
ssh-keygen -t rsa -C "431370446@qq.com"
嗜闻,然后一路回車,使用默認(rèn)值即可桅锄。如果一切順利的話琉雳,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個(gè)文件友瘤,這兩個(gè)就是SSH Key的秘鑰對(duì)翠肘,id_rsa是私鑰,不能泄露出去商佑,id_rsa.pub是公鑰,可以放心地告訴任何人厢塘。第2步:登陸GitHub茶没,打開(kāi)“Account settings”,“SSH Keys”頁(yè)面:
然后晚碾,點(diǎn)“Add SSH Key”抓半,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容:
為什么GitHub需要SSH Key呢格嘁?因?yàn)镚itHub需要識(shí)別出你推送的提交確實(shí)是你推送的笛求,而不是別人冒充的,而Git支持SSH協(xié)議糕簿,所以探入,GitHub只要知道了你的公鑰,就可以確認(rèn)只有你自己才能推送懂诗。
當(dāng)然蜂嗽,GitHub允許你添加多個(gè)Key。假定你有若干電腦殃恒,你一會(huì)兒在公司提交植旧,一會(huì)兒在家里提交,只要把每臺(tái)電腦的Key都添加到GitHub离唐,就可以在每臺(tái)電腦上往GitHub推送了病附。
第三步:具體推送
20、分支基礎(chǔ)知識(shí)
在版本回退里亥鬓,你已經(jīng)知道完沪,每次提交,Git都把它們串成一條時(shí)間線嵌戈,這條時(shí)間線就是一個(gè)分支丽焊。截止到目前较剃,只有一條時(shí)間線,在Git里技健,這個(gè)分支叫主分支写穴,即
master
分支。HEAD
嚴(yán)格來(lái)說(shuō)不是指向提交雌贱,而是指向master
啊送,master
才是指向提交的,所以欣孤,HEAD
指向的就是當(dāng)前分支馋没。一開(kāi)始的時(shí)候,master分支是一條線降传,Git用master指向最新的提交篷朵,再用HEAD指向master,就能確定當(dāng)前分支婆排,以及當(dāng)前分支的提交點(diǎn):
master其實(shí)是一個(gè)分支名而已声旺,指向這個(gè)分支下的最新的版本,head指向當(dāng)前分支段只。
21腮猖、分支測(cè)試
目前文件內(nèi)容如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
首先,創(chuàng)建dev分支:
查看分支:
此時(shí)修改文件為:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
1
在dev分支上進(jìn)行提交:
切換回master分支查看文件:
因?yàn)槟莻€(gè)提交是在dev分支上赞枕,而master分支此刻的提交點(diǎn)并沒(méi)有變澈缺。
合并分支之后再查看:
22、解決沖突
首先先建立一個(gè)分支然后feature1然后再回到master分支炕婶,則會(huì)提示比遠(yuǎn)程多一次提交:
然后轉(zhuǎn)到feature1分支上姐赡,在該分支上修改文件如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
1
featrue1
然后提交,再轉(zhuǎn)到master分支上:
修改文件如下柠掂,然后提交:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
1
master
這種情況下雏吭,Git無(wú)法執(zhí)行“快速合并”,只能試圖把各自的修改合并起來(lái)陪踩,但這種合并就可能會(huì)有沖突杖们,我們?cè)囋嚳矗?/p>
這時(shí)候再去看工作區(qū)的readme文件會(huì)發(fā)現(xiàn):變成了這個(gè)樣子:
我們修改為以下,然后保存提交:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
1
master
featrue1
可以查看合并沖突的記錄:
最后刪除分支:
23肩狂、分支管理策略
通常摘完,合并分支時(shí),如果可能傻谁,Git會(huì)用Fast forward模式孝治,但這種模式下,刪除分支后,會(huì)丟掉分支信息谈飒。
如果要強(qiáng)制禁用Fast forward模式岂座,Git就會(huì)在merge時(shí)生成一個(gè)新的commit,這樣杭措,從分支歷史上就可以看出分支信息费什。
測(cè)試:
在dev分支上岸原來(lái)的模式提交,在dev3上不用Fast forward模式模式提交:
可以看到保留了dev3的分支歷史手素。
24鸳址、bug分支
首先在dev3分支干活,但是做的修改沒(méi)add泉懦,這時(shí)候調(diào)用
git stash
來(lái)保修現(xiàn)場(chǎng)稿黍,然后轉(zhuǎn)到maste分支,生成dev4分支崩哩,在該分支上干完活病提交之后巡球,在返回dev3分支,調(diào)用git stash apply
來(lái)恢復(fù)現(xiàn)場(chǎng)25邓嘹、遠(yuǎn)程推送