1.git的安裝
1.1 在Windows上安裝Git
msysgit是Windows版的Git,從https://git-for-windows.github.io下載(網(wǎng)速慢的同學(xué)請(qǐng)移步國內(nèi)鏡像)澈蚌,然后按默認(rèn)選項(xiàng)安裝即可。
安裝完成后晴弃,在開始菜單里找到“Git”->“Git Bash”,蹦出一個(gè)類似命令行窗口的東西逊拍,就說明Git安裝成功上鞠!
安裝完成后,還需要最后一步設(shè)置芯丧,設(shè)置自己的用戶名和郵箱芍阎,在命令行輸入:
$ git config--globaluser.name"Your Name"(設(shè)置用戶名)$ git config--globaluser.email"email@example.com"(設(shè)置常用郵箱,最好與guihub用的郵箱一致)
因?yàn)镚it是分布式版本控制系統(tǒng)缨恒,所以谴咸,每個(gè)機(jī)器都必須自報(bào)家門:你的名字和Email地址轮听。
注意git config命令的--global參數(shù)岭佳,用了這個(gè)參數(shù)血巍,表示你這臺(tái)機(jī)器上所有的Git倉庫都會(huì)使用這個(gè)配置,當(dāng)然也可以對(duì)某個(gè)倉庫指定不同的用戶名和Email地址帆焕。
1.2 在Mac OS X上安裝Git
如果你正在使用Mac做開發(fā)惭婿,有兩種安裝Git的方法。
一是安裝homebrew叶雹,然后通過homebrew安裝Git财饥,具體方法請(qǐng)參考homebrew的文檔:http://brew.sh/。
第二種方法更簡單折晦,也是推薦的方法钥星,就是直接從AppStore安裝Xcode,Xcode集成了Git满着,不過默認(rèn)沒有安裝谦炒,你需要運(yùn)行Xcode,選擇菜單“Xcode”->“Preferences”风喇,在彈出窗口中找到“Downloads”宁改,選擇“Command Line Tools”,點(diǎn)“Install”就可以完成安裝了魂莫。
Xcode是Apple官方IDE还蹲,功能非常強(qiáng)大,是開發(fā)Mac和iOS App的必選裝備耙考,而且是免費(fèi)的谜喊!
2.創(chuàng)建版本庫
2.1版本庫
版本庫又名倉庫,英文名repository,你可以簡單的理解一個(gè)目錄倦始,這個(gè)目錄里面的所有文件都可以被Git管理起來斗遏,每個(gè)文件的修改,刪除鞋邑,Git都能跟蹤最易,以便任何時(shí)刻都可以追蹤歷史怒坯,或者在將來某個(gè)時(shí)刻還可以將文件”還原”。所以創(chuàng)建一個(gè)版本庫也非常簡單藻懒,如下我是E盤 目錄下新建一個(gè)testgit版本庫剔猿。
$ cdE:(找到E盤)$ cd www(假如在www文件夾下)$ mkdir testgit(新建名叫testgit的文件夾)$ cd testgit(找到testgit文件夾)$ pwd (顯示當(dāng)前目錄)/e/testgit
pwd命令用于顯示當(dāng)前目錄。在我的電腦上嬉荆,這個(gè)倉庫位于/e/testgit
如果你使用Windows系統(tǒng)归敬,為了避免遇到各種莫名其妙的問題,請(qǐng)確保目錄名(包括父目錄)不包含中文鄙早。
第二步汪茧,通過git init命令把這個(gè)目錄變成Git可以管理的倉庫:
$ git initInitialized empty Git repositoryinE:/testgit/.git/
瞬間Git就把倉庫建好了,而且告訴你是一個(gè)空的倉庫(empty Git repository)限番,細(xì)心的讀者可以發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè).git的目錄舱污,這個(gè)目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動(dòng)修改這個(gè)目錄里面的文件弥虐,不然改亂了扩灯,就把Git倉庫給破壞了。
如果你沒有看到.git目錄霜瘪,那是因?yàn)檫@個(gè)目錄默認(rèn)是隱藏的珠插,用ls -ah命令就可以看見。
也不一定必須在空目錄下創(chuàng)建Git倉庫颖对,選擇一個(gè)已經(jīng)有東西的目錄也是可以的捻撑。不過,不建議你使用自己正在開發(fā)的公司項(xiàng)目來學(xué)習(xí)Git缤底,否則造成的一切后果概不負(fù)責(zé)顾患。
以上全部步驟在git上操作如下圖:
命令詳細(xì)步驟
電腦磁盤下的.git
這里寫圖片描述
2.2把文件添加到版本庫中。
首先這里再明確一下个唧,所有的版本控制系統(tǒng)描验,其實(shí)只能跟蹤文本文件的改動(dòng),比如TXT文件坑鱼,網(wǎng)頁膘流,所有的程序代碼等等,Git也不例外鲁沥。版本控制系統(tǒng)可以告訴你每次的改動(dòng)呼股,比如在第5行加了一個(gè)單詞“Linux”,在第8行刪了一個(gè)單詞“Windows”画恰。而圖片彭谁、視頻這些二進(jìn)制文件,雖然也能由版本控制系統(tǒng)管理允扇,但沒法跟蹤文件的變化缠局,只能把二進(jìn)制文件每次改動(dòng)串起來则奥,也就是只知道圖片從100KB改成了120KB,但到底改了啥狭园,版本控制系統(tǒng)不知道读处,也沒法知道。
不幸的是唱矛,Microsoft的Word格式是二進(jìn)制格式罚舱,因此,版本控制系統(tǒng)是沒法跟蹤Word文件的改動(dòng)的绎谦,前面我們舉的例子只是為了演示管闷,如果要真正使用版本控制系統(tǒng),就要以純文本方式編寫文件窃肠。
因?yàn)槲谋臼怯芯幋a的包个,比如中文有常用的GBK編碼,日文有Shift_JIS編碼冤留,如果沒有歷史遺留問題碧囊,強(qiáng)烈建議使用標(biāo)準(zhǔn)的UTF-8編碼,所有語言使用同一種編碼搀菩,既沒有沖突呕臂,又被所有平臺(tái)所支持破托。
演示demo:
我在版本庫testgit目錄下新建一個(gè)記事本文件 readme.txt 內(nèi)容如下:Git is a version control system.
一定要放到testgit目錄下(子目錄也行)肪跋,因?yàn)檫@是一個(gè)Git倉庫,放到其他地方Git再厲害也找不到這個(gè)文件土砂。
第一步州既,用命令git add告訴Git,把文件添加到倉庫:
$ git add readme.txt
執(zhí)行上面的命令萝映,沒有任何顯示吴叶,這就對(duì)了,Unix的哲學(xué)是“沒有消息就是好消息”序臂,說明添加成功蚌卤。
第二步,用命令git commit告訴Git奥秆,把文件提交到倉庫:
$ git commit -m "wrote a readme file" [master (root-commit) cb926e7] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt
如下圖:
這里寫圖片描述
簡單解釋一下git commit命令逊彭,-m后面輸入的是本次提交的說明,可以輸入任意內(nèi)容构订,當(dāng)然最好是有意義的侮叮,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄。
嫌麻煩不想輸入-m "xxx"行不行悼瘾?確實(shí)有辦法可以這么干囊榜,但是強(qiáng)烈不建議你這么干审胸,因?yàn)檩斎胝f明對(duì)自己對(duì)別人閱讀都很重要。實(shí)在不想輸入說明的童鞋請(qǐng)自行Google卸勺,我不告訴你這個(gè)參數(shù)砂沛。
git commit命令執(zhí)行成功后會(huì)告訴你,1個(gè)文件被改動(dòng)(我們新添加的readme.txt文件)孔庭,插入了兩行內(nèi)容(readme.txt有兩行內(nèi)容)尺上。
為什么Git添加文件需要add,commit一共兩步呢圆到?因?yàn)閏ommit可以一次提交很多文件怎抛,所以你可以多次add不同的文件,比如:
$ git add file1.txt$ git add file2.txt file3.txt$ git commit-m"add 3 files."
小結(jié):
初始化一個(gè)Git倉庫芽淡,使用git init命令马绝。
添加文件到Git倉庫,分兩步:
第一步挣菲,使用命令git add <file>富稻,注意,可反復(fù)多次使用白胀,添加多個(gè)文件椭赋;
第二步,使用命令git commit或杠,完成哪怔。
現(xiàn)在我們已經(jīng)提交了一個(gè)readme.txt文件了,我們下面可以通過命令git status來查看是否還有文件未提交向抢,如下:
這里寫圖片描述
說明沒有任何文件未提交认境,但是我現(xiàn)在繼續(xù)來改下readme.txt內(nèi)容,比如我在下面添加一行123456內(nèi)容挟鸠,繼續(xù)使用git status來查看下結(jié)果叉信,如下:
這里寫圖片描述
上面的命令告訴我們 readme.txt文件已被修改,但是未被提交的修改艘希。
接下來我想看下readme.txt文件到底改了什么內(nèi)容硼身,如何查看呢?可以使用如下命令:
git diffreadme.txt 如下:
這里寫圖片描述
git diff顧名思義就是查看difference覆享,顯示的格式正是Unix通用的diff格式.
如上可以看到佳遂,readme.txt文件內(nèi)容從兩行Git is a version control system.Git is free software.改成 二行 添加了一行123456內(nèi)容。
知道了對(duì)readme.txt文件做了什么修改后淹真,我們可以放心的提交到倉庫了讶迁,提交修改和提交文件是一樣的2步(第一步是git add? 第二步是:git commit。)
小結(jié):
要隨時(shí)掌握工作區(qū)的狀態(tài),使用git status命令巍糯。
如果git status告訴你有文件被修改過啸驯,用git diff可以查看修改內(nèi)容。
這里寫圖片描述
3.操作追蹤
3.1 版本回退
如上祟峦,我們已經(jīng)學(xué)會(huì)了修改文件罚斗,現(xiàn)在我繼續(xù)對(duì)readme.txt文件進(jìn)行修改,再修改一次內(nèi)容為:
Git is a distributed version control system.
Git is free software distributed under the GPL.
繼續(xù)執(zhí)行命令如下:
$ gitaddreadme.txt$ git commit-m"append GPL"[master3628164]appendGPL1file changed,1insertion(+),1deletion(-)
不斷對(duì)文件進(jìn)行修改宅楞,然后不斷提交修改到版本庫里针姿,每當(dāng)你覺得文件修改到一定程度的時(shí)候,就可以“保存一個(gè)快照”厌衙,這個(gè)快照在Git中被稱為commit距淫。一旦你把文件改亂了,或者誤刪了文件婶希,還可以從最近的一個(gè)commit恢復(fù)榕暇,然后繼續(xù)工作,而不是把幾個(gè)月的工作成果全部丟失喻杈。
現(xiàn)在我已經(jīng)對(duì)readme.txt文件做了三次修改了彤枢,那么我現(xiàn)在想查看下歷史記錄,如何查呢筒饰?我們現(xiàn)在可以使用命令git log演示如下所示:
這里寫圖片描述
git log命令顯示從最近到最遠(yuǎn)的提交日志缴啡,我們可以看到2次提交,最近的一次是append GPL瓷们,最早的一次是wrote a readme file业栅。.如果嫌上面顯示的信息太多的話,我們可以使用命令git log –pretty=oneline演示如下:
這里寫圖片描述
需要友情提示的是换棚,你看到的一大串類似3628164...882e1e0的是commit id(版本號(hào))式镐,和SVN不一樣反镇,Git的commit id不是1固蚤,2,3……遞增的數(shù)字歹茶,而是一個(gè)SHA1計(jì)算出來的一個(gè)非常大的數(shù)字夕玩,用十六進(jìn)制表示,而且你看到的commit id和我的肯定不一樣惊豺,以你自己的為準(zhǔn)燎孟。為什么commit id需要用這么一大串?dāng)?shù)字表示呢?因?yàn)镚it是分布式的版本控制系統(tǒng)尸昧,后面我們還要研究多人在同一個(gè)版本庫里工作揩页,如果大家都用1,2烹俗,3……作為版本號(hào)爆侣,那肯定就沖突了萍程。
現(xiàn)在我想使用版本回退操作,我想把當(dāng)前的版本回退到上一個(gè)版本兔仰,要使用什么命令呢茫负?可以使用如下2種命令,第一種是:git reset –hard HEAD^那么如果要回退到上上個(gè)版本只需把HEAD^改成HEAD^^以此類推乎赴。那如果要回退到前100個(gè)版本的話忍法,使用上面的方法肯定不方便,我們可以使用下面的簡便命令操作:git reset –hard HEAD~100即可榕吼。
未回退之前的readme.txt內(nèi)容如下:
這里寫圖片描述
如果想回退到上一個(gè)版本就可以使用git reset命令:
$ git reset --hard HEAD^
再來查看下 readme.txt內(nèi)容饿序,通過命令cat readme.txt查看
最后我們用git log再看看現(xiàn)在版本庫的狀態(tài)。
這里寫圖片描述
現(xiàn)在我想回退到最新的版本:只要上面的命令行窗口還沒有被關(guān)掉羹蚣,你就可以順著往上找啊找啊嗤堰,找到那個(gè)append GPL的commit id是fc632000db...,于是就可以指定回到未來的某個(gè)版本:
$ git reset --hard? fc632000db
HEAD is now at? fc632000db append GPL
版本號(hào)沒必要寫全度宦,前幾位就可以了踢匣,Git會(huì)自動(dòng)去找。當(dāng)然也不能只寫前一兩位戈抄,因?yàn)镚it可能會(huì)找到多個(gè)版本號(hào)离唬,就無法確定是哪一個(gè)了。
再看看readme.txt的內(nèi)容:
這里寫圖片描述
果然划鸽,我胡漢三又回來了输莺。
Git的版本回退速度非常快裸诽,因?yàn)镚it在內(nèi)部有個(gè)指向當(dāng)前版本的HEAD指針嫂用,當(dāng)你回退版本的時(shí)候,Git僅僅是把HEAD從指向append GPL.
假如我已經(jīng)關(guān)掉過一次命令行或者commit id內(nèi)容的版本號(hào)我并不知道呢丈冬?要如何知道commit id內(nèi)容的版本號(hào)呢嘱函?可以通過如下命令即可獲取到版本號(hào):git reflog演示如下:
這里寫圖片描述
git reflog用來記錄你的每一次命令.
小結(jié):
HEAD指向的版本就是當(dāng)前版本,因此埂蕊,Git允許我們在版本的歷史之間穿梭往弓,使用命令git reset --hard commit_id。
穿梭前蓄氧,用git log可以查看提交歷史函似,以便確定要回退到哪個(gè)版本。
要重返未來喉童,用git reflog查看命令歷史某筐,以便確定要回到未來的哪個(gè)版本喷好。
3.2 工作區(qū)與暫存區(qū)的區(qū)別
工作區(qū):就是你在電腦上看到的目錄绵跷,比如目錄下testgit里的文件(.git隱藏目錄版本庫除外)产镐。或者以后需要再新建的目錄文件等等都屬于工作區(qū)范疇。
版本庫(Repository):工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不屬于工作區(qū),這是版本庫。其中版本庫里面存了很多東西畔规,其中最重要的就是stage(暫存區(qū)),還有Git為我們自動(dòng)創(chuàng)建了第一個(gè)分支master,以及指向master的一個(gè)指針HEAD恨统。
我們前面說過使用Git提交文件到版本庫有兩步:
第一步:是使用 git add 把文件添加進(jìn)去叁扫,實(shí)際上就是把文件添加到暫存區(qū)。
第二步:使用git commit提交更改畜埋,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支上莫绣。
因?yàn)槲覀儎?chuàng)建Git版本庫時(shí),Git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支悠鞍,所以对室,現(xiàn)在,git commit就是往master分支上提交更改咖祭。你可以簡單理解為掩宜,需要提交的文件修改通通放到暫存區(qū),然后么翰,一次性提交暫存區(qū)的所有修改牺汤。
現(xiàn)在,我們再練習(xí)一遍浩嫌,先對(duì)readme.txt做個(gè)修改檐迟,比如加上一行內(nèi)容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
接著在目錄下新建一個(gè)文件為test.txt 內(nèi)容為test
先用git status查看一下狀態(tài):
這里寫圖片描述
Git非常清楚地告訴我們,readme.txt被修改了码耐,而test還從來沒有被添加過追迟,所以它的狀態(tài)是Untracked。
現(xiàn)在我們先使用git add 命令把2個(gè)文件都添加到暫存區(qū)中骚腥,再使用git status來查看下狀態(tài)敦间,如下:
這里寫圖片描述
接著我們可以使用git commit一次性提交到分支上,如下:
這里寫圖片描述
小結(jié)
暫存區(qū)是Git非常重要的概念桦沉,弄明白了暫存區(qū)每瞒,就弄明白了Git的很多操作到底干了什么金闽。
沒弄明白暫存區(qū)是怎么回事的童鞋纯露,請(qǐng)向上滾動(dòng)頁面,再看一次代芜。
3.3 Git管理修改操作埠褪。
Git比其他版本控制系統(tǒng)設(shè)計(jì)得優(yōu)秀,因?yàn)镚it跟蹤并管理的是修改,而非文件钞速。什么是修改贷掖?比如你新增了一行,這就是一個(gè)修改渴语,刪除了一行苹威,也是一個(gè)修改,更改了某些字符驾凶,也是一個(gè)修改牙甫,刪了一些又加了一些,也是一個(gè)修改调违,甚至創(chuàng)建一個(gè)新文件窟哺,也算一個(gè)修改。
為什么說Git管理的是修改技肩,而不是文件呢且轨?我們還是做實(shí)驗(yàn)。第一步虚婿,對(duì)readme.txt做一個(gè)修改旋奢,比如加一行內(nèi)容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.
查看readme.txt內(nèi)容:
這里寫圖片描述
然后,添加:
這里寫圖片描述
然后然痊,再修改readme.txt:
這里寫圖片描述
提交后黄绩,然后查看狀態(tài):
這里寫圖片描述
我們回顧一下操作過程:
第一次修改 -> git add -> 第二次修改 -> git commit
你看,我們前面講了玷过,Git管理的是修改爽丹,當(dāng)你用git add命令后,在工作區(qū)的第一次修改被放入暫存區(qū)辛蚊,準(zhǔn)備提交粤蝎,但是,在工作區(qū)的第二次修改并沒有放入暫存區(qū)袋马,所以初澎,git commit只負(fù)責(zé)把暫存區(qū)的修改提交了,也就是第一次的修改被提交了虑凛,第二次的修改不會(huì)被提交碑宴。
提交后,用git diff HEAD -- readme.txt命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別:
這里寫圖片描述
這里寫圖片描述
可見桑谍,第二次修改確實(shí)沒有被提交延柠。
那怎么提交第二次修改呢?你可以繼續(xù)git add再git commit锣披,也可以別著急提交第一次修改贞间,先git add第二次修改贿条,再git commit,就相當(dāng)于把兩次修改合并后一塊提交了:
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
好增热,現(xiàn)在整以,把第二次修改提交了。
小結(jié):
現(xiàn)在峻仇,你又理解了Git是如何跟蹤修改的公黑,每次修改,如果不add到暫存區(qū)摄咆,那就不會(huì)加入到commit中帆调。
3.4 Git撤銷修改和刪除文件操作。
3.4.1? 撤銷修改
比如我現(xiàn)在在readme.txt文件里面增加一行 內(nèi)容為My stupid boss still prefers SVN.我們先通過命令查看如下:
這里寫圖片描述
在準(zhǔn)備提交前豆同,發(fā)現(xiàn)My stupid boss still prefers SVN這句話有錯(cuò)誤番刊,想恢復(fù)上一個(gè)版本的狀態(tài),有如下幾種方法可以做修改:
如果我知道要?jiǎng)h掉那些內(nèi)容的話影锈,直接手動(dòng)更改去掉那些需要的文件芹务,然后add添加到暫存區(qū),最后commit掉鸭廷。
我可以按以前的方法直接恢復(fù)到上一個(gè)版本枣抱。使用git reset –hard HEAD^
但是現(xiàn)在我不想使用上面的2種方法,我想直接想使用撤銷命令該如何操作呢辆床?首先在做撤銷之前佳晶,我們可以先用git status查看下當(dāng)前的狀態(tài)。如下所示:
這里寫圖片描述
可以發(fā)現(xiàn)讼载,Git會(huì)告訴你轿秧,git checkout? — file 可以丟棄工作區(qū)的修改,如下命令:
git checkout — readme.txt,如下所示:
這里寫圖片描述
命令 git checkout –readme.txt 意思就是咨堤,把readme.txt文件在工作區(qū)做的修改全部撤銷菇篡,這里有2種情況,如下:
readme.txt自動(dòng)修改后一喘,還沒有放到暫存區(qū)驱还,使用 撤銷修改就回到和版本庫一模一樣的狀態(tài)。
另外一種是readme.txt已經(jīng)放入暫存區(qū)了凸克,接著又作了修改议蟆,撤銷修改就回到添加暫存區(qū)后的狀態(tài)。
假如你不但寫錯(cuò)了萎战,還git add到暫存區(qū)了咐容。
對(duì)于第二種情況,我想我們繼續(xù)做demo來看下撞鹉,假如現(xiàn)在我對(duì)readme.txt添加一行 內(nèi)容為My stupid boss still prefers SVN.疟丙,我git add 增加到暫存區(qū)后颖侄,接著添加內(nèi)容good jop see you鸟雏,我想通過撤銷命令讓其回到暫存區(qū)后的狀態(tài)享郊。如下所示:
這里寫圖片描述
注意:命令git checkout -- readme.txt中的--很重要,如果沒有--的話孝鹊,那么命令變成創(chuàng)建分支了炊琉。
在commit之前。用git status查看一下又活,修改只是添加到了暫存區(qū)苔咪,還沒有提交 ,并且Git還告訴我們,用命令git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage)柳骄,重新放回工作區(qū):
這里寫圖片描述
git reset命令既可以回退版本团赏,也可以把暫存區(qū)的修改回退到工作區(qū)。當(dāng)我們用HEAD時(shí)耐薯,表示最新的版本舔清。
再用git status查看一下,現(xiàn)在暫存區(qū)是干凈的曲初,工作區(qū)有修改:
這里寫圖片描述
下面体谒,我們再丟棄工作區(qū)的修改:
這里寫圖片描述
現(xiàn)在,假設(shè)你不但改錯(cuò)了東西臼婆,還從暫存區(qū)提交到了版本庫抒痒,怎么辦呢?還記得版本回退一節(jié)嗎颁褂?可以回退到上一個(gè)版本故响。不過,這是有條件的颁独,就是你還沒有把自己的本地版本庫推送到遠(yuǎn)程被去。還記得Git是分布式版本控制系統(tǒng)嗎?我們后面會(huì)講到遠(yuǎn)程版本庫奖唯,一旦你把“stupid boss”提交推送到遠(yuǎn)程版本庫惨缆,你就真的慘了……
小結(jié):
場景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí)丰捷,用命令git checkout -- file坯墨。
場景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí)病往,想丟棄修改捣染,分兩步,第一步用命令git reset HEAD file停巷,就回到了場景1耍攘,第二步按場景1操作榕栏。
場景3:已經(jīng)提交了不合適的修改到版本庫時(shí),想要撤銷本次提交蕾各,參考版本回退一節(jié)扒磁,不過前提是沒有推送到遠(yuǎn)程庫。
3.4.2 刪除文件
假如我現(xiàn)在版本庫testgit目錄添加一個(gè)文件b.txt,然后提交式曲。如下:
這里寫圖片描述
如上:一般情況下妨托,可以直接在文件目錄中把文件刪了,或者使用如上rm命令:rm b.txt 吝羞,如果我想徹底從版本庫中刪掉了此文件的話兰伤,可以再執(zhí)行commit命令 提交掉,現(xiàn)在目錄是這樣的:
這里寫圖片描述
只要沒有commit之前钧排,如果我想在版本庫中恢復(fù)此文件如何操作呢敦腔?
可以使用如下命令 git checkout? — b.txt,如下所示:
這里寫圖片描述
再來看看我們testgit目錄恨溜,添加了1個(gè)文件了符衔。如下所示:
這里寫圖片描述
4. 遠(yuǎn)程倉庫
在了解之前,先注冊github賬號(hào)筒捺,由于你的本地Git倉庫和github倉庫之間的傳輸是通過SSH加密的柏腻,所以需要一點(diǎn)設(shè)置:
第一步:創(chuàng)建SSH Key。在用戶主目錄下系吭,看看有沒有.ssh目錄五嫂,如果有,再看看這個(gè)目錄下有沒有id_rsa和id_rsa.pub這兩個(gè)文件肯尺,如果有的話沃缘,直接跳過此如下命令,如果沒有的話则吟,打開命令行槐臀,輸入如下命令:
ssh-keygen -t rsa –C "youremail@example.com", 你需要把郵件地址換成你自己的郵件地址,并且必須要用雙引號(hào),不能用單引號(hào)氓仲。然后一路回車水慨,使用默認(rèn)值即可。由于我本地此前運(yùn)行過一次敬扛,所以本地有晰洒,如下所示:
文件顯示
id_rsa是私鑰,不能泄露出去啥箭,id_rsa.pub是公鑰谍珊,可以放心地告訴任何人。
第二步:登錄github,打開” settings”中的SSH Keys頁面急侥,然后點(diǎn)擊“Add SSH Key”,填上任意title砌滞,在Key文本框里黏貼id_rsa.pub文件的內(nèi)容侮邀。點(diǎn)擊 Add Key,你就應(yīng)該可以看到已經(jīng)添加的key贝润。
這里寫圖片描述
為什么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推送了耐版。確保你擁有一個(gè)GitHub賬號(hào)后祠够,我們就即將開始遠(yuǎn)程倉庫的學(xué)習(xí)。
4.1 添加遠(yuǎn)程倉庫
現(xiàn)在的情景是:我們已經(jīng)在本地創(chuàng)建了一個(gè)Git倉庫后粪牲,又想在github創(chuàng)建一個(gè)Git倉庫古瓤,并且希望這兩個(gè)倉庫進(jìn)行遠(yuǎn)程同步,這樣github的倉庫可以作為備份腺阳,又可以其他人通過該倉庫來協(xié)作落君。
首先,登錄github上亭引,然后在右上角找到“create a new repo”創(chuàng)建一個(gè)新的倉庫绎速。如下:
創(chuàng)建倉庫頁面
在Repository name填入testgit,其他保持默認(rèn)設(shè)置焙蚓,點(diǎn)擊“Create repository”按鈕纹冤,就成功地創(chuàng)建了一個(gè)新的Git倉庫(我的github被我漢化了,有興趣的可以關(guān)注我的github賬號(hào)购公,倉庫里有插件萌京,有安裝教程):
倉庫創(chuàng)建完成后頁面
目前,在GitHub上的這個(gè)testgit倉庫還是空的君丁,GitHub告訴我們枫夺,可以從這個(gè)倉庫克隆出新的倉庫,也可以把一個(gè)已有的本地倉庫與之關(guān)聯(lián)绘闷,然后橡庞,把本地倉庫的內(nèi)容推送到GitHub倉庫较坛。
現(xiàn)在,我們根據(jù)GitHub的提示扒最,在本地的testgit倉庫下運(yùn)行命令:
git remote add origin https://github.com/tugenhua0707/testgit.git或者
$ git remote add origin git@github.com:michaelliao/learngit.git
兩種寫法
所有的如下:
這里寫圖片描述
添加后丑勤,遠(yuǎn)程庫的名字就是origin,這是Git默認(rèn)的叫法吧趣,也可以改成別的法竞,但是origin這個(gè)名字一看就知道是遠(yuǎn)程庫。
下一步强挫,就可以把本地庫的所有內(nèi)容推送到遠(yuǎn)程庫上:
推送過程與報(bào)錯(cuò)解決
報(bào)錯(cuò)解釋:git clonegit://github.com/username/testgit.git這是使用 git 協(xié)議岔霸。
git@github.com:username/testgit.git 這是使用 ssh 協(xié)議。ssh 會(huì)驗(yàn)證對(duì)方服務(wù)器的 key俯渤。它沒辦法確認(rèn)服務(wù)器出示的 key 是受信的呆细,所以問你這個(gè) key 是不是真的是你要連接的那個(gè)服務(wù)器的。你沒說「yes」所以 ssh 認(rèn)為你不想繼續(xù)連接八匠,所以連接失敗絮爷。
把本地庫的內(nèi)容推送到遠(yuǎn)程,用git push命令梨树,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程坑夯。
由于遠(yuǎn)程庫是空的,我們第一次推送master分支時(shí)抡四,加上了 –u參數(shù)柜蜈,Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來床嫌,在以后的推送或者拉取時(shí)就可以簡化命令跨释。推送成功后,可以立刻在github頁面中看到遠(yuǎn)程庫的內(nèi)容已經(jīng)和本地一模一樣了:
need-to-insert-img
推送
從現(xiàn)在起厌处,只要本地作了提交鳖谈,就可以通過命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub,現(xiàn)在阔涉,你就擁有了真正的分布式版本庫缆娃!
SSH警告
當(dāng)你第一次使用Git的clone或者push命令連接GitHub時(shí),會(huì)得到一個(gè)警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xx.xx.xx.xx.xx. Are you sure you want to continue connecting (yes/no)?
這是因?yàn)镚it使用SSH連接瑰排,而SSH連接在第一次驗(yàn)證GitHub服務(wù)器的Key時(shí)贯要,需要你確認(rèn)GitHub的Key的指紋信息是否真的來自GitHub的服務(wù)器,輸入yes回車即可椭住。
Git會(huì)輸出一個(gè)警告崇渗,告訴你已經(jīng)把GitHub的Key添加到本機(jī)的一個(gè)信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
這個(gè)警告只會(huì)出現(xiàn)一次,后面的操作就不會(huì)有任何警告了。
如果你實(shí)在擔(dān)心有人冒充GitHub服務(wù)器宅广,輸入yes前可以對(duì)照GitHub的RSA Key的指紋信息是否與SSH連接給出的一致葫掉。
小結(jié)
要關(guān)聯(lián)一個(gè)遠(yuǎn)程庫,使用命令git remote add origin git@server-name:path/repo-name.git跟狱;
關(guān)聯(lián)后俭厚,使用命令git push -u origin master第一次推送master分支的所有內(nèi)容;
此后驶臊,每次本地提交后挪挤,只要有必要,就可以使用命令git push origin master推送最新修改关翎;
分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠(yuǎn)程庫的存在扛门,也就是有沒有聯(lián)網(wǎng)都可以正常工作,而SVN在沒有聯(lián)網(wǎng)的時(shí)候是拒絕干活的笤休!當(dāng)有網(wǎng)絡(luò)的時(shí)候尖飞,再把本地提交推送一下就完成了同步症副,真是太方便了店雅!
4.2 從遠(yuǎn)程庫克隆
上次我們講了先有本地庫,后有遠(yuǎn)程庫的時(shí)候贞铣,如何關(guān)聯(lián)遠(yuǎn)程庫闹啦。
現(xiàn)在,假設(shè)我們從零開發(fā)辕坝,那么最好的方式是先創(chuàng)建遠(yuǎn)程庫窍奋,然后,從遠(yuǎn)程庫克隆酱畅。
首先琳袄,登陸GitHub,創(chuàng)建一個(gè)新的倉庫纺酸,名字叫testgit2(注意:倉庫名是不能重名的):
在遠(yuǎn)程倉庫先創(chuàng)建倉庫
我們勾選Initialize this repository with a README窖逗,這樣GitHub會(huì)自動(dòng)為我們創(chuàng)建一個(gè)README.md文件。創(chuàng)建完畢后餐蔬,可以看到README.md文件:
這里寫圖片描述
現(xiàn)在碎紊,遠(yuǎn)程庫已經(jīng)準(zhǔn)備好了,下一步是用命令git clone克隆一個(gè)本地庫:
克隆本地倉庫
接著在我本地testgit目錄下 生成testgit2目錄了樊诺,如下所示:
need-to-insert-img
本地目錄
如果有多個(gè)人協(xié)作開發(fā)仗考,那么每個(gè)人各自從遠(yuǎn)程克隆一份就可以了科吭。
你也許還注意到港谊,GitHub給出的地址不止一個(gè),還可以用https://github.com/michaelliao/gitskills.git這樣的地址澎羞。實(shí)際上,Git支持多種協(xié)議锅锨,默認(rèn)的git://使用ssh螺句,但也可以使用https等其他協(xié)議。
使用https除了速度慢以外橡类,還有個(gè)最大的麻煩是每次推送都必須輸入口令蛇尚,但是在某些只開放http端口的公司內(nèi)部就無法使用ssh協(xié)議而只能用https。
小結(jié):
要克隆一個(gè)倉庫顾画,首先必須知道倉庫的地址取劫,然后使用git clone命令克隆。
Git支持多種協(xié)議研侣,包括https谱邪,但通過ssh支持的原生git協(xié)議速度最快。
5.? 分支管理
5.1 創(chuàng)建與合并分支
在版本回填退里庶诡,你已經(jīng)知道惦银,每次提交,Git都把它們串成一條時(shí)間線末誓,這條時(shí)間線就是一個(gè)分支扯俱。截止到目前,只有一條時(shí)間線喇澡,在Git里迅栅,這個(gè)分支叫主分支,即master分支晴玖。HEAD嚴(yán)格來說不是指向提交,而是指向master呕屎,master才是指向提交的让簿,所以,HEAD指向的就是當(dāng)前分支秀睛。
首先尔当,我們來創(chuàng)建dev分支,然后切換到dev分支上琅催。如下操作:
need-to-insert-img
創(chuàng)建分支
git checkout 命令加上 –b參數(shù)表示創(chuàng)建并切換居凶,相當(dāng)于如下2條命令
git branch dev
git checkout dev
然后,用git branch命令查看當(dāng)前分支藤抡,git branch命令會(huì)列出所有分支侠碧,當(dāng)前分支前面會(huì)標(biāo)一個(gè)*號(hào)。
然后缠黍,我們就可以在dev分支上正常提交弄兜,比如對(duì)readme.txt做個(gè)修改,加上一行:Creating a new branch is quick.
首先我們先來查看下readme.txt內(nèi)容,接著添加內(nèi)容Creating a new branch is quick替饿,如下:
need-to-insert-img
提交
現(xiàn)在dev分支工作已完成语泽,現(xiàn)在我們切換到主分支master上,繼續(xù)查看readme.txt內(nèi)容如下:
need-to-insert-img
切換分支
切換回master分支后视卢,再查看一個(gè)readme.txt文件踱卵,剛才添加的內(nèi)容不見了!因?yàn)槟莻€(gè)提交是在dev分支上据过,而master分支此刻的提交點(diǎn)并沒有變:
need-to-insert-img
詳情
現(xiàn)在惋砂,我們把dev分支的工作成果合并到master分支上,使用如下命令git merge dev如下所示:
need-to-insert-img
合并分支
git merge命令用于合并指定分支到當(dāng)前分支绳锅。合并后西饵,再查看readme.txt的內(nèi)容,就可以看到鳞芙,和dev分支的最新提交是完全一樣的眷柔。
注意到上面的Fast-forward信息,Git告訴我們原朝,這次合并是“快進(jìn)模式”驯嘱,也就是直接把master指向dev的當(dāng)前提交,所以合并速度非掣筒穑快宙拉。
當(dāng)然,也不是每次合并都能Fast-forward丙笋,我們后面會(huì)講其他方式的合并。
合并完成后煌贴,就可以放心地刪除dev分支了,操作如下:
need-to-insert-img
刪除dev分支
刪除后御板,查看branch,就只剩下master分支了牛郑。
小結(jié):
查看分支:git branch
創(chuàng)建分支:git branch
切換分支:git checkout
創(chuàng)建+切換分支:git checkout -b
合并某分支到當(dāng)前分支:git merge
刪除分支:git branch -d
5.2 解決沖突
有時(shí)候合并分支并不會(huì)很順利怠肋,會(huì)出現(xiàn)一些意外,下面我們先來創(chuàng)建一個(gè)新的分支叫做feature1淹朋,繼續(xù)我們的新分支開發(fā)笙各,并在readme.txt添加一行內(nèi)容8888888,然后提交础芍,如下所示:
need-to-insert-img
創(chuàng)建新分支
同樣杈抢,我們現(xiàn)在切換到master分支上來,也在最后一行添加內(nèi)容仑性,內(nèi)容為99999999惶楼,如下所示:
在master分支上修改
現(xiàn)在我們需要在master分支上來合并feature1,如下操作:
合并分支出現(xiàn)沖突
果然沖突了!Git告訴我們歼捐,readme.txt文件存在沖突何陆,必須手動(dòng)解決沖突后再提交。git status也可以告訴我們沖突的文件豹储。
查看一下readme.txt文件:
readme.txt文件
Git用<<<<<<<贷盲,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容剥扣,其中<<<HEAD是指主分支修改的內(nèi)容晃洒,>>>>>feature1是指feature1上修改的內(nèi)容,我們可以修改下如下后保存朦乏,然后再提交:
修改再提交
如果我想查看分支合并的情況的話球及,需要使用命令 git log.命令行演示如下:
查看分支合并圖
小結(jié):
當(dāng)Git無法自動(dòng)合并分支時(shí),就必須首先解決沖突呻疹。解決沖突后吃引,再提交,合并完成刽锤。
用git log --graph命令可以看到分支合并圖镊尺。
5.3 分支管理策略
通常合并分支時(shí),git一般使用”Fast forward”模式并思,在這種模式下庐氮,刪除分支后,會(huì)丟掉分支信息宋彼,現(xiàn)在我們來使用帶參數(shù) –no-ff來禁用”Fast forward”模式弄砍。首先我們來做demo演示下,操作步驟如下:
創(chuàng)建一個(gè)dev分支输涕。
修改readme.txt內(nèi)容音婶。
添加到暫存區(qū)。
切換回主分支(master)莱坎。
合并dev分支衣式,使用命令 git merge –no-ff? -m “注釋” dev
查看歷史記錄
截圖如下:
need-to-insert-img
管理分支
因?yàn)楸敬魏喜⒁獎(jiǎng)?chuàng)建一個(gè)新的commit,所以加上-m參數(shù)檐什,把commit描述寫進(jìn)去碴卧。可以看到乃正,不使用Fast forward模式住册,merge后就像這樣:
need-to-insert-img
分支策略:
在實(shí)際開發(fā)中,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
首先烫葬,master分支應(yīng)該是非常穩(wěn)定的界弧,也就是僅用來發(fā)布新版本凡蜻,平時(shí)不能在上面干活;
那在哪干活呢垢箕?干活都在dev分支上划栓,也就是說,dev分支是不穩(wěn)定的条获,到某個(gè)時(shí)候忠荞,比如1.0版本發(fā)布時(shí),再把dev分支合并到master上帅掘,在master分支發(fā)布1.0版本委煤;
你和你的小伙伴們每個(gè)人都在dev分支上干活,每個(gè)人都有自己的分支修档,時(shí)不時(shí)地往dev分支上合并就可以了碧绞。
所以,團(tuán)隊(duì)合作的分支看起來就像這樣:
need-to-insert-img
小結(jié):
Git分支十分強(qiáng)大吱窝,在團(tuán)隊(duì)開發(fā)中應(yīng)該充分應(yīng)用讥邻。
合并分支時(shí),加上--no-ff參數(shù)就可以用普通模式合并院峡,合并后的歷史有分支兴使,能看出來曾經(jīng)做過合并,而fast forward合并就看不出來曾經(jīng)做過合并照激。
5.4? bug分支
在開發(fā)中发魄,會(huì)經(jīng)常碰到bug問題,那么有了bug就需要修復(fù)俩垃,在Git中励幼,分支是很強(qiáng)大的,每個(gè)bug都可以通過一個(gè)臨時(shí)分支來修復(fù)吆寨,修復(fù)完成后赏淌,合并分支,然后將臨時(shí)的分支刪除掉啄清。
比如我在開發(fā)中接到一個(gè)404 bug時(shí)候,我們可以創(chuàng)建一個(gè)404分支來修復(fù)它俺孙,但是辣卒,當(dāng)前的dev分支上的工作還沒有提交。比如如下:
need-to-insert-img
并不是我不想提交睛榄,而是工作進(jìn)行到一半時(shí)候荣茫,我們還無法提交,比如我這個(gè)分支bug要2天完成场靴,但是我issue-404 bug需要2個(gè)小時(shí)內(nèi)完成啡莉。怎么辦呢港准?還好,Git還提供了一個(gè)stash功能咧欣,可以把當(dāng)前工作現(xiàn)場 ”隱藏起來”浅缸,等以后恢復(fù)現(xiàn)場后繼續(xù)工作。如下:
need-to-insert-img
保存工作現(xiàn)場
現(xiàn)在魄咕,用git status查看工作區(qū)衩椒,就是干凈的(除非有沒有被Git管理的文件),因此可以放心地創(chuàng)建分支來修復(fù)bug∠迹現(xiàn)在我可以通過創(chuàng)建issue-404分支來修復(fù)bug了毛萌。
首先我們要確定在那個(gè)分支上修復(fù)bug,假定需要在主分支master上來修復(fù)的喝滞,現(xiàn)在我要在master分支上創(chuàng)建一個(gè)臨時(shí)分支阁将,演示如下:
創(chuàng)建臨時(shí)分支
bug修復(fù)完成后,切換到master分支上右遭,并完成合并做盅,最后刪除issue-404分支。演示如下:
刪除臨時(shí)分支issue-404
現(xiàn)在狸演,我們回到dev分支上干活了言蛇。
切換到dev分支
工作區(qū)是干凈的,那么我們工作現(xiàn)場去哪里呢宵距?我們可以使用命令git stash list來查看下腊尚。如下:
工作現(xiàn)場還在,Git把stash內(nèi)容存在某個(gè)地方了满哪,但是需要恢復(fù)一下婿斥,可以使用如下2個(gè)方法:
git stash apply恢復(fù),恢復(fù)后哨鸭,stash內(nèi)容并不刪除民宿,你需要使用命令git stash drop來刪除。
另一種方式是使用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪除了像鸡。
演示如下:
你可以多次stash活鹰,恢復(fù)的時(shí)候,先用git stash list查看只估,然后恢復(fù)指定的stash志群,用命令:
恢復(fù)指令
小結(jié):
修復(fù)bug時(shí),我們會(huì)通過創(chuàng)建新的bug分支進(jìn)行修復(fù)蛔钙,然后合并锌云,最后刪除;
當(dāng)手頭工作沒有完成時(shí)吁脱,先把工作現(xiàn)場git stash一下桑涎,然后去修復(fù)bug彬向,修復(fù)后,再git stash pop攻冷,回到工作現(xiàn)場娃胆。
5.5 Feature分支
軟件開發(fā)中,總有無窮無盡的新的功能要不斷添加進(jìn)來讲衫。
添加一個(gè)新功能時(shí)缕棵,你肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼,把主分支搞亂了涉兽,所以招驴,每添加一個(gè)新功能,最好新建一個(gè)feature分支枷畏,在上面開發(fā)别厘,完成后,合并拥诡,最后触趴,刪除該feature分支。
現(xiàn)在渴肉,開始一個(gè)新任務(wù):開發(fā)代號(hào)為Vulcan的新功能冗懦。開始開發(fā):
need-to-insert-img
切回dev,準(zhǔn)備合并:一切順利的話仇祭,feature分支和bug分支是類似的披蕉,合并,然后刪除乌奇。
但是没讲,就在此時(shí),接到上級(jí)命令礁苗,因經(jīng)費(fèi)不足爬凑,新功能必須取消!
雖然白干了试伙,但是這個(gè)分支還是必須就地銷毀:
need-to-insert-img
銷毀失敗
銷毀失敗嘁信。Git友情提醒,feature-vulcan分支還沒有被合并疏叨,如果刪除吱抚,將丟失掉修改,如果要強(qiáng)行刪除考廉,需要使用命令git branch -D feature-vulcan。
現(xiàn)在我們強(qiáng)行刪除:
need-to-insert-img
刪除成功
小結(jié):
開發(fā)一個(gè)新feature携御,最好新建一個(gè)分支昌粤;
如果要丟棄一個(gè)沒有被合并過的分支既绕,可以通過git branch -D <name>強(qiáng)行刪除。
5.6 多人協(xié)作
當(dāng)你從遠(yuǎn)程庫克隆時(shí)候涮坐,實(shí)際上Git自動(dòng)把本地的master分支和遠(yuǎn)程的master分支對(duì)應(yīng)起來了凄贩,并且遠(yuǎn)程庫的默認(rèn)名稱是origin。
要查看遠(yuǎn)程庫的信息 使用git remote
要查看遠(yuǎn)程庫的詳細(xì)信息 使用git remote –v
如下演示:
need-to-insert-img
5.6.1 推送分支
推送分支袱讹,就是把該分支上的所有本地提交推送到遠(yuǎn)程庫疲扎。推送時(shí),要指定本地分支捷雕,這樣椒丧,Git就會(huì)把該分支推送到遠(yuǎn)程庫對(duì)應(yīng)的遠(yuǎn)程分支上:使用命令git push origin master,如果要推送其他分支,比如dev救巷,就改成:git push origin dev
但是壶熏,并不是一定要把本地分支往遠(yuǎn)程推送,那么浦译,哪些分支需要推送棒假,哪些不需要呢?
master分支是主分支精盅,因此要時(shí)刻與遠(yuǎn)程同步帽哑;
dev分支是開發(fā)分支,團(tuán)隊(duì)所有成員都需要在上面工作叹俏,所以也需要與遠(yuǎn)程同步妻枕;
bug分支只用于在本地修復(fù)bug,就沒必要推到遠(yuǎn)程了她肯,除非老板要看看你每周到底修復(fù)了幾個(gè)bug佳头;
feature分支是否推到遠(yuǎn)程,取決于你是否和你的小伙伴合作在上面開發(fā)晴氨。
總之康嘉,就是在Git中,分支完全可以在本地自己藏著玩籽前,是否推送亭珍,視你的心情而定!
比如我現(xiàn)在的github上的readme.txt代碼如下:
need-to-insert-img
github上的readme.txt代碼
本地的readme.txt代碼如下:
need-to-insert-img
本地的readme.txt代碼
現(xiàn)在我想把本地更新的readme.txt代碼推送到遠(yuǎn)程庫中枝哄,使用命令如下:
need-to-insert-img
我們可以看到如上肄梨,推送成功,我們可以繼續(xù)來截圖github上的readme.txt內(nèi)容 如下:
可以看到 推送成功了挠锥。
5.6.2 抓取分支
多人協(xié)作時(shí)众羡,大家都會(huì)往master分支上推送各自的修改。現(xiàn)在我們可以模擬另外一個(gè)同事蓖租,可以在另一臺(tái)電腦上(注意要把SSH key添加到github上)或者同一臺(tái)電腦上另外一個(gè)目錄克隆粱侣,新建一個(gè)目錄名字叫testgit3
但是我首先要把dev分支也要推送到遠(yuǎn)程去羊壹,如下:
接著進(jìn)入testgit3目錄,進(jìn)行克隆遠(yuǎn)程的庫到本地來齐婴,如下:
現(xiàn)在目錄下生成有如下所示:
現(xiàn)在我們的小伙伴要在dev分支上做開發(fā)油猫,就必須創(chuàng)建遠(yuǎn)程origin的dev分支到本地,于是可以使用命令創(chuàng)建本地dev分支:git checkout –b dev origin/dev
現(xiàn)在小伙伴們就可以在dev分支上做開發(fā)了柠偶,開發(fā)完成后把dev分支推送到遠(yuǎn)程庫情妖。
如下:
小伙伴們已經(jīng)向origin/dev分支上推送了提交,而我在我的目錄文件下也對(duì)同樣的文件同個(gè)地方作了修改诱担,也試圖推送到遠(yuǎn)程庫時(shí)毡证,如下:
推送失敗,因?yàn)槲业男』锇榈淖钚绿峤缓臀以噲D推送的提交有沖突该肴,解決辦法也很簡單情竹,Git已經(jīng)提示我們,先用git pull把最新的提交從origin/dev抓下來匀哄,然后秦效,在本地合并,解決沖突涎嚼,再推送:
git pull也失敗了阱州,原因是沒有指定本地dev分支與遠(yuǎn)程origin/dev分支的鏈接,根據(jù)提示法梯,設(shè)置dev和origin/dev的鏈接:如下:
git pull
這回git pull成功苔货,但是合并有沖突,需要手動(dòng)解決立哑,解決的方法和分支管理中的解決沖突完全一樣夜惭。解決后,提交铛绰,再push:
我們可以先來看看readme.txt內(nèi)容诈茧。
現(xiàn)在手動(dòng)已經(jīng)解決完了,我接在需要再提交捂掰,再push到遠(yuǎn)程庫里面去敢会。如下所示:
push成功
因此,多人協(xié)作的工作模式通常是這樣:
首先这嚣,可以試圖用git push origin branch-name推送自己的修改鸥昏;
如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新姐帚,需要先用git pull試圖合并吏垮;
如果合并有沖突,則解決沖突,并在本地提交惫皱;
沒有沖突或者解決掉沖突后像樊,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”旅敷,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream branch-name origin/branch-name颤霎。
這就是多人協(xié)作的工作模式媳谁,一旦熟悉了,就非常簡單友酱。
小結(jié):
查看遠(yuǎn)程庫信息晴音,使用git remote -v;
本地新建的分支如果不推送到遠(yuǎn)程缔杉,對(duì)其他人就是不可見的锤躁;
從本地推送分支,使用git push origin branch-name或详,如果推送失敗系羞,先用git pull抓取遠(yuǎn)程的新提交;
在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(yīng)的分支霸琴,使用git checkout -b branch-name origin/branch-name椒振,本地和遠(yuǎn)程分支的名稱最好一致;
建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián)梧乘,使用git branch --set-upstream branch-name origin/branch-name澎迎;
從遠(yuǎn)程抓取分支,使用git pull选调,如果有沖突夹供,要先處理沖突。
6. 標(biāo)簽管理
發(fā)布一個(gè)版本時(shí)仁堪,我們通常先在版本庫中打一個(gè)標(biāo)簽(tag)哮洽,這樣,就唯一確定了打標(biāo)簽時(shí)刻的版本枝笨。將來無論什么時(shí)候袁铐,取某個(gè)標(biāo)簽的版本,就是把那個(gè)打標(biāo)簽的時(shí)刻的歷史版本取出來横浑。所以剔桨,標(biāo)簽也是版本庫的一個(gè)快照。
Git的標(biāo)簽雖然是版本庫的快照徙融,但其實(shí)它就是指向某個(gè)commit的指針(跟分支很像對(duì)不對(duì)洒缀?但是分支可以移動(dòng),標(biāo)簽不能移動(dòng)),所以树绩,創(chuàng)建和刪除標(biāo)簽都是瞬間完成的萨脑。
因?yàn)镚it的commit號(hào)太長,所以要引入tag饺饭。所以渤早,tag就是一個(gè)讓人容易記住的有意義的名字,它跟某個(gè)commit綁在一起瘫俊。
6.1 創(chuàng)建標(biāo)簽
在Git中打標(biāo)簽非常簡單鹊杖,首先摔吏,切換到需要打標(biāo)簽的分支上枫慷,然后打一個(gè)新標(biāo)簽肖揣,演示如下:
默認(rèn)標(biāo)簽是打在最新提交的commit上的肚豺。有時(shí)候筷狼,如果忘了打標(biāo)簽翩概,比如卓练,現(xiàn)在已經(jīng)是周五了淹冰,但應(yīng)該在周一打的標(biāo)簽沒有打叮喳,怎么辦被芳?
方法是找到歷史提交的commit id,然后打上就可以了:
版本號(hào)
比方說要對(duì)add merge這次提交打標(biāo)簽嘲更,它對(duì)應(yīng)的commit id是5ca7559筐钟,敲入命令:$ git? tag v0.9 5ca7559,再用命令git tag查看標(biāo)簽:
注意赋朦,標(biāo)簽不是按時(shí)間順序列出篓冲,而是按字母排序的〕韬澹可以用git show <tagname>查看標(biāo)簽信息:
可以看到壹将,v0.9確實(shí)打在add merge這次提交上。
還可以創(chuàng)建帶有說明的標(biāo)簽毛嫉,用-a指定標(biāo)簽名诽俯,-m指定說明文字:
用命令git show <tagname>可以看到說明文字:
用命令git show <tagname>可以看到說明文字:
小結(jié):
命令git tag <name>用于新建一個(gè)標(biāo)簽,默認(rèn)為HEAD承粤,也可以指定一個(gè)commit id暴区;
git tag -a <tagname> -m "blablabla..."可以指定標(biāo)簽信息;
git tag -s <tagname> -m "blablabla..."可以用PGP簽名標(biāo)簽辛臊;
命令git tag可以查看所有標(biāo)簽仙粱。
6.2 操作標(biāo)簽
如果標(biāo)簽打錯(cuò)了,也可以刪除:
因?yàn)閯?chuàng)建的標(biāo)簽都只存儲(chǔ)在本地彻舰,不會(huì)自動(dòng)推送到遠(yuǎn)程伐割。所以候味,打錯(cuò)的標(biāo)簽可以在本地安全刪除。
如果要推送某個(gè)標(biāo)簽到遠(yuǎn)程隔心,使用命令git push origin <tagname>:
推送標(biāo)簽到遠(yuǎn)程
或者白群,一次性推送全部尚未推送到遠(yuǎn)程的本地標(biāo)簽:
全部推送
如果標(biāo)簽已經(jīng)推送到遠(yuǎn)程,要?jiǎng)h除遠(yuǎn)程標(biāo)簽就麻煩一點(diǎn)硬霍,先從本地刪除帜慢。然后,從遠(yuǎn)程刪除须尚。刪除命令也是push崖堤,操作如下:
刪除遠(yuǎn)程標(biāo)簽
小結(jié):
命令git push origin <tagname>可以推送一個(gè)本地標(biāo)簽;
命令git push origin --tags可以推送全部未推送過的本地標(biāo)簽耐床;
命令git tag -d <tagname>可以刪除一個(gè)本地標(biāo)簽;
命令git push origin :refs/tags/<tagname>可以刪除一個(gè)遠(yuǎn)程標(biāo)簽楔脯。
最終總結(jié):
Git基本常用命令如下:
mkdir:? ? ? ? XX (創(chuàng)建一個(gè)空目錄 XX指目錄名)
pwd:? ? ? ? ? 顯示當(dāng)前目錄的路徑撩轰。
git init把當(dāng)前的目錄變成可以管理的git倉庫,生成隱藏.git文件昧廷。
git add XX把xx文件添加到暫存區(qū)去堪嫂。
git commit –m “XX”:? ? 提交文件 –m 后面的是注釋。
git status查看倉庫狀態(tài)
git diff XX查看XX文件修改了那些內(nèi)容
git log查看歷史記錄
git reset –hard HEAD^或者git reset –hard HEAD~回退到上一個(gè)版本(如果想回退到100個(gè)版本木柬,使用git reset –hard HEAD~100 )
cat XX查看XX文件內(nèi)容
git reflog查看歷史記錄的版本號(hào)id
git checkout — XX把XX文件在工作區(qū)的修改全部撤銷皆串。
git rm XX刪除XX文件
git remote add originhttps://github.com/tugenhua0707/testgit關(guān)聯(lián)一個(gè)遠(yuǎn)程庫
git push –u(第一次要用-u 以后不需要) origin master 把當(dāng)前master分支推送到遠(yuǎn)程庫
git clonehttps://github.com/tugenhua0707/testgit從遠(yuǎn)程庫中克隆
git checkout –b dev創(chuàng)建dev分支 并切換到dev分支上
git branch查看當(dāng)前所有的分支
git checkout master切換回master分支
git merge dev在當(dāng)前的分支上合并dev分支
git branch –d dev刪除dev分支
git branch name創(chuàng)建分支
git stash把當(dāng)前的工作隱藏起來 等以后恢復(fù)現(xiàn)場后繼續(xù)工作
git stash list查看所有被隱藏的文件列表
git stash apply恢復(fù)被隱藏的文件,但是內(nèi)容不刪除
git stash drop刪除文件
git stash pop恢復(fù)文件的同時(shí) 也刪除文件
git remote查看遠(yuǎn)程庫的信息
git remote –v查看遠(yuǎn)程庫的詳細(xì)信息
git push origin masterGit會(huì)把master分支推送到遠(yuǎn)程庫對(duì)應(yīng)的遠(yuǎn)程分支上
作者:落魂灬
鏈接:http://www.reibang.com/p/29b392fba2b9
來源:簡書
著作權(quán)歸作者所有眉枕。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)恶复,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。