1. 創(chuàng)建git項(xiàng)目
比如目前是在demo文件夾中,那么
git? init
可以吧demo文件夾創(chuàng)建為git的根目錄:

創(chuàng)建完成后可以看到,demo文件夾下面多了一個(gè).git文件夾,里面存放的是git倉(cāng)庫(kù)的所有文件和內(nèi)容:

里面的內(nèi)容包含了一個(gè)完整的git倉(cāng)庫(kù),比如前面提到的元數(shù)據(jù)就存儲(chǔ)在objects文件夾下面。
如果不想創(chuàng)建當(dāng)前目錄為git倉(cāng)庫(kù),想把倉(cāng)庫(kù)創(chuàng)建在當(dāng)前目錄的子目錄下面,比如test,可以執(zhí)行下面的命令:
git? init? test
這樣就創(chuàng)建了一個(gè)test倉(cāng)庫(kù),進(jìn)去可以看到.git文件夾:

2. 提交文件
在git倉(cāng)庫(kù)下面新建一個(gè)文件hello.txt,并寫(xiě)入內(nèi)容“hello world 11”(新文件也可以從其他地方拷貝過(guò)來(lái)):

增加新文件后,來(lái)看一下倉(cāng)庫(kù)目前的狀態(tài):
git? status

這個(gè)命令列出了一些倉(cāng)庫(kù)和文件的信息,其中hello.txt文件的名字為紅色,代表文件本身還是獨(dú)立的,沒(méi)有交給git倉(cāng)庫(kù)來(lái)管理。要把文件提交到git里面,第一步就是要把文件添加到暫存區(qū),使用add命令:
git? add? hello.txt

添加到暫存區(qū)后,文件名字變?yōu)榫G色,git狀態(tài)顯示hello.txt是一個(gè)倉(cāng)庫(kù)新文件,現(xiàn)在的狀態(tài)才允許我們?nèi)ヌ峤坏絞it里面。
status命令打印出的內(nèi)容也有一個(gè)提示,就是git rm名,這個(gè)命令允許我們把添加到暫存區(qū)的文件從暫存區(qū)刪除:
git? rm? --cached? hello.txt

可以看到把文件從暫存區(qū)刪除以后,文件又恢復(fù)了新文件的一個(gè)狀態(tài),名字變?yōu)榱思t色。注意從git暫存區(qū)刪除并不是從目錄中刪除,文件只是改變了狀態(tài)。
有時(shí)候文件夾下面文件非常多,一個(gè)一個(gè)添加顯然是很麻煩的,我們可以用批量添加到暫存區(qū)的命令來(lái)處理:
git? add? -A

文件添加到暫存區(qū)后,下一步就是提交到本地git倉(cāng)庫(kù):
git? commit? hello.txt? -m? '提交hello文件 11'
其中-m后面的內(nèi)容是對(duì)本次提交的一個(gè)注釋。

可以看到提交命令打印出了git倉(cāng)庫(kù)變化的信息,一個(gè)文件發(fā)生了變化并新增到倉(cāng)庫(kù)中。再來(lái)看看倉(cāng)庫(kù)的狀態(tài):

這時(shí)候顯示工作區(qū)很干凈,沒(méi)有要提交的文件。上面就是一個(gè)新文件從添加到提交到本地倉(cāng)庫(kù)的一個(gè)整個(gè)的流程。提交也有批量提交的命令:
git commit -am '快速提交所有'
如何回退到前面提交的版本呢?首先找到版本號(hào),查看所有提交日志:
git log????

commit后面的一長(zhǎng)串序列化就是每次提交的唯一版本號(hào),也是上一篇文章提到的元數(shù)據(jù)的id,第一行里面HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們?cè)诎姹镜臍v史之間穿梭,使用命令git reset --hard commit_id:
git reset --hard abeb59745aed5ae0402d61d2defcc57b83b82cd1

再來(lái)看提交歷史

