最淺顯易懂的git教程_第1頁
最淺顯易懂的git教程_第2頁
最淺顯易懂的git教程_第3頁
最淺顯易懂的git教程_第4頁
最淺顯易懂的git教程_第5頁
已閱讀5頁,還剩95頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

廖Git史上最淺顯易懂的 為什么要編寫這個(gè)?因?yàn)槲以趯W(xué)習(xí)Git的過程中,買過書,也在網(wǎng)上了一堆或者,只支離破碎地介紹Git的某幾個(gè)命令,還有直接從Git手冊粘貼幫助文檔的,總之,初學(xué)者很難找到一個(gè)由淺入深,學(xué)完后能立刻上手Git。既然號稱史上最淺顯易懂的 ,那這 有什么讓你怦然心動(dòng)的特點(diǎn)呢其次, 實(shí)用性超強(qiáng),邊學(xué)邊練,一點(diǎn)也不覺得枯燥。而且,你所學(xué)的Git命令“充分且必要”的,掌握了這些東西,你就可以通過Git輕松地完成你的工本GitGitGit命令只有那些專家才明白(Git專家),但我保證這些命令可能你一輩子都不會用到。既然Git是一個(gè)工具,就沒必要把時(shí)間浪費(fèi)在那些“高級”但幾乎 上。一旦你真的非用不可了,到時(shí)候再自行或者請教專家也未遲。如果你是一個(gè)開發(fā)人員,想用上上目前最先進(jìn)的分布式版本控制系統(tǒng),那么,趕快開始學(xué)習(xí)吧!廖雪峰,十年軟件開發(fā)經(jīng)驗(yàn),業(yè)余產(chǎn)品經(jīng)理,精通Java/Python/Ruby/VisualBasic/ObjectiveC等,對開源框架有深入研究,著有《Spring2.0 Git是什么 是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)Git有什么特點(diǎn)?簡單來說就是:高端大氣上檔次!如果你 Word寫過長篇大論,那你一定有這樣的經(jīng)歷想刪除一個(gè)段落,又怕將來想恢復(fù)找不回來怎么辦?有辦法,先把當(dāng)前文件“另為……”一個(gè)新的Word文件,再接著改,改到一定程度,再“另存為……”Word看著一堆亂七八糟的文件,想保留的一個(gè),然后把其他的刪掉,又怕哪天會用上,還不敢刪,真郁悶。更的是,有些部分需要你的財(cái)務(wù)同事幫助填寫,于是你把文CopyU盤里給她(也可能通過發(fā)送一份給她),然后,你繼續(xù)修Word文件。一天后,同事再Word文件傳給你,此時(shí),你必須想想,發(fā)給她之后到你收到文件期間,你作了哪些改動(dòng),得的改動(dòng)和部分合并,真。于是你想,如果有一個(gè)軟件,不但能自動(dòng)幫我記錄每次文件的改動(dòng),還可以讓同事協(xié)作編只需要在軟件里瞄一眼就可以,豈不是很方便?這個(gè)軟件用起來就應(yīng)該像這個(gè)樣子,能記錄每次文件的改動(dòng)版用說日17/1227/1237/1347/14這樣,你就結(jié)束了手動(dòng)管理多個(gè)“版本”的史前時(shí)代,進(jìn)入到版本控制的20世紀(jì)很多人都知道,Linus在1991年創(chuàng)建了開源的Linux,從此,Linux系統(tǒng)不斷發(fā)展,Linus雖然創(chuàng)建了Linux,但Linux的壯大是靠全世界熱心的參與的,這么多人在世界各地為Linux編寫代碼,那Linux的代碼是如何管理的呢?事實(shí)是,在2002年以前,世界各地的把源代碼文件通過diff的方式發(fā)給Linus,然后Linus本人通過手工方式合并代碼!Linus不把Linux代碼放到版本控制系統(tǒng)里呢?不是有CVSSVN這些免費(fèi)的版本控制系統(tǒng)嗎?因?yàn)長inus堅(jiān)定地CVS和SVN,這些集中式的版本控制系統(tǒng)不但速度慢,而且必須聯(lián)網(wǎng)才能使用。有一些的版本控制系統(tǒng),雖然比CVS、SVN好用,但那是的,和Linux的開源精神不符。2002年,LinuxLinus很難繼續(xù)通過手工方式管理了,社區(qū)的弟兄們也對這種方式表達(dá)了強(qiáng)烈不滿,于是Linus選擇了一個(gè)商業(yè)的版本控制系統(tǒng)BitKeeper,BitKeeper的東家BitMover公司出于人道主義精神,授權(quán)Linux社區(qū)免費(fèi)使用這個(gè)版本控制系統(tǒng)。安定團(tuán)結(jié)的大好局面在2005年就被打破了,原因是Linux社區(qū)牛人,不免沾染了一些梁山好漢的江湖習(xí)氣。開發(fā)Samba的Andrew試圖BitKeeper的協(xié)議(這么干的其實(shí)也不只他一個(gè)被BitMover公司發(fā)現(xiàn)了(工作做得不錯(cuò)于是BitMover公司怒了,要收回Linux社區(qū)的免費(fèi)使用權(quán)。Linus可以向BitMover公司道個(gè)歉,保證以后嚴(yán)格管教弟兄們,嗯,這是不可能的。實(shí)Linus花了兩周時(shí)間自己用C寫了一個(gè)分布式版本控制系統(tǒng),這就是Git!一個(gè)月之內(nèi),Linux系統(tǒng)的源碼已經(jīng)由Git管理了!牛是怎么定義的呢?大家可以體會一下。Git迅速成為最流行的分布式版本控制系統(tǒng),尤其是2008年,上線了,它為開源項(xiàng)目免費(fèi)提供Git,無數(shù)開源項(xiàng)目開始遷移至,包括jQuery,PHP,Ruby等等。歷史就是這么偶然,如果不是當(dāng)年BitMover公司 Linux社區(qū),可能現(xiàn)在我們就沒有免費(fèi)而超級好用的Git了。集中式vsLinus一直痛CVSSVN都是集中式的版本控制系統(tǒng)Git是分布式版本控先說集中式版本控制系統(tǒng),版本庫是集中存放在服務(wù)器的,而干活的時(shí)候,用的都是自己的電腦,所以要先從服務(wù)器取得的版本,然后開始干活,干完活了,再把自己的活推送給服務(wù)器。服務(wù)器就好比是一個(gè)館,你要改一本書,必須先從館借出來,然后回到家自己改,改完了,再放回館。速度夠快,可如果在互聯(lián)網(wǎng)上,遇到網(wǎng)速慢的話,可能提交一個(gè)10M的文件就需要5分鐘, 服務(wù)器”,每個(gè)人的電腦上都是一個(gè)完整的版本庫,這樣,你工作的時(shí)候,就那多個(gè)人如何協(xié)作呢?比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文 版本控制系統(tǒng)的服務(wù)器要是出了問題,所有人都沒法干活了。 他的電腦壓根沒有開機(jī)。因此,分布式版本控制系統(tǒng)通常也有一臺充當(dāng)“服務(wù)器”的電腦,但這個(gè)服務(wù)器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不方便而已。當(dāng)然,Git的優(yōu)勢不單是不必聯(lián)網(wǎng)這么簡單,后面我們還會看到Git極其強(qiáng)大的分支管理,把SVN等遠(yuǎn)遠(yuǎn)拋在了后面。CVS作為最早的開源而且免費(fèi)的集中式版本控制系統(tǒng),直到現(xiàn)在還有不少人在用。由于CVS自身設(shè)計(jì)的問題,會造成提交文件不完整,版本庫莫名其妙損壞的情況。同樣是開源而且免費(fèi)的VN修正了CVS的一些穩(wěn)定性問題,是目前用得最多的集中式版本庫控制系統(tǒng)。除了免費(fèi)的外,還有的集中式版本控制系統(tǒng),比如IBM的ClearCase(以前是Rational公司的,被IBM收購了),特點(diǎn)是安裝比Windows還大,運(yùn)行比蝸牛還慢,能用ClearCase的一般是世界500強(qiáng),他們有個(gè)共同的特點(diǎn)是財(cái)大氣粗,或者人傻錢多。GitGitBitKeeperGit的Mercurial和Bazaar等。這些分布式版本控制系統(tǒng)各有特點(diǎn),但最快、最簡單也最流行的依然是Git!安裝最早Git是在Linux上開發(fā)的,很長一段時(shí)間內(nèi),Git也只能LinuxUnix系統(tǒng)上跑。不過,慢慢地有人把它移植到了Windows上?,F(xiàn)在,Git可以在Linux、Unix、Mac和Windows這幾大平臺上正常運(yùn)行了。要使用Git,第一步當(dāng)然是安裝Git了。根據(jù)你當(dāng)前使用的平臺來閱讀下面的文字在Linux首先,你可以試著輸入git,看看系統(tǒng)有沒有安裝 令,有很多Linux會友好地告訴你Git沒有安裝,還會告訴你如何安裝Git$Theprogram'git'iscurrentlynotinstalledYoucaninstallitby sudoapt-getinstall以直接完成Git的安裝,非常簡單。git-core”,因?yàn)橐郧坝袀€(gè)軟件也叫GIT(GNUInctiveTools),結(jié)果Git就只能叫g(shù)it-core了。由于Git名氣實(shí)在太大,后來就把GNUInctiveTools改成gnuit,git-core正式改為git。如果是其他Linux版本,可以直接通過源碼安裝。先從Git官網(wǎng)源碼,然后解壓,依次輸入:./config,make,sudomakeinstall這幾個(gè)命令安裝就好了。MacOSX上安裝如果你正在使用Mac做開發(fā),有兩種安裝Git的方一是安裝homebrew,然后通過homebrew安裝Git,具體方法請參考的文檔 第二種方法更簡單,也是推薦的方法,就是直接從Apptore安裝XodeXoe集成了GitXode,選擇菜單“Xode”->“Pefeence”,在彈出窗口中找到“Dowloads”,選擇“CommandLieTools”,點(diǎn)“Itall就可以完成安裝了。XcodeAppleIDEMaciOSApp的必選裝備,而在Windows上安裝實(shí)話實(shí)說,Windows是最爛的開發(fā)平臺,如果不是開發(fā)Windows游戲或者在IE里Git的。WindowsLinux/UnixCygwin這樣的模擬環(huán)境,Git也一樣。Cygwin的安裝和配置都比較復(fù)雜,就不建議你折騰了。不過,有高人已經(jīng)把模擬環(huán)Git都打包好了msysgit,只需要一個(gè)單獨(dú)的exe安裝程序,其他什么也不msysgit是Windows版的Git,從 安裝完成后,在開始菜單里找到“Git”->“GitBash”,蹦出一個(gè)類似命令行窗口的東西,就說明Git安裝成功!安裝完成后,還需要最后一步設(shè)置,在命令行輸入$$gitconfig--global"Your$gitconfig--global 因?yàn)镚it地址。你也許會擔(dān)心,如果有人故意冒充別人怎么辦?這個(gè)不必?fù)?dān)心,首先我們相信大家都是善良無知的群眾,其次,真的有冒充的也是有辦法可查的。命令的--global參數(shù),用了這個(gè)參數(shù),表示你這臺機(jī)器上所有的倉庫都會使用這個(gè)配置,當(dāng)然也可以對某個(gè)倉庫指定不同的用戶名和地址什么repository,你可以簡單理解成一個(gè),這個(gè)里面的所有文件都可以Git管理起來,每個(gè)文件的修改、刪除,Git都能,以$mkdir$cd$所以,創(chuàng)建一個(gè)版本庫非常簡單,首先,選擇一個(gè)合$mkdir$cd$命令用于顯示當(dāng)前 。在我的Mac 上,這個(gè)倉庫位于/Uses/miha/eart。如果你使用Winows了遇各名其問請保 名(包括父)第二步,通過gitinit命令把這 變成Git可以管理的倉庫$$gitInitializedemptyGitrepositoryinGit就把倉庫建好了,而且告訴你是一個(gè)空的倉庫(emptyGitrepository),細(xì)心的讀者可以發(fā)現(xiàn)當(dāng)前下多了一個(gè).git的,這個(gè)是Git來管理版本庫的,沒事千萬不要手動(dòng)修改這個(gè)里面的文件,不然改亂了,就把Git倉庫給破壞了。也不一定必須在空下創(chuàng)Git倉庫,選擇一個(gè)已經(jīng)有東西的也是可以的。不過,不建議你使用自己正在開發(fā)的公司項(xiàng)目來學(xué)Git,否則造成的一切概不負(fù)責(zé)。網(wǎng)頁,所有的程序代碼等等,Git也不例外。版本控制系統(tǒng)可以告訴你每次的改動(dòng),比如在第5行加了一個(gè)單詞“Liux”第8行刪了一個(gè)單詞“Window”二進(jìn)件然能本制管但法文變只把制件每次改動(dòng)串起來,也就是只知道 從10KB改成了2KB,但到底改了啥,版本控制系統(tǒng)不知道,也沒法知道。 的Word格式是二進(jìn)制格式,因此,版本控制系統(tǒng)是沒法Word文件的改動(dòng)的,前面我們舉的例子只是為了演示,如果要真正使用版本控制系統(tǒng),就因?yàn)槲谋臼怯芯幋a的,比如中文有常用的GBK編碼,日文有Shift_JIS編碼,如果沒有歷史遺留問題,強(qiáng)烈建議使用標(biāo)準(zhǔn)的UTF-8編碼,所有語言使用同一種編碼,既沒有 使用Windows的童鞋要特別注意千萬不要使用Winows自帶的記事本編輯任何文本文件。原因是開發(fā)記事本的團(tuán)隊(duì)使用了一個(gè)非常弱智的行為來保存UT-8開頭添加了0xebbbf(十六進(jìn)制)的字符,你會遇到很多不可思議的問題,比如,網(wǎng)頁第一行可能會顯示一個(gè)“?”,明明正確的程序一編譯就報(bào)語法錯(cuò)誤,等等,都是由記事本的弱智行為帶來的。建議你Notpad代替記事本,不但功能強(qiáng)大,而且免費(fèi)!記得把Notead++的默認(rèn)編碼設(shè)置為UTF8withoutOM即可:言歸正傳,現(xiàn)在我們編寫一 文件,內(nèi)容如下GitisaversioncontrolGit 一定要放GitisaversioncontrolGit 一定要放Git再厲害也找不到這個(gè)文件和把大象放到冰箱需要3步相比,把一個(gè)文件放到Git倉庫只需要兩步第一步,用命令gitadd告訴Git,把文件添加到倉$$gitadd 令,沒有任何顯示,這就對了,Unix的哲學(xué)是“沒有消息就是好消息”,git第二步,用git

告訴Git,把文件提交到倉$$gitcommit-m"wroteareadme[master( mit)cb926e7]wroteareadmefile1filechanged,2insertions(+)createmode100644嫌麻煩不想輸入-mxxx行不行?確實(shí)有辦法可以這么干,但是強(qiáng)烈不建議你這么干,因?yàn)檩斎胝f明對自己對別人閱讀都很重要。實(shí)在不想輸入說明的童鞋請自行,我不gitcommit命令執(zhí)行成功后會告訴你,1個(gè)文件被改動(dòng)(我們新添加的文件),插入了兩行內(nèi)容 有兩行內(nèi)容)文件,所以你可以多次add不同的文件,比如:

可以一次提交很$$gitadd$gitadd$gitadd$gitcommit-m"add3現(xiàn)在總結(jié)一下今天學(xué)的兩點(diǎn)內(nèi)容Git倉庫,使gitinit命令。添加文Git倉庫,分兩步:第一步,使用命令gitadd<file>,注意,可反復(fù)多次使用,添加多個(gè)文件第二步,使用命令gitcommit,完成我們繼續(xù)修r(nóng)eadme.txt文件,改成如下內(nèi)容:GitGitisadistributedversioncontrolGit 現(xiàn)在命令看看結(jié)果$$git#Onbranch#Changesnotstagedfor##(use"gitadd<file>..."toupdatewhatwillbe(use"gitcheckout--<file>..."todiscardchangesinworkingnochangesaddedtocommit(use"gitadd"and/or"gitcommit-命令可以讓我們時(shí)刻掌握倉庫當(dāng)前的狀態(tài),上 令告訴我們 被修改過了,但還沒有準(zhǔn)備提交的修改雖然Git告訴我們r(jià)eadme.txt被修改了,但如果能看看具體修改了什么內(nèi)容,自然是$$gitdiffdiff--gita/readme.txtindex46d49bf..9247db6---+++@@-1,2+1,2-Gitisaversioncontrol+GitisadistributedversioncontrolGit 顧名思義就是查看 difference,顯示的格式正是 通用的 readme.txt作了什么修改后,再把它提交到倉庫就放心多了,提交修改和提交新文件是一樣的兩步,第一步gitadd:$$gitadd同樣沒有任何輸出。在執(zhí)行第二步git a$$git#Onbranch#Changestobe##(use"gitresetHEAD<file>..."toa $$gitcommit-m"adddistributed"[masterea34578]adddistributed1filechanged,1insertion(+),1deletion(-提交后,我們命令看看倉庫的當(dāng)前狀態(tài)$$git#Onbranchnothingtocommit(workingdirectoryGit告訴我們當(dāng)前沒有需要提交的修改,而且,工作 是干凈(workingdirectory要隨時(shí)掌握工作區(qū)的狀態(tài),使用gitstatus命令如果gitstatus告訴你有文件被修改過,用gitdiff可以查看修改現(xiàn)在,你已經(jīng)學(xué)會了修改文件,然后把修改提交到Git版本庫,現(xiàn)在,再練次,修改readme.txt文件如下:GitGitisadistributedversioncontrolsystem.Gitis softwaredistributedundertheGPL.然后嘗試提交$$gitadd$gitcommit-m"append ]append1filechanged,1insertion(+),1deletion(-像這樣,你不斷對文件進(jìn)行修改,然后不斷提交修改到版本,就好比玩RPG游戲時(shí),有些時(shí)候,在打Boss之前,你會手動(dòng)存盤,以便萬一打Boss失敗了,可以從最近的地方重新開始。Git也是一樣,每當(dāng)你覺得文件修改到一定程度的時(shí)候,就可以“保存一個(gè)快照”,這個(gè)快照在Git中被稱為commit。一旦你把文件改亂了,或者誤刪了文件,還可以從最近c(diǎn)ommit恢復(fù),然后繼續(xù)工作,而不是把幾個(gè)月的工作成果全部丟失。現(xiàn)在,我們回顧一下readme.txt文件一共有幾個(gè)版本被提交到Git倉了:版本1:wroteareadmefileGitGitisaversioncontrolGit GitGitisadistributedversioncontrolGit GitGitisadistributedversioncontrolsystem.Gitis softwaredistributedundertheGPL.Git中,我們gitlog命令查看:$$gitAuthor:MichaelLiao> TueAug2015:11:49appendcommitea34578d5496d7dd233c827ed32a8cd576c5ee85Author:MichaelLiao<as TueAug2014:53:12addcommitAuthor:MichaelLiao> MonAug1917:51:55wroteareadme命令顯示從最近到最遠(yuǎn)的提交日志,我們可以看到3次提交,最近的一次是“appendGPL”,上一次是“adddistributed”,最早的一次是“wroteareadmefile”。如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上--pretty=oneline參數(shù):$$gitlog--f8f31179f24e0882e1e0appendea34578d5496d7dd233c827ed32a8cd576c5ee85add bf755030wroteareadme需要友情提示的是,你看到的一大串類似 ...882e1e0”的是commit(版本號),SVN不一樣,Gitcommitid1,2,3……遞增的數(shù)字,而是一SHA1commitid和我的肯定不一樣,以你自己的為準(zhǔn)。為什么commitid需要用這么一大串?dāng)?shù)字表示呢?因?yàn)镚it是分布式的版本控制系統(tǒng),后面我們還要研究多人在同一個(gè)版本工作,如果大家都用Git就會把它們自動(dòng)串成一條時(shí)間線。如果使用可視化工具查Git歷史,就可以更清楚地看到提交歷史的時(shí)間線:好了,現(xiàn)在我們啟動(dòng)時(shí)光穿梭機(jī),準(zhǔn)備把readme.txt回退到上一個(gè)版本,也就是“add首先,Git必須知道當(dāng)前版本是哪個(gè)版本,在Git中,用HEAD表示當(dāng)前版本,也就是的提交“ ...882e1e0”(注意我的提交ID和你的肯定不一樣),上一個(gè)版本就是HEAD^,上上一個(gè)版本就是HEAD^^,當(dāng)然往上100個(gè)版本寫100個(gè)^比較容易數(shù)不過來,所以寫成HEAD~100?,F(xiàn)在,我們要把當(dāng)前版本“appendGPL”回退到上一個(gè)版本“adddistributed”,就可以使用gitreset命令:$$gitreset--hardHEADisnowatea34578add--hard參數(shù)有啥意義?這個(gè)后面再講,現(xiàn)在你先放心使用。readme.txt的內(nèi)容是不是版本“adddistributed”:$$catGitisadistributedversioncontrolGit 還可以繼續(xù)回退到上一個(gè)版本“wroteareadmefile”,不過且慢,然再看看現(xiàn)在版本庫的狀態(tài)$$gitcommitea34578d5496d7dd233c827ed32a8cd576c5ee85Author:MichaelLiao<as TueAug2014:53:12addaddAuthor:MichaelLiao<as> MonAug1917:51:55wroteareadme GPL”已經(jīng)看不到了!好比你從21世紀(jì)坐時(shí)光穿梭機(jī)來到了19世紀(jì),想再回去已經(jīng)回不去了,腫么辦?那個(gè)“appendGPL”的commitid是“ ...”,于是就可以指定回到未來的某個(gè)版$$gitreset--HEADisnowappend版本號沒必要寫全,前幾位就可以了,Git會自動(dòng)去找。當(dāng)然也不能只寫前一兩位,因Git可能會找到多個(gè)版本號,就無法確定是哪一個(gè)了。 翼翼地看看readme.txt的內(nèi)容果果然,又回來了$catGitisadistributedversioncontrolGit softwaredistributedundertheGit的版本回退速度非???,因?yàn)镚it在內(nèi)部有個(gè)指向當(dāng)前版本的HEAD指針,當(dāng)你回退版本的時(shí)候,Git僅僅是把HEAD從指向“appendGPL”:然后順便把工作區(qū)的文件更新了。所以你讓HEAD指向哪個(gè)版本號,你就把當(dāng)前版本定位在哪。找不到新版本的omitid怎么辦?在版本時(shí),再想恢復(fù)到“appendGPL”,就必須找到“appendGPL”終于舒了口氣,第二行顯示“appendGPL”的commitid是 現(xiàn)在總結(jié)一下HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們在版本的歷史之間穿梭穿梭前可以查看提交歷史,以便確定要回退到哪個(gè)版本 未來,查看命令歷史,以便確定要回到未來的哪個(gè)版本Git和其他版本控制系統(tǒng)如SVN的一個(gè)不同之處就是有暫存區(qū)的概念。先工作區(qū)(WorkingDirectory):就是你在電腦里能看到的 版本庫(Repository):工作區(qū)有一個(gè)隱藏 .git,這個(gè)不算工作區(qū),而是Git的版Git的版本存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存分支 的概念我們以后再講前面講了我們把文件往Git版 添加的時(shí)候,是分兩步執(zhí)行的第一步是用gitadd把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存第二步是用git

提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)因?yàn)槲覀儎?chuàng)建Git版本庫時(shí),Git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支,所以,現(xiàn)在,gitcommit就是往master分支上提交更改。俗話說,實(shí)踐出真知?,F(xiàn)在,我們再練遍,先對

