本文不適合初學(xué)者,僅僅提供命令目錄簡(jiǎn)單解釋或者當(dāng)做操作手冊(cè)使用,沒(méi)有關(guān)于背景或者詳細(xì)命令解釋。
學(xué)習(xí)git總是斷斷續(xù)續(xù)的,而且基本都是現(xiàn)學(xué)現(xiàn)用,用過(guò)一段時(shí)間就忘記了一些常用命令,好記性不如爛筆頭,我覺(jué)得還是得記錄下來(lái),以便于之后忘記了可以迅速的了解并且上手。
關(guān)于git的背景介紹之類的,就不多做介紹如果有需要了解請(qǐng)?jiān)L問(wèn)鏈接:
廖雪峰的git教程
下面正式開(kāi)始
git pull 拉取代碼
git push推送代碼
- git init命令把這個(gè)目錄變成Git可以管理的倉(cāng)庫(kù),比如我們開(kāi)始開(kāi)發(fā)一個(gè)新的項(xiàng)目并且作為git的倉(cāng)庫(kù),那么在這個(gè)目錄下面就可以實(shí)行這個(gè)命令
- git add告訴Git,把文件添加到倉(cāng)庫(kù)
- git commit告訴Git,把文件提交到倉(cāng)庫(kù),需要跟-m "解釋",完整使用
git commit -m "提交了哪些,用作干嘛的之類的"
注:提交一個(gè)文件首先add,然后commit - git status 是用來(lái)查詢當(dāng)前版本狀態(tài),比如有哪些add,哪些文件修改了之類的信息。
- git diff顧名思義就是查看difference,git diff 文件名.后綴
- git log 查看版本提交歷史,這個(gè)可以用于回退歷史使用。如下面
$ git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 15:11:49 2013 +0800
append GPL
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 14:53:12 2013 +0800
add distributed
commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 19 17:51:55 2013 +0800
wrote a readme file
commit后面跟著一大串?dāng)?shù)字就是commit提交該次的id號(hào)碼
可以顯示的更加清晰請(qǐng)?jiān)诤竺娓?--pretty=oneline 如圖:
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
- git reset --hard 回退版本,HEAD是當(dāng)前版本,回退上一個(gè)是HEAD,上上個(gè)是HEAD^,以此類推,回退100個(gè)就是HEAD~100,當(dāng)然也可以跟版本號(hào)碼,git reset --hard 3628164 只需要前幾位可以匹配到就可以了。
--git reflog 如果你實(shí)在找不到版本,可以使用這個(gè)命令來(lái)找所有你輸入的命令。 - git checkout --文件.后綴 ,指的是文件在工作區(qū)的修改全部撤銷
- git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū),當(dāng)我們用HEAD時(shí),表示最新的版本。
- rm test.txt 刪除文件test.txt,下面如果你確實(shí)要在版本庫(kù)里面刪掉就執(zhí)行
git rm test.txt,然后git commit -m "remove test.txt"。提交,如果刪錯(cuò)了可以從版本庫(kù)里面提取git checkout -- test.txt
創(chuàng)建SSH Key
由于你的本地Git倉(cāng)庫(kù)和GitHub倉(cāng)庫(kù)之間的傳輸是通過(guò)SSH加密的,所以,需要設(shè)置ssh key來(lái)建立兩者之間的聯(lián)系。
ssh-keygen -t rsa -C "賬號(hào)"
你需要把郵件地址換成你自己的郵件地址,然后一路回車(chē),使用默認(rèn)值即可,由于這個(gè)Key也不是用于軍事目的,所以也無(wú)需設(shè)置密碼。
如果一切順利的話,可以在用戶主目錄里找到.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)容:
- 建立與遠(yuǎn)程倉(cāng)庫(kù)的鏈接
git remote add origin git@github.com:michaelliao/learngit.git
添加后,遠(yuǎn)程庫(kù)的名字就是origin,這是Git默認(rèn)的叫法,也可以改成別的,但是origin這個(gè)名字一看就知道是遠(yuǎn)程庫(kù)
下一步,就可以把本地庫(kù)的所有內(nèi)容推送到遠(yuǎn)程庫(kù)上
git push -u origin master
把本地庫(kù)的內(nèi)容推送到遠(yuǎn)程,用git push命令,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程。
由于遠(yuǎn)程庫(kù)是空的,我們第一次推送master分支時(shí),加上了-u參數(shù),Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái),在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令。
- git clone 地址 在本地克隆一個(gè)遠(yuǎn)程倉(cāng)庫(kù)
13.git checkout -b dev 創(chuàng)建分支dev,git checkout命令加上-b參數(shù)表示創(chuàng)建并切換,相當(dāng)于以下兩條命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用git branch命令查看當(dāng)前分支:
$ git branch
* dev
master
當(dāng)我們?yōu)橥瓿蒬ev的開(kāi)發(fā)任務(wù)之后,我們開(kāi)始進(jìn)行合并到master分支中:
$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
- git merge命令用于合并指定分支到當(dāng)前分支。合并后,再查看readme.txt的內(nèi)容,就可以看到,和dev分支的最新提交是完全一樣的。
注意到上面的Fast-forward信息,Git告訴我們,這次合并是“快進(jìn)模式”,也就是直接把master指向dev的當(dāng)前提交,所以合并速度非??臁?br> 當(dāng)然,也不是每次合并都能Fast-forward,我們后面會(huì)講其他方式的合并。
合并完成后,就可以放心地刪除dev分支了:
$ git branch -d dev
Deleted branch dev (was fec145a).
關(guān)于分支這塊的小結(jié):
查看分支:git branch
創(chuàng)建分支:git branch <name>
切換分支:git checkout <name>
創(chuàng)建+切換分支:git checkout -b <name>
合并某分支到當(dāng)前分支:git merge <name>
刪除分支:git branch -d <name>
- 合并分支遇到?jīng)_突,遇到?jīng)_突時(shí)候本地的沖突文件就會(huì)有亂碼的地方,把亂碼沖突的部分給處理好,重新add,commit即可
解決之后可以使用git log來(lái)查看分支合并的情況。
git log --graph --pretty=oneline --abbrev-commit
16.用git log --graph命令可以看到分支合并圖。
17.通常,合并分支時(shí),如果可能,Git會(huì)用Fast forward模式,但這種模式下,刪除分支后,會(huì)丟掉分支信息。
如果要強(qiáng)制禁用Fast forward模式,Git就會(huì)在merge時(shí)生成一個(gè)新的commit,這樣,從分支歷史上就可以看出分支信息。
下面我們實(shí)戰(zhàn)一下--no-ff方式的git merge
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
合并分支時(shí),加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支,能看出來(lái)曾經(jīng)做過(guò)合并,而fast forward合并就看不出來(lái)曾經(jīng)做過(guò)合并。
關(guān)于bug分支
- git stash功能,可以把當(dāng)前工作現(xiàn)場(chǎng)“儲(chǔ)藏”起來(lái),等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作。比如需要新開(kāi)分支修改bug的時(shí)候,但是當(dāng)前的分支還沒(méi)有完成提交,這個(gè)時(shí)候就可以使用git stash暫存然后做修改bug的事情。
那么當(dāng)我們完成其他分支工作這時(shí)需要回到之前分支時(shí)候該怎么處理呢?
當(dāng)我們切回分支時(shí)候,發(fā)現(xiàn)工作區(qū)是干凈的,剛才的工作現(xiàn)場(chǎng)存到哪去了?用git stash list命令看看:
git stash list
stash@{0}: WIP on dev: 6224937 add merge
工作現(xiàn)場(chǎng)還在,Git把stash內(nèi)容存在某個(gè)地方了,但是需要恢復(fù)一下,有兩個(gè)辦法:
一是用git stash apply恢復(fù),但是恢復(fù)后,stash內(nèi)容并不刪除,你需要用git stash drop來(lái)刪除;
另一種方式是用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪了
你可以多次stash,恢復(fù)的時(shí)候,先用git stash list查看,然后恢復(fù)指定的stash,用命令:
$ git stash apply stash@{0}
關(guān)于Feature分支
軟件開(kāi)發(fā)中,總有無(wú)窮無(wú)盡的新的功能要不斷添加進(jìn)來(lái)。
添加一個(gè)新功能時(shí),你肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼,把主分支搞亂了,所以,每添加一個(gè)新功能,最好新建一個(gè)feature分支,在上面開(kāi)發(fā),完成后,合并,最后,刪除該feature分支。
- git branch -d feature-vulcan 強(qiáng)制刪除
當(dāng)我們新功能分支開(kāi)發(fā)完畢準(zhǔn)備合并,但是突然因?yàn)樾枨髥?wèn)題不想要了,要?jiǎng)h除,發(fā)現(xiàn)使用-d是會(huì)報(bào)錯(cuò)無(wú)法刪除的,這個(gè)時(shí)候就可以使用強(qiáng)制刪除命令來(lái)刪除分支。
其他的命令
- 要查看遠(yuǎn)程庫(kù)的信息,用git remote,或者,用git remote -v顯示更詳細(xì)的信息
21.推送分支
推送分支,就是把該分支上的所有本地提交推送到遠(yuǎn)程庫(kù)。推送時(shí),要指定本地分支,這樣,Git就會(huì)把該分支推送到遠(yuǎn)程庫(kù)對(duì)應(yīng)的遠(yuǎn)程分支上:
$ git push origin master
如果要推送其他分支,比如dev,就改成:
$ git push origin dev