顯示的就是HEAD當(dāng)前指向的版本和以前的提交,之后的提交并沒(méi)有顯示,那么如果我們想回到最新的一次提交,又忘了id了怎么辦?可以用git reflog查看命令歷史,以便確定要回到未來(lái)的哪個(gè)版本:
git reflog

打印出的內(nèi)容中,HEAD指向的歷史都打印了出來(lái),顯然第二個(gè)HEAD@{2}是最新的一次提交,我們可以把HEAD指向這個(gè)提交,前面的id只顯示前幾位,不過(guò)我們使用版本號(hào)的時(shí)候,只要唯一,輸入前幾位也可以:
git reset --hard?5d43c54

這樣就又回來(lái)了。所以大家可以放心的在各個(gè)提交之間穿梭。
如果想要丟棄現(xiàn)在正在修改為部分,如何操作?你在已經(jīng)提交的文件里又修改了一些內(nèi)容,加了一些代碼,沒(méi)提交前發(fā)現(xiàn)這些東西是錯(cuò)誤的,想把文件恢復(fù)到修改前的狀態(tài):

可以使用下面的命來(lái)丟棄對(duì)文件的修改:
git checkout --? hello.txt

如果丟棄前,發(fā)現(xiàn)已經(jīng)添加到了暫存區(qū),那么要先執(zhí)行一條命令:
git reset HEAD hello.txt
然后再執(zhí)行?git checkout --? hello.txt 就可以丟棄了。
如果已經(jīng)提交了,那也很簡(jiǎn)單,直接使用上面的版本退回即可。如果已經(jīng)推送到遠(yuǎn)程了,那只能再修改回來(lái)然后提交推送了。
如果項(xiàng)目?jī)?yōu)化后,其中一個(gè)文件已經(jīng)徹底沒(méi)用了,可以刪除了,如何在git倉(cāng)庫(kù)中刪除呢?首先要從操作系統(tǒng)文件夾中刪除文件:

這時(shí)候查看倉(cāng)庫(kù)狀態(tài):

這時(shí)候有兩種選擇,一個(gè)是刪除錯(cuò)了,需要恢復(fù),那么直接從倉(cāng)庫(kù)里恢復(fù)即可:
git checkout -- delete.txt

還有一種情況是刪除對(duì)了,但是現(xiàn)在只從文件夾中刪除了,git中還沒(méi)有刪除,需要執(zhí)行下面的命令:
git rm delete.txt
git commit -m 'delete delete.txt'

這樣就從本地倉(cāng)庫(kù)中刪除了。
3. 推送文件到遠(yuǎn)程倉(cāng)庫(kù)
本地倉(cāng)庫(kù)有了文件后,可以每次都推送到遠(yuǎn)程倉(cāng)庫(kù),也可以積攢一批之后,整個(gè)推送過(guò)去。推送到遠(yuǎn)程倉(cāng)庫(kù)前,得先有一個(gè)遠(yuǎn)程倉(cāng)庫(kù),可以自行注冊(cè)github,gitlab,gitee等倉(cāng)庫(kù):

然后在遠(yuǎn)程倉(cāng)庫(kù)中創(chuàng)建一個(gè)test項(xiàng)目:

可以看到項(xiàng)目連接的左側(cè)顯示有https和ssh兩種傳輸方式,一般我們開(kāi)發(fā)都是使用最快的ssh方式支持的原生git協(xié)議,使用這種方式需要做一下配置,首先初始化本地git用戶信息:
git config --global user.name "Your Name"
git config --global user.email "Your email"
然后執(zhí)行命令創(chuàng)建?SSH Key:
ssh-keygen? -t? rsa? -C? "Your email"

中間所有的停頓不用輸入任何東西,直接回車即可。生成完后,進(jìn)入用戶目錄下的.ssh文件夾中:
cd ~/.ssh

這里有兩個(gè)文件,一個(gè)id_rsa,一個(gè)id_rsa.pub,我們打開(kāi)id_rsa.pub文件,把里面的內(nèi)容復(fù)制一份。進(jìn)入遠(yuǎn)程倉(cāng)庫(kù)的個(gè)人設(shè)置頁(yè)面的ssh key設(shè)置頁(yè)碼:

添加一個(gè)公鑰:

點(diǎn)擊確定,公鑰就添加完成了。

注意即使一個(gè)賬號(hào),有多個(gè)電腦開(kāi)發(fā)提交,也要為每個(gè)電腦生成公鑰并添加到遠(yuǎn)程配置中。公鑰設(shè)置完成后,就可以在本地倉(cāng)庫(kù)添加遠(yuǎn)程倉(cāng)庫(kù)的地址了:
git remote add origin?git@gitee.com:blueses/test.git

其中origin是遠(yuǎn)程倉(cāng)庫(kù)的名字,也是git為默認(rèn)遠(yuǎn)程倉(cāng)庫(kù)起的名字。下面就可以推送到遠(yuǎn)程了:

第一次推送,提示當(dāng)前分支沒(méi)有對(duì)應(yīng)的遠(yuǎn)程分支,我們要把兩個(gè)對(duì)應(yīng)起來(lái),那么第一次推送必須加上--set-upstream參數(shù):
git push --set-upstream origin master

中間提問(wèn)是否繼續(xù)連接,輸入yes,回車即可,打印出來(lái)的信息可以看到本地master分支已經(jīng)設(shè)置為跟蹤遠(yuǎn)程倉(cāng)庫(kù)的master分支,并已經(jīng)將本地master分支的文件推送到了遠(yuǎn)程master上面。
第一次也可以使用命令:
git push -u origin master
效果一樣。
上面的第一次添加遠(yuǎn)程倉(cāng)庫(kù),第一次建立跟蹤確實(shí)有點(diǎn)麻煩,不過(guò)添加遠(yuǎn)程倉(cāng)庫(kù)時(shí)也就是這一次,后面再推送就不會(huì)這么麻煩了?,F(xiàn)在來(lái)看一下遠(yuǎn)程倉(cāng)庫(kù):

可以看到遠(yuǎn)程倉(cāng)庫(kù)多了一個(gè)我們本地的文件,并顯示了我們提交文件時(shí)寫(xiě)的注釋,證明推送是成功的!
來(lái)修改一下文件的內(nèi)容:

現(xiàn)在看一下倉(cāng)庫(kù)狀態(tài):

狀態(tài)顯示文件以及進(jìn)行了修改,把修改后的文件提交到本地倉(cāng)庫(kù)也很簡(jiǎn)單,和前面一樣,先加到暫存區(qū):
git? add? hello.txt

然后提交到本地倉(cāng)庫(kù):
git? commit? hello.txt? -m '提交修改后的hello.txt? 11-222'

現(xiàn)在向遠(yuǎn)程倉(cāng)庫(kù)推送第二次提交內(nèi)容,就不會(huì)像第一次那么麻煩了:
git push origin

查看遠(yuǎn)程倉(cāng)庫(kù)變化:

我們自己的提交和推送的工作很順利,如果別人想加入項(xiàng)目,拉取代碼進(jìn)行開(kāi)發(fā)怎么辦呢?需要使用到克隆命令,不過(guò)在下載代碼之前,也需要本身生成ssh-key,然后配置遠(yuǎn)程自己的賬戶中,這個(gè)不再描述。
準(zhǔn)備工作做好以后,接下來(lái)是克隆代碼:
git clone?git@gitee.com:blueses/test.git

可以看到克隆命令就是一個(gè)下載倉(cāng)庫(kù)的過(guò)程,在克隆的目錄中,會(huì)生成一個(gè)項(xiàng)目名命名的文件夾:

如果想用別的名字,可以在路徑后面加上想要命名的名字,比如想命名為hello:
git clone?git@gitee.com:blueses/test.git hello
克隆完后進(jìn)入文件夾,可以看到一個(gè)一模一樣的git倉(cāng)庫(kù):