做個(gè)修改,比Gitisadistributedversioncontrolsystem.GitissoftwaredistributedundertheGPL.Githasamutableindexcalledstage.然后,在工作文本文件(內(nèi)容隨便寫)git先 查看一git$$git#Onbranch#Changesnotstagedfor (use"gitadd<file>..."toupdatewhatwillbe (use"gitcheckout--<file>..."todiscardchangesinworking#### #Untracked###(use"gitadd<file>..."toincludeinwhatwillbenochangesaddedtocommit(use"gitadd"and/or"gitcommit-所以它的狀態(tài)是Untracked。

都添加后, 再$$git#Onbranch#Changestobe##(use"gitresetHEAD<file>..."tonew 現(xiàn)在,暫存區(qū)的狀態(tài)就變成這樣了gitgit命令實(shí)際上就是把要提交的所有修改放到暫存區(qū)(Stae),然后,執(zhí)行 就可以 把暫存區(qū)的所有修gitgit$$gitcommit-m"understandhowstageworks"[master27c9860]understandhowstageworks22fileschanged,675insertions(+)createmode100644LICENSE一旦提交后,如果你又沒有對工作區(qū)做任何修改,那么工作區(qū)就是“干凈”的$$git#Onbranchnothingtocommit(workingdirectory現(xiàn)在版本庫變成了這樣,暫存區(qū)就沒有任何內(nèi)容了暫存區(qū)是Git非常重要的概念,弄明白了暫存區(qū),就弄明白了Git的很多操作到底干沒弄明白暫存區(qū)是怎么回事的童鞋,請向上滾動(dòng)頁面,再看一次現(xiàn)在,假定你已經(jīng)完全掌握了暫存區(qū)的概念。下面,我們要討論的就是,為什 比其他版本控制系統(tǒng)設(shè)計(jì)得優(yōu)秀,因?yàn)镚it并管理的是修改,而非文件你會問,什么是修改?比如你新增了一行,這就是一個(gè)修改,刪除了一行,也是一個(gè)修改,也算一個(gè)修改。做一個(gè)修改,比如加一行內(nèi)容$$catGitisadistributedversioncontrolsystem.Gitis softwaredistributedundertheGPL.Githasamutableindexcalledstage.Gittracks然后,添加$$gitadd$git#Onbranch#Changestobe##(use"gitresetHEAD<file>..."to然后,再修改$$catGitisadistributedversioncontrolsystem.Gitis softwaredistributedundertheGPL.Githasamutableindexcalledstage.Gittrackschangesof$$gitcommit-m"gittrackschanges"[masterd4f25b6]gittrackschanges1filechanged,1提交后,再看看狀態(tài)$$git#Onbranch#Changesnotstagedfor##(use"gitadd<file>..."toupdatewhatwillbe(use"gitcheckout--<file>..."todiscardchangesinworkingnochangesaddedtocommit(use"gitadd"and/or"gitcommit-gitaddgit你看,我們前面講了,Git管理的是修改,當(dāng)你用“gitadd”命令后,在工作區(qū)的第一“gitcommit”只負(fù)責(zé)把暫存區(qū)的修改提交了,也就是第一次的修改被提交了,第二次的修提交后,用“gitdiffHEAD--readme.txt”命令可以查看工作區(qū)和版本面$gitdiffHEAD--readme.txtdiff$gitdiffHEAD--readme.txtdiff--gita/readme.txtb/readme.txtindex76d770f..a9c5755100644---+++@@-1,4+1,4Gitisadistributedversioncontrolsystem.Gitis softwaredistributedundertheGPL.Githasamutableindexcalledstage.-Gittracks+Gittrackschangesof可見,第二次修改確實(shí)沒有被提交addcommit,也可以別著急提交第一次修add第二次修改,再commit,就相當(dāng)于把兩次修改合并后一塊提交了:addadd好,現(xiàn)在,把第二次修改提交了,然后開始小結(jié)現(xiàn)在,你又理解了Git是如何 修改的,每次修改,如果不add到暫存區(qū),那就不會加入到commit中。$$catGitisadistributedversioncontrolsystem.Gitis softwaredistributedundertheGPL.Githasamutableindexcalledstage.GittrackschangesofMystupidbossstillprefers在你準(zhǔn)備提交前,一杯咖啡起了作用,你猛然發(fā)現(xiàn)了“tuidboss”可能會讓你丟掉這個(gè)月的獎(jiǎng)金!git既然錯(cuò)誤發(fā)現(xiàn)得很及時(shí),就可以很容易地糾正它。你可以刪掉最后一行,手動(dòng)把文件恢復(fù)到上一個(gè)版本的狀態(tài)。如果用 查看一git$$git#Onbranch#Changesnotstagedfor##(use"gitadd<file>..."toupdatewhatwillbe(use"gitcheckout--<file>..."todiscardchangesinworkingnochangesaddedtocommit(use"gitadd"and/or"gitcommit-$gitcheckout--$gitcheckout--