新加入的人員也可以修改文件內(nèi)容并提交:

保存后查看狀態(tài):

然后是添加到暫存:

提交到本地倉(cāng)庫(kù):

由于新加入的人員是主動(dòng)克隆的代碼,在克隆的時(shí)候已經(jīng)做了本地和遠(yuǎn)程分支的跟蹤配置,所以可以直接推送:
git push origin
前面說(shuō)過(guò)origin是默認(rèn)遠(yuǎn)程倉(cāng)庫(kù)的名字,所以這個(gè)是可以省略的:
git push

查看遠(yuǎn)程倉(cāng)庫(kù)的變化:

原來(lái)的項(xiàng)目人員,或者說(shuō)所有其他的項(xiàng)目人員也要繼續(xù)工作,提交和推送。關(guān)于添加到暫存區(qū),和提交到本地倉(cāng)庫(kù)中,兩個(gè)都是本地操作,可以毫無(wú)顧忌的完成。但是推送到遠(yuǎn)程倉(cāng)庫(kù)前要注意,因?yàn)椴恢肋h(yuǎn)程倉(cāng)庫(kù)是否有變化,是否有他人的新的提交推送,所以,我們執(zhí)行g(shù)it push前往往都會(huì)先執(zhí)行一次從遠(yuǎn)程更新到本地的操作:
git pull origin

注意上面的倉(cāng)庫(kù)名origin是默認(rèn)的,所以同樣可以省略:
git pull
執(zhí)行完后再把本地提交推送到遠(yuǎn)程倉(cāng)庫(kù):
git push
所以,上面的整個(gè)流程就是開(kāi)發(fā)時(shí)的常用流程(添加遠(yuǎn)程倉(cāng)庫(kù)和克隆因?yàn)橹贿M(jìn)行一次所以不算),添加(add),提交(commit),更新(pull),推送(push),當(dāng)然這個(gè)流程的前提是在一個(gè)分支上,多分支開(kāi)發(fā)后面再說(shuō)。
查看所有遠(yuǎn)程倉(cāng)庫(kù):
git remote

查看遠(yuǎn)程詳細(xì)信息:
git remote -v

可以看到除了一個(gè)push還有一個(gè)fetch,git fetch命令是用來(lái)同步信息的,比如遠(yuǎn)程新建了一個(gè)分支,本地是不能馬上看到的,執(zhí)行g(shù)it fetch之后才能看到:

添加和刪除遠(yuǎn)程倉(cāng)庫(kù)的命令是:
git remote add url remote_name
git remote remoge remote_name
如果是默認(rèn)的遠(yuǎn)程倉(cāng)庫(kù),那么推送和拉取命令中可以省略名字,其它的還是要加上,這樣git可以操作多個(gè)遠(yuǎn)程倉(cāng)庫(kù)。如何知道默認(rèn)的遠(yuǎn)程倉(cāng)庫(kù)是哪個(gè)呢?可以借助分支的命令:
git branch -avv

可以看到當(dāng)前分支默認(rèn)關(guān)聯(lián)的是origin的master分支,所以不加名字會(huì)默認(rèn)推送到origin下面的master分支。
4. 分支管理
使用git的都知道分支的管理。在使用中有很多人也遇到過(guò)各種風(fēng)格。比如一個(gè)master分支一路走到底。還比如一個(gè)bug一個(gè)分支,一個(gè)需求一個(gè)分支。還有的是根據(jù)環(huán)境進(jìn)行分支管理,有開(kāi)發(fā)分支,測(cè)試分支,正式環(huán)境分支。等等各種風(fēng)格都有,這里值得一說(shuō)的是,沒(méi)有最好的,只有最合適的,git之所以牛就是因?yàn)樗m用于從最簡(jiǎn)單到最復(fù)雜的各種情況,只要團(tuán)隊(duì)使用方便,舒服,就是最好的分支使用方式。反之因?yàn)間it分支的使用造成了開(kāi)發(fā)的混亂,那就得不償失了。
分支可以簡(jiǎn)單也可以復(fù)雜,那么分支有沒(méi)有用呢?實(shí)踐證明還是很有用的,比如現(xiàn)在已經(jīng)二月份了,正在緊急開(kāi)發(fā),而線上運(yùn)行的是一月份打包的版本,這個(gè)時(shí)候突然發(fā)現(xiàn)線上有個(gè)bug需要修改,這個(gè)時(shí)候在開(kāi)發(fā)分支上改顯然是不合適的,不僅和新代碼新功能混在一起,測(cè)試和上線都是問(wèn)題。最好的辦法是從線上運(yùn)行版本的那個(gè)時(shí)間點(diǎn)的提交的地方拉取一個(gè)分支,進(jìn)行修改這樣可以將影響最小化,修改完成測(cè)試通過(guò)上線以后,再講修改的代碼合并到其他分支。所以線上正式版本的分支最好用于是master分支,開(kāi)發(fā),測(cè)試,修改問(wèn)題等等可以從線上拉取分支進(jìn)行操作,這樣可以將影響降到最低。分支的使用有很多地方,不止這一個(gè)例子。
使用分支也能體現(xiàn)git相對(duì)于svn的一個(gè)優(yōu)勢(shì),以前使用svn切換分支,速度是相當(dāng)慢的,git則不同,分支的切換速度是秒級(jí)的。
下面來(lái)看一些具體的分支命令,首先是查看當(dāng)前分支:
git branch

可以看到當(dāng)前只有一個(gè)本地分支,就是master。但是本地分支有一個(gè),總的分支數(shù)量卻不是一個(gè),我們已經(jīng)將遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)到了本地倉(cāng)庫(kù)中,所以本地還有一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的分支,查看本地和遠(yuǎn)程所有分支的命令是:
git branch -avv

遠(yuǎn)程分支和本地分支已經(jīng)進(jìn)行了關(guān)聯(lián),那么它們是一個(gè)分支嗎?其實(shí)并不是,下面來(lái)修改一下文件,然后進(jìn)行提交操作,完成后,查看所有分支:

可以看到本地提交后,遠(yuǎn)程分支并且有隨之改變,所以它們的內(nèi)容并不一樣,因此并不是同一個(gè)分支。來(lái)看一下本地分支文件的內(nèi)容:

下面切換分支,切換到遠(yuǎn)程分支:
git? checkout? origin/master
然后查看文件內(nèi)容:

可以看到遠(yuǎn)程分支的文件內(nèi)容還是上一個(gè)版本的內(nèi)容,因?yàn)槲覀冞€沒(méi)有push,所以遠(yuǎn)程沒(méi)有變化。切換回本地分支:

總結(jié):
git branch 查看本地分支
git branch -a 查看本地和遠(yuǎn)程所有分支
git branch -av 查看所有分支的詳細(xì)信息
git branch -avv 查看所有分支詳細(xì)信息以及本地和遠(yuǎn)程分支的關(guān)聯(lián)信息
git checkout 切換分支
下面來(lái)說(shuō)說(shuō)創(chuàng)建分支,首先基于本地當(dāng)前正在使用的分支,創(chuàng)建一個(gè)新分支,比如基于本地master創(chuàng)建一個(gè)分支test:
git branch test

如果是基于非當(dāng)前分支創(chuàng)建,比如基于test創(chuàng)建dev,那么需要加上test分支的名字:
git branch dev test

然后是基于遠(yuǎn)程分支創(chuàng)建一個(gè)本地新分支,比如基于遠(yuǎn)程master分支,創(chuàng)建一個(gè)本地demo分支:
git branch demo origin/master

然后是基于一個(gè)提交創(chuàng)建一個(gè)新分支,首先看一下有哪些提交:
git log

可以看到越下面的記錄是越早的,第一次的提交是?02686ca5d87f9380d72ec845eb94d716e353d6f3 ,基于第一次提交創(chuàng)建一個(gè)分支 first:
git branch first??02686ca5d87f9380d72ec845eb94d716e353d6f3