文件在工作區(qū)的修改全部模一樣的狀態(tài)暫存區(qū)后的狀態(tài)

自修改后還沒有被放到暫存區(qū),現(xiàn)在,撤銷修改就回到和版本已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷修改就回到添加總之,就是讓這個(gè)文件回到最近一次gitcommit或gitadd時(shí)的狀態(tài)現(xiàn)在,看 的文件內(nèi)容$$catGitisadistributedversioncontrolsystem.Gitis softwaredistributedundertheGPL.Githasamutableindexcalledstage.Gittrackschangesof文件內(nèi)容果然復(fù)原了gitgitgitgitcheckout--

git現(xiàn)在假定是凌晨3點(diǎn),你不但寫了一些胡話,git

到暫存區(qū)了$catGitisadistributedversioncontrolsystem.Gitis softwaredistributed$catGitisadistributedversioncontrolsystem.Gitis softwaredistributedundertheGPL.Githasamutableindexcalledstage.GittrackschangesofMystupidbossstillprefers$gitaddgit查看一下,修改只是$git#Onbranch#Changestobe$git#Onbranch#Changestobe##(use"gitresetHEAD<file>..."to

可以把暫存區(qū)的修改撤銷掉(unstage,$$gitresetHEADreadme.txtUnstagedchangesafterreset: gitreset命令既可以回退版本,也可以把暫存區(qū)的修改回退到工作區(qū)。當(dāng)我們用時(shí),表示的版本。git再 查看一下,現(xiàn)在暫存區(qū)是干凈的,工作區(qū)有修git$$git#Onbranch#Changesnotstagedfor##(use"gitadd<file>..."toupdatewhatwillbe(use"gitcheckout--<file>..."todiscardchangesinworkingnochangesaddedtocommit(use"gitadd"and/or"gitcommit-還記得如何丟棄工作區(qū)的修改嗎$$gitcheckout--$git#Onbranchnothingtocommit(workingdirectory整個(gè)世界終于清靜了現(xiàn)在,假設(shè)你不但改錯(cuò)了東西,還從暫存區(qū)提交到了版本庫,怎么辦呢?還記得版本回退一節(jié)嗎?可以回退到上一個(gè)版本。不過,這是有條件的,就是你還沒有把自己的本地版本庫推送到。還記得Git是分布式版本控制系統(tǒng)嗎?我們后面會講到版本庫,一旦你把“tuidbos”提交推送到版本庫,你就真的慘了……又到了小結(jié)時(shí)間場 1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí),用命c(diǎn)heckoutcheckoutfile場景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí),想丟棄修改,分兩步,第一步用命gitresetHEADfile,就回到了場1,第二步按場1操作。過前提是沒有推送到庫。在Git中,刪除也是一個(gè)修改操作,我們實(shí)戰(zhàn)一下,先添加一個(gè)新文件test.txt到并且提交$$gitadd$gitcommit-m"addtest.txt"[master94cdc44]addtest.txt1filechanged,1insertion(+)createmode100644test.txt一般情況下,你通常直接在文件管理器中把沒用的文件刪了,或者用 命令刪了$$rm這個(gè)時(shí)候,it 知你刪除文件,此,工區(qū)和版本就不一了u令刻你文刪:$$git#Onbranch#Changesnotstagedfor##(use"gitadd/rm<file>..."toupdatewhatwillbe(use"gitcheckout--<file>..."todiscardchangesinworkingnochangesaddedtocommit(use"gitadd"and/or"gitcommit-commit:$$gitrmtest.txtrm'test.txt'$gitcommit-m"removetest.txt"[masterd17efd8]removetest.txt1filechanged,1deletion(-)deletemode100644test.txt現(xiàn)在,文件就從版本庫中被刪除了$$gitcheckout-- 版本,你會丟失最近一次提交后你修改的內(nèi)容。到目前為止,我們已經(jīng)掌握了如何在Git倉對一個(gè)文件進(jìn)行時(shí)光穿梭,你再也不用擔(dān)可是有用過集中式版本控制系統(tǒng)SVN的童鞋會站出來說,這些功能在SVN里早就有了,沒看出Git有什么特別的地方。沒錯(cuò),如果只是在一個(gè)倉管理文件歷史,Git和SVN真沒啥區(qū)別。為了保證你現(xiàn)在所學(xué)的Git物超所值,將來絕對不會后悔,同時(shí)為了打擊已經(jīng)不幸學(xué)了SVN的童鞋,本章開始介紹Git的級功能之一(注意是之一,也就是后面還有之二,之三……):其實(shí)一臺電腦上也是可以克隆多個(gè)版本庫的,只要不在同一 下。不過,現(xiàn)實(shí)生中是不會有人這么傻的在一臺電腦上搞幾個(gè)庫玩,因?yàn)橐慌_電腦上搞幾個(gè)庫完全實(shí)際情況往往是這樣,找一臺電腦充當(dāng)服務(wù)器的角色,每天24小時(shí)開機(jī),其他每個(gè)人都完全可以自己搭建一臺運(yùn)行Git的服務(wù)器,不過現(xiàn)階段,為了學(xué)Git先搭個(gè)服務(wù)器絕對是小題大作。好在上有個(gè)叫的神奇的,從名字就可以看出,這個(gè)就是提供Git倉庫托管服務(wù)的,所以,只要一個(gè)賬號,就可以免費(fèi)獲得Git在繼續(xù)閱讀后續(xù)內(nèi)容前,請自行賬號。由于你的本地Git倉庫和倉庫之間的傳輸是通過SSH加密的,所以,需要一點(diǎn)設(shè)置:1步SSHKey。在用戶主下,看看有沒有.ssh,如果有,再看看這個(gè)下有沒id_rsaid_rsa.pub這兩個(gè)文件,如果已經(jīng)有了,可直接跳到下一步。如果沒有,打開S(Windows下打開GitBash),創(chuàng)建SSHKey:$$ssh-keygen-trsa-C 你需要把郵件地址換成你自己的郵件地址,然后一路回車,使用默認(rèn)值即可,由于這 也不是用于軍事目的,所以也無需設(shè) 如果一切順利的話,可以在用戶主里找到.ssh,里面id_rsaid_rsa.pub兩個(gè)文件,這兩個(gè)就是SSHKey的秘鑰對,id_rsa是私鑰,不能出去,id_rsa.pub是第2步:登 ,打開“Accountsettings”,“SSHKeys”頁面點(diǎn)“AddKey”,你就應(yīng)該看到已經(jīng)添加的為什么需要SSHKey呢?因?yàn)樾枰R別出你推送的提交確實(shí)是你推送的,而不是別人冒充的GitSSH協(xié)議,所以,只要知道了你的公鑰,當(dāng)然,允許你添加Key。假定你有若干電腦,你一會兒在公司提交,一會兒在家里提交,只要把每臺電腦Key都添加到,就可以在每臺電腦上往推最后友情提示,在上免費(fèi)托管Git倉庫,任何人都可以看到喔(但只有你自己才能改)。所以,敏感信息放進(jìn)去。如果你不想讓別人看到Git庫,有兩個(gè)辦法,一個(gè)是交點(diǎn)保護(hù)費(fèi),讓 把公開倉庫變成私有的,這樣別人就看不見了(不可讀更不可寫)一個(gè)Git服務(wù)器,因?yàn)槭悄阕约旱腉it服務(wù)器,所以別人也是看不見的。這個(gè)方法我們后面會講到的,相當(dāng)簡單,公司內(nèi)部開發(fā)必備。確保你擁有一個(gè)賬號后,我們就即將開始倉庫的學(xué)習(xí)“有 倉庫 再也不用擔(dān)心我的硬盤了。”—— 點(diǎn)讀現(xiàn)在的情景是,你已經(jīng)在本地創(chuàng)建Git倉庫后,又想在創(chuàng)建一Git倉庫,并且讓這兩個(gè)倉庫進(jìn)行同步,這樣,上的倉庫既可以作為備份,又可以讓其首先,登陸,然后,在右上角找到“Createanewrepo”按鈕,創(chuàng)建一個(gè)新在Repositoryname填入learngit,其他保持默認(rèn)設(shè)置,點(diǎn)擊“Create按鈕,就成功地創(chuàng)建了一個(gè)新的Git倉庫目前,在上的這個(gè)learngit倉庫還是空的,告訴我們,可以從這個(gè)倉倉庫。現(xiàn)在,我們根據(jù)的提示,在本地的learngit倉庫下運(yùn)行命令$$gitremoteadd 請千萬注意,把上面

替換成你自己 賬戶名,否則,你在本關(guān)聯(lián)的就是我的庫,關(guān)聯(lián)沒有問題,但是你以后推送是推不上去的,因?yàn)槟愕?公鑰不在我的賬戶列表中添加后,庫的名字就是origin,這是Git默認(rèn)的叫法,也可以改成別的,但是這下一步,就可以把本地庫的所有內(nèi)容推送到庫上$$gitpush-uoriginmasterCountingobjects:19,done.Deltacompressionusingupto4threads.Compressingobjects:100%(19/19),done.Writingobjects:100%(19/19),13.73KiB,done.Total23(delta6),reused0(delta0) *[new master->Branchmastersetuptotrackremotebranchmasterfrom把本地庫的內(nèi)容推送到,程

命令,實(shí)際上是把當(dāng)前分

推送到地 地

分支,還會把本地的master分支和的分支關(guān)聯(lián)起來,在以后的推送或者拉取時(shí)就可以簡化命令推送成功后,可以立刻在頁面中看到庫的內(nèi)容已經(jīng)和本地一模一樣從現(xiàn)在起,只要本地作了提交,就可以通過命令$$gitpushorigin庫

分支 修改推送 ,現(xiàn)在,你就擁有了真正的分布式版SSH當(dāng)你第一次使用Git

或者push命令連接時(shí),會得到一個(gè)警告TheTheauthenticityofhostRSAkeyfingerprintis(xx.xx.xx.xx)can'tbeAreyousureyouwanttocontinueconnecting這是因?yàn)镚it使用SSH連接,而SSH連接在第一次驗(yàn) 服務(wù)器的Key時(shí) 的Key的

Git會輸出一個(gè)警告,告訴你已經(jīng) 的Key添加到本機(jī)的一個(gè)信任列表里了Warning:Warning:Permanentlyadded '(RSA)tothelistofknown這個(gè)警告只會出現(xiàn)一次,后面的操作就不會有任何警告了如果你實(shí)在擔(dān)心有人冒充服務(wù)器,輸入 信息是否與SSH連接給出的一致。

前可以對 的RSA要關(guān)聯(lián)一個(gè)庫,使用命gitremoteadd;gitpush-uorigingitpush-uorigin

第一次推送master分支的所有內(nèi)容gitpushorigingitpushorigin

分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮庫的存在,也就是有沒有聯(lián)網(wǎng)都可以正常工作,而VN在沒有聯(lián)網(wǎng)的時(shí)候是干活的!當(dāng)有網(wǎng)絡(luò)的時(shí)候,再把本地提交推送一下就完成了同步,真是太方便了!上次我們講了先有本地庫,后有庫的時(shí)候,如何關(guān)聯(lián)庫現(xiàn)在,假設(shè)我們從零開發(fā),那么最好的方式是先創(chuàng)建庫,然后,從庫克隆。首先,登陸 ,創(chuàng)建一個(gè)新的倉庫,名字叫itsill:a, 創(chuàng)建一個(gè)README.md文件。創(chuàng)建完畢后,可以看到README.md文件:現(xiàn)在 $$gitCloningintoremote:Countingobjects:3,remote:Total3(delta0),reused0(delta0)Receivingobjects:100%(3/3),done.$cd$注意把Git庫的地址換成你自己的,然后進(jìn)入gitskills 如果有多個(gè)人協(xié)作開發(fā),那么每個(gè)人各自從克隆一份就可以了。你也許還注意到,給出的地址不止一個(gè),還可以用t 默認(rèn)git://使用ssh,但也可以使用https等其他協(xié)議

這樣的地址。實(shí)際上,Git支持多種協(xié)議使用https除了速度慢以外,還有個(gè)最大的麻煩是每次推送都必須輸 某些只開放http端口的公司內(nèi)部就無法使用ssh協(xié)議而只能用https。Git支持多種協(xié)議,包括https,但通過ssh支持的原生git協(xié)議速度最快 里面的平行宇宙,當(dāng)你正在電腦前努力學(xué)習(xí)Git的時(shí)候,另一個(gè)你正在另一個(gè)平行宇宙里努力學(xué)習(xí)SVN。宇宙合并了,結(jié)果,你既學(xué)會Git又學(xué)會SVN!你寫了50%的代碼,如果立刻提交,由于代碼還沒寫完,不完整的代碼庫會導(dǎo)致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進(jìn)度的巨大風(fēng)險(xiǎn)。來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發(fā)完畢后,再但Git的分支是與眾不同的,無論創(chuàng)建、切換和刪除分支,Git在1秒鐘之內(nèi)就能完成!無論你的版本庫是1個(gè)文件還是1萬個(gè)文件。是一個(gè)分支。截止到目前,只有一條時(shí)間線,在Git里,這個(gè)分支叫主分支,即master分支。HEAD嚴(yán)格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當(dāng)前分支。一開始的時(shí)候,master分支是一條線,Git用master指 的提交,再用指 master,就能確定當(dāng)前分支,以及當(dāng)前分支的提交點(diǎn)每次提交,master分支都會向前移動(dòng)一步,這樣,隨著你不斷提交,master分支的當(dāng)我們創(chuàng)建新的分支,例如dev時(shí),Git新建了一個(gè)指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當(dāng)前分支在dev上:你看,Git創(chuàng)建一個(gè)分支很快,因?yàn)槌嗽黾右粋€(gè)dev指針,改改HEAD的指向,工不過,從現(xiàn)在開始,對工作區(qū)的修改和提交就是針對dev分支了,比如新提交一次后dev指針往前移動(dòng)一步,而master指針不變假如我們在dev上的工作dev合并到master上。Git怎么合并呢?最簡單的方法,就是直接把master指向dev的當(dāng)前提交,就完成了合并:所以Git合并分支也很快!就改改指針,工作區(qū)內(nèi)容也不變合并完分支后,甚至可以刪除dev分支。刪除dev分支就是把dev指針給刪掉,刪掉后,我們就剩下了一條master分支:真是太神奇了,你看得出來有些提交是通過分支完成的嗎?下面開始實(shí)戰(zhàn)。首先,我們創(chuàng)建dev分支,然后切換到dev分支$gitcheckout-bdevSwitched$gitcheckout-bdevSwitchedtoanewbranch'dev'命令加上- 參數(shù)表示創(chuàng)建并切換,相當(dāng)于以下兩條命令$$gitbranch$gitcheckoutSwitchedtobranch令查看當(dāng)前分支$$git*命令會列出所有分支,當(dāng)前分支前面會標(biāo)一個(gè)*號然后,我們就可以在dev分支上正常提交,比如對readme.txt做個(gè)修改,加上一行CreatingCreatinganewbranchis然后提交$$gitadd$gitcommit-m"branch[devfec145a]branch1filechanged,1現(xiàn)在,dev分支的工作完成,我們就可以切換回master分支$gitcheckoutmasterSwitched$gitcheckoutmasterSwitchedtobranch'master'切換回master分支后,再查看一個(gè)readme.txt文件,剛才添加的內(nèi)容不見了!因?yàn)槟莻€(gè)提交是在dev分支上,而master分支此刻的提交點(diǎn)并沒有變:現(xiàn)在,我們把dev分支的工作成果合并到master$gitmergedev$gitmergedevreadme.txt 11filechanged,1命令用于合并指定分支到當(dāng)前分支。合并后,再查看readme.txt 就可以看到,和dev分支的 直接把master指向dev的當(dāng)前提交,所以合并速度非??臁?gitbranch-dDeletedbranchdev(was$gitbranch-dDeletedbranchdev(was刪除后,查看branch,就只剩下master分支了$$git*Git鼓勵(lì)你使用分支完成某個(gè)任務(wù),合并后再刪master分支上工作效果是一樣的,但過程更安全。查看分支:gitbranch切換分支:gitcheckout創(chuàng)建+切換分支:gitcheckout-be合并某分支到當(dāng)前分支:gitmerge刪除分支:gitbranch-dae人生不如意之事十之,合并分支往往也不是一帆風(fēng)順的準(zhǔn)備新的feature1分支,繼續(xù)我們的新分支開發(fā)$gitcheckout-bfeature1Switched$gitcheckout-bfeature1Switchedtoanewbranch'feature1'修改readme.txt最后一行,改為CreatingCreatinganewbranchisquickAND在feature1分支上提交$$gitadd$gitcommit-m"AND[feature175a857c]AND1filechanged,1insertion(+),1deletion(-切換到master$gitcheckoutmasterSwitched$gitcheckoutmasterSwitchedtobranch'master'Yourbranchisaheadof'origin/masterby1Git還會自動(dòng)提示我們當(dāng)前master分支比的master分支要超前1個(gè)提交。在master分支上把readme.txt文件的最后一行改為:CreatingCreatinganewbranchisquick&$$gitadd$gitcommit-m"&simple"[master400b400]&simple1filechanged,1insertion(+),1deletion(-現(xiàn)在,master分支和feature1分支各自都分別有新的提交,變成了這這種情況下,Git無法執(zhí)行“快速合并”,只能試圖把各自的修改合并起來,但這種合并就可能會有,我們試試看:$git$gitmerge(content):MergeAutomaticmergefailed;insandthencommitthe果 了!Git告訴我們,readme.txt文件存 ,必須手動(dòng)解 后再提交也可以告訴我 的文件$$git#Onbranch#Yourbranchisaheadof'origin/master'by2##Unmerged##(use"gitadd/rm<file>..."asappropriatetomarkbothnochangesaddedtocommit(use"gitadd"and/or"gitcommit-我們可以直接查看readme.txt的內(nèi)容Gitisadistributedversioncontrolsystem.GitisGitisadistributedversioncontrolsystem.GitissoftwaredistributedundertheGPL.Githasamutableindexcalledstage.Gittrackschangesof<<<<<<<CreatingCreatinganewbranchisquick&CreatinganewbranchisquickAND>>>>>>> 用<<<<<<<,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容,我 后保存CreatingCreatinganewbranchisquickand再提交$$gitadd$gitcommit-m [master 現(xiàn)在,master分支和feature1分支變成了下圖所用帶參也可以看到分支的合并情況$$gitlog--graph-- |*75a857cAND*|400b400&fec145abranch現(xiàn)在,刪除feature1分支$$gitbranch-dDeletedbranchfeature1(was工作完成當(dāng) 無法自動(dòng)合并分支時(shí),就必須首先解決。解決后,再提交,合并完成命令可以看到分支合并圖。如果要強(qiáng)制禁用“Fastforward”模式,Git就會在merge時(shí)生成一個(gè)新的commit,$gitcheckout-bdevSwitchedtoanewbranch'dev' $gitcheckout-bdevSwitchedtoanewbranch'dev'修改readme.txt文件,并提交一個(gè)新的$$gitadd$gitcommit-m"addmerge" ]addmerge1filechanged,1現(xiàn)在,我們切換回$gitcheckoutmasterSwitched$gitcheckoutmasterSwitchedtobranch'master'準(zhǔn)備合并dev分支,請注意參數(shù),表示禁用“Fast$$gitmerge--no-ff-m"mergewithno-ff"devMergemadebythe'recursivestrategy.readme.txt 11filechanged,1$$gitlog--graph--7825a50mergewithno-*| add可以看到,不使用 forward”模式,merge后就像這樣在實(shí)際開發(fā)中,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理首先 分支應(yīng)該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本,平時(shí)不能在上面活那在哪干活呢?干活都在dev分支上,也就是說,dev分支是不穩(wěn)定的,到某個(gè)時(shí)候,1.0devmastermaster1.0你和你的小伙伴們每個(gè)人都在 分支上干活,每個(gè)人都有自己的分支,時(shí)不時(shí)地dev分支上合并就可以所以,團(tuán)隊(duì)合作的分支看起來就像這 分支十分強(qiáng)大,在團(tuán)隊(duì)開發(fā)中應(yīng)該充分應(yīng)用aa軟件開發(fā)中,bugbugGit中,由于分支是如此的強(qiáng)大,所以,每個(gè)bug都可以通過一個(gè)新的臨時(shí)分支來修復(fù),修復(fù)后,合并分支,當(dāng)你接到一個(gè)修復(fù)一個(gè)代號101的bug的任務(wù)時(shí),很自然地,你想創(chuàng)建一個(gè)分支-101來修復(fù)它,但是,等等,當(dāng)前正在dev上進(jìn)行的工作還沒有提交$$git#Onbranch#Changestobe##(use"gitresetHEAD<file>..."tonew#Changesnotstagedfor##(use"gitadd<file>..."toupdatewhatwillbe(use"gitcheckout--<file>..."todiscardchangesinworking并不是你不想提交,而是工作只進(jìn)行到一半,還沒法提交,預(yù)計(jì)完成還需1天時(shí)間。但是,必須在兩個(gè)小時(shí)內(nèi)修復(fù)bug,怎么辦?幸好,Git還提供了一個(gè)stash功能,可以把當(dāng)前工作現(xiàn)場“儲藏”起來,等以后恢復(fù)現(xiàn)場$$gitSavedworkingdirectoryandindexstateWIPonaddHEADisnow add現(xiàn)在,用a查看工作區(qū),就是干凈的(除非有沒有被Git 此可以放心地創(chuàng)建分支來修復(fù)bug。首先確定要在哪個(gè)分支上修復(fù)bug,假定需要在master分支上修復(fù),就從創(chuàng)建臨時(shí)分支$gitcheckoutmasterSwitched$gitcheckoutmasterSwitchedtobranch'master'Yourbranchisaheadof'origin/masterby6$gitcheckout-bissue-Switchedtoanewbranch'issue-現(xiàn)在修復(fù)bug,需要把“Gitissoftware...”改為“Gitisasoftware...”,$$gitadd$gitcommit-m"fixbug[issue-101cc17032]fixbug1filechanged,1insertion(+),1deletion(-修復(fù)完成后,切換到master分支,并完成合并,最后刪除issue-101分支$gitcheckoutmasterSwitched$gitcheckoutmasterSwitchedtobranch'master'Yourbranchisaheadof'origin/masterby2$gitmerge--no-ff-m"mergedbugfix101"issue-Mergemadebythe'recursivestrategy.readme.txt| 2+-1filechanged,1insertion(+),1deletion(-$gitbranch-dissue-Deletedbranchissue-101(was太棒了,原計(jì)劃兩個(gè)小時(shí)的bug修復(fù)只花了5分鐘!現(xiàn)在,是時(shí)候接著回到dev分支$gitcheckoutdevSwitched$gitcheckoutdevSwitchedtobranch'dev'$git#Onbranchnothingtocommit(workingdirectory命令看$$gitstashstash@{0}:WIPonadd工作現(xiàn)場還在,Git把stash內(nèi)容存在某個(gè)地方了,但是需要恢復(fù)一下,有兩個(gè)辦法 $$gitstash#Onbranch#Changestobe#(use"gitresetHEAD<file>..."tounstage)##newfile:#Changesnotstagedfor#(use"gitadd<file>..."toupdatewhatwillbe(use"gitcheckout--<file>..."todiscardchangesinworkingmodified:Droppedrefs/stash@{0}ast查看,就看不到任何stash內(nèi)容了$$gitstash用命令$$gitstashapply修復(fù)bug時(shí),我們會通過創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并,最后當(dāng)手頭工作沒有完成時(shí),先把工作現(xiàn)一下,然后去修 ,回到工作現(xiàn)場軟件開發(fā)中,總有無窮無盡的新的功能要不斷添加進(jìn)添加一個(gè)新功能時(shí),你肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼,把主分支了,所以,每添加一個(gè)新功能,最好新建一個(gè)fatue分支,在上面開發(fā),完成后,合并,最后,刪除該eatue分支。Vulcan的新功能,該功能計(jì)劃用于下一代于是準(zhǔn)備開發(fā)$gitcheckout-bfeature-vulcanSwitched$gitcheckout-bfeature-vulcanSwitchedtoanewbranch'feature-vulcan'5$$gitadd$git#Onbranchfeature-vulcan#Changestobecommitted:##(use"gitresetHEAD<file>..."tonew$gitcommit-m"addfeature[feature-vulcan756d4af]addfeaturevulcan1filechanged,2insertions(+)createmode100644切回dev,準(zhǔn)備合并$$gitcheckout一切順利的話,feature分支和bug分支是類似的,合并,然后刪除。但就在此時(shí),接到上級命令,因經(jīng)費(fèi)不足,新功能必須取消雖然白干了,但是這個(gè)分支還是必須就地銷毀$$gitbranch-dfeature-error:Thebranch'feature-vulcan'isnotfullyIfyouaresureyouwanttodeleteit,run'gitbranch-Dfeature-銷毀失敗。 友情提醒,feature- 分支還沒有被合并,如果刪除,將丟失現(xiàn)在我們強(qiáng)行$$gitbranch-Dfeature-Deletedbranchfeature-vulcan(was終于刪除成功開發(fā)一個(gè)新feature,最好新建一個(gè)分支如果要丟棄一個(gè)沒有被合并過的分支,可以通強(qiáng)行刪除當(dāng)你從倉庫克隆時(shí),實(shí)際上Git自動(dòng)把本地的master分支和的master分支對應(yīng)起來了,并且,倉庫的默認(rèn)名稱是origin。要查 庫的信息,$$gitremote$$gitremote- :michaelliao/learngit.gitoriginpush的推送分支,就是把該分支上的所有本地提交推送到庫。推送時(shí),要指定本地分支,這樣,Git就會把該分支推送到庫對應(yīng)的分支上:$$gitpushorigin如果要推送其他分支,比如dev,就改成$gitpushorigin $gitpushorigin 分支是主分支,因此要時(shí)刻與同步 分支是開發(fā)分支,團(tuán)隊(duì)所有成員都需要在上面工作,所以也需要與同步 分支是否推到,取決于你是否和你的小伙伴合作在上面開發(fā)總之,就是在 中,分支完全可以在本地自己藏著玩,是否推送,視你的心情而定多人協(xié)作時(shí),大家都會往master和dev分支上推送各自的修改現(xiàn)在,模擬一個(gè)你的小伙伴,可以在另一臺電腦(注意要把SSHKey添加到) $$gitCloningintoremote:Countingobjects:46,remote:Compressingobjects:100%(26/26),done.remote:Total46(delta16),reused45(delta15)Receivingobjects:100%(46/46),15.69KiB|6KiB/s,done.Resolvingdeltas:100%(16/16),done.命令看看

當(dāng)你的小伙伴從庫clone時(shí),默認(rèn)情況下,你的小伙伴只能看到本地的$$git*現(xiàn)在,你的小伙伴要在dev分支上開發(fā),就必須創(chuàng)建origin的dev分支到本地dev$$gitcheckout-bdev現(xiàn)在,他就可以在dev上繼續(xù)修改,然后,時(shí)不時(shí)地把dev分支push到$$gitcommit-m"add/usr/bin/env"[dev291bea8]add/usr/bin/env1filechanged,1$gitpushoriginCountingobjects:5,Deltacompressionusingupto4threads.Compressingobjects:100%(2/2),done.Writingobjects:100%(3/3),349bytes,done.Total3(delta0),reused0(delta0) fc38031..291bea8dev->devorigin/dev分支推送了他的提交,而碰巧你也對同樣的文件作了修$$git $gitcommit-m"addcoding:utf-[devbd6ae48]addcoding:utf-1filechanged,1$gitpushorigin ! dev->dev(non-fast-error:failedtopushsomerefsto hint:Updateswererejectedbecausethetipofyourcurrentbranchisbehindhint:itsremotecounterpart.Mergetheremotechanges(e.g.'gitpull')hint:beforepushinghint:Seethe'Noteaboutfast-forwards'in'gitpush--helpfor推送失敗,因?yàn)槟愕男』锇?提交和你試圖推送的提交 已經(jīng)提示我們,先 的提交從 抓下來,然后,在本地合并,解$$gitremote:Countingobjects:5,remote

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論