其實(shí)本質(zhì)上來(lái)說(shuō),基于分任何內(nèi)容任何形式創(chuàng)建一個(gè)新分支,都是基于一個(gè)提交創(chuàng)建分支,這個(gè)后面講底層原理的時(shí)候回更清楚的講解。
還可以基于一個(gè)tag(標(biāo)簽)創(chuàng)建一個(gè)新分支,標(biāo)簽本質(zhì)上可以理解為一個(gè)特殊的分支,它是只讀的,因此更加安全,可以用來(lái)作為版本里程碑,查看所有標(biāo)簽:
git tag
基于當(dāng)前分支創(chuàng)建一個(gè)標(biāo)簽?
git tag v1.0

然后基于這個(gè)標(biāo)簽創(chuàng)建一個(gè)分支tagbranch:
git branch tagbranch v1.0

一個(gè)簡(jiǎn)單的命令是,創(chuàng)建并切換分支dev:
git checkout -b dev
下面來(lái)看一下刪除分支,比如刪除分支tagbranch:
git branch -d tagbranch
git branch -D 分支名(表示強(qiáng)行刪除一個(gè)分支)

-d后面可以跟多個(gè)分支,用空格隔開(kāi),這樣可以批量刪除多個(gè)分支。
上面講了創(chuàng)建分支,切換分支,刪除分支,下面來(lái)看一下合并分支,首先整理分支,講本地master與遠(yuǎn)程master保持一致:

基于當(dāng)前master分支創(chuàng)建一個(gè)dev分支,然后切換到dev分支,修改并提交:

注意當(dāng)前分支在dev上,我們需要把dev的內(nèi)容合并到master上面,這時(shí)候先切換到master分支上,然后合并:
git checkout master
git merge dev? (表示將dev分支的內(nèi)容合并到當(dāng)前分支,也就是master分支)
git push

上面顯示的Fast-forward信息,Git告訴我們,這次合并是“快進(jìn)模式”,也就是直接把master指向dev的當(dāng)前提交,所以合并速度非??臁?/p>
通常,合并分支時(shí),如果可能,Git會(huì)用Fast forward模式,但這種模式下,刪除分支后,會(huì)丟掉分支信息。如果要強(qiáng)制禁用Fast forward模式,Git就會(huì)在merge時(shí)生成一個(gè)新的commit,這樣,從分支歷史上就可以看出分支信息。下面來(lái)看一下,創(chuàng)建并切換到一個(gè)新分支:
git checkout -b dev2

修改文件并提交,然后回到master分支:

準(zhǔn)備合并dev2分支,請(qǐng)注意--no-ff參數(shù),表示禁用Fast forward:
git merge --no-ff -m 'merge with no-ff' dev2

合并后,我們用git log看看分支歷史:
git log --graph --pretty=oneline --abbrev-commit

git push到遠(yuǎn)程后,從遠(yuǎn)程倉(cāng)庫(kù)也能看到分支歷史:

建議開(kāi)發(fā)過(guò)程中充分利用分支,并且都使用普通模式,禁用Fast forward,否則看不出分支合并歷史。
下面看一個(gè)問(wèn)題,如果文件修改到一半還么有提交,恰好有個(gè)bug需要新建一個(gè)分支修改,但是現(xiàn)在的代碼又不能提交怎么辦?可以把正在進(jìn)行的工作隱藏起來(lái):
git? stash

然后完成新建分支,修改bug,最后切換回來(lái),并合并分支的過(guò)程,完成后需要恢復(fù)剛才改到一半的工作,修改查看stash列表:
git stash list

工作現(xiàn)場(chǎng)還在,Git把stash內(nèi)容存在某個(gè)地方了,但是需要恢復(fù)一下:
git stash pop

這樣就恢復(fù)到了修改一半但是沒(méi)有提交的進(jìn)度,是非常實(shí)用的功能!
很多人有這樣的習(xí)慣,git push前先進(jìn)行g(shù)it pull,從理論上來(lái)說(shuō)沒(méi)啥問(wèn)題,提交前先把遠(yuǎn)程代碼拉到本地然后進(jìn)行合并,最后將本地最新的結(jié)果推送到遠(yuǎn)程,這樣是可以的,但是提交時(shí)會(huì)出現(xiàn)很多自動(dòng)merge的情況,其實(shí)git多人開(kāi)發(fā)也是可以一條直線干凈的提交的。在最后push之前,可以進(jìn)行rebase操作:
git? rebase
然后再執(zhí)行g(shù)it push即可。
還有一些命令,比如在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(yīng)的分支,使用
git checkout -b demo origin/demo
demo是分支名,本地和遠(yuǎn)程分支的名稱最好一致。
5. 標(biāo)簽管理
標(biāo)簽可以理解為只讀的一個(gè)分支,不能用來(lái)推送,可以下載,發(fā)布新版本往往會(huì)專門(mén)創(chuàng)建一個(gè)標(biāo)簽,創(chuàng)建一個(gè)新標(biāo)簽:
git tag tag1
創(chuàng)建一個(gè)標(biāo)簽也可以指定標(biāo)簽的信息:
git tag -a v1.0 -m "創(chuàng)建v1.0版本標(biāo)簽"
基于某個(gè)分支創(chuàng)建一個(gè)標(biāo)簽:
git tag tag2 master
基于某個(gè)提交創(chuàng)建一個(gè)tag:
git tag tag3?02686ca5d87f9380d72ec845eb94d716e353d6f3
查看標(biāo)簽列表:
git tag
刪除標(biāo)簽
git tag -d tag_name

注意tag的名字最好不要和分支的名字一樣!
推送一個(gè)本地標(biāo)簽到遠(yuǎn)程:
git push origin <tagname>

推送全部未推送過(guò)的本地標(biāo)簽:
git push origin --tags
刪除一個(gè)遠(yuǎn)程標(biāo)簽(注意origin后面是一個(gè)空格):
git? push? origin? :refs/tags/<tagname>

6. 日志管理
列出當(dāng)前master下面所有的提交日志:
git log

來(lái)看最上面的一個(gè)記錄:

commit右面的序列化表示最新的提交id,后面跟了一些分支和標(biāo)簽表示本次提交和那些分支標(biāo)簽同步,下面兩行是提交人和提交時(shí)間,最下面是提交備注。
git log命令輸入后,并不會(huì)馬上退出,最下面是一個(gè)冒號(hào),這里可以輸入內(nèi)容進(jìn)行搜索:

輸入左斜杠加上內(nèi)容,然后回車,可以看到符合的內(nèi)容開(kāi)始高亮顯示:

直接git log打印出來(lái)的內(nèi)容是非常繁瑣的,可以簡(jiǎn)化輸出:
git log --oneline

可以看到省略了提交人和提交時(shí)間,把版本和注釋放在了一行。
查看指定分支的提交:
git log dev --oneline

查看master分支上面有多少提交dev分支上是沒(méi)有的:
git log dev..master
如果反過(guò)來(lái)就是查看dev上面有多少?zèng)]有提交到master上:
git log master..dev

兩個(gè)分支merge之后,互相對(duì)比才完全沒(méi)有區(qū)別。
查看提交網(wǎng)絡(luò):
git log --graph

簡(jiǎn)化輸出:
git log --graph --oneline

查看完整的提交id:
git log --graph --pretty=oneline

還有一個(gè)是我們上面講分支的時(shí)候用到的:
git log --graph --pretty=oneline --abbrev-commit
展示當(dāng)前本次改動(dòng)的文件內(nèi)容:
git show

也可以展示別的分支:
git show dev

以上就git常用的一些命令,在實(shí)際開(kāi)發(fā)中大家基本上就是使用IDE操作git,但是建議大家能用命令的時(shí)候盡量用命令,這樣可以加深我們對(duì)git的理解。