Git和GitHub教程資料大全_第1頁
Git和GitHub教程資料大全_第2頁
Git和GitHub教程資料大全_第3頁
Git和GitHub教程資料大全_第4頁
Git和GitHub教程資料大全_第5頁
已閱讀5頁,還剩115頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

目金象

序言1.1

第1章Git簡介1.2

1.1Git的誕生1.2.1

1.2集中式vs分布式1.2.2

第2章安裝Git1.3

第3章創(chuàng)建版本庫1.4

第4章時光機穿梭1.5

4.1版本回退1.5.1

4.2工作區(qū)和暫存區(qū)1.5.2

4.3管理修改1.5.3

4.4撤銷修改1.5.4

4.5刪除文件1.5.5

笫5章遠程倉庫1.6

5.1添加遠程倉庫1.6.1

5.2從遠程倉庫克隆1.6.2

第6章分支管理1.7

6.1創(chuàng)建與合并分支1.7.1

6.2解決沖突1.7.2

6.3分支管理策略1.7.3

6.4Bug分支1.7.4

6.5Feature分支1.7.5

6.6多人協(xié)作1.7.6

第7章標簽管理1.8

7.1創(chuàng)建標簽1.8.1

7.2操作標簽1.8.2

第8章使用GitHub1.9

第9章自定義Git1.10

9.1忽略特殊文件1.10.1

9.2配置別名1.10.2

9.3搭建Git服務曙1.10.3

第10章期末總結1.11

第11章從0開始學習GitHub1.12

01.初識GitHub1.12.1

02.加入GitHub1.12.2

O3.Git速成1.12.3

04.向GitHub提交代碼1.12.4

O5.Git進階1.12.5

1

06.團隊合作利器Branch1.12.6

O7.GitHub常見的幾種操作1.12.7

08.如何發(fā)現(xiàn)優(yōu)秀的開源項B1.12.8

使用GITFLOW管理開發(fā)流程1.12.9

2016lop10AndroidLibrary1.12.10

GH?常用命令備忘1.12.11

2016年最受歡迎的編程語言是什么?1.12.12

2

史卜.最淺顯易懂的Git教程!

為什么要編寫這個教程?因為我在學習Git的過程中,買過書,也在網(wǎng)上Google了一堆Git相關的文章和教程,但令人失

望的是,這些教程不是難得令人發(fā)指,就是簡單得一筆帶過,或者,只支離破碎地介紹Git的某幾個命令,還有直接從

Gt手冊粘貼幫助文檔的,總之,初學者很難找到一個由淺入深,學完后能立刻上手的Git教程。

既然號稱史上最淺顯易懂的Git教程,那這個教程有什么讓你怦然心動的恃點呢?

首先,本教程絕對面向初學者,沒有接觸過版本控制概念的讀者也可以輕松入門,不必擔心起步難度:

其次,本教程實用性超強,邊學邊練,一點也不覺得枯燥。而且,你所學的Git命令是“充分且必要”的,掌握了這些東

西,你就可以通過Git輕松地完成你的工作。

文字+圖片還看不明白?有視頻!?。?/p>

本教程只會讓你成為Git用戶,不會讓你成為Git專家。很多Git命令只有那些專家才明白(事實上我也不明白,因為我不

是Git專家),但我保證這些命令可能你?輩子都不會用到。既然Git是?個工具,就沒必要把時間浪費在那些“高級”但幾

乎永遠不會用到的命令上。一旦你真的非用不可了,到時候再自行Google或者請教專家也未遲。

如果你是一個開發(fā)人員,想用上這個世界上目前最先進的分布式版本控制系統(tǒng),那么,趕快開始學習吧!

關于作者

Gt教程原文-廖雪峰的官方網(wǎng)站

廖雪峰,十年軟件開發(fā)經(jīng)驗,業(yè)余產(chǎn)品經(jīng)理,精通Java/Python/Ruby/VisualBasic/ObjectiwC等,對?開源框架有深入研

究,著有《Spring2。核心技術與最佳實踐》一書,多個業(yè)余開源項目托管在GitHub

更多Git教程

?ProGit中文版

?ProGit第二版簡體中文

?從0開始學習GitHub

?github-cheat-sheetGitHub秘籍

Github托管主頁

/JackChen1999/Git-Course請讀者點擊Star進行關注并支持!

在線閱讀

3

https://alleniverson.gitbooks.io/gitcourse/content/

課程結構

?序言

?第1章Git簡介

。1.1Git的誕生

。1.2集中式vs分布式

?■章創(chuàng)建版本庫

?第3章安裝Git

?第4章時光機穿梭

。4.1版本回退

。4.2工作區(qū)和暫存區(qū)

。4.3管理修改

。4.4撤銷修改

。4.5刪除文件

?第5堂遠程倉庫

。5.1添加遠程倉庫

。5.2從遠片法瓦克降

?第6章分文管理

。6.1創(chuàng)建與合并分支

。6.2解決沖突

。6.3分支管理策略

。6.4Bug分支

。6.5Feature分支

。6.6多人協(xié)作

?第7章標簽管理

。7.1創(chuàng)建標簽

。7.2操作標簽

?第8堂使用GitHub

?第9章自定義Git

。9.1忽略特殊文件

。9.2配置別名

。9.3搭建Git服務器

?第10章期末總結

?第11章從。開始學習GitHub

。01.初識GitHub

O02.加入GitHub

O03Git速成

。04.向GitHub提交代碼

oO5.Git進階

。06.團隊合作利器Branch

。O7.GitHub常見的幾種操作

。08.如何發(fā)現(xiàn)優(yōu)秀的開源項目

。使用GITFLOW管理開發(fā)

。2016lop10AndroidLibrary

OGIT常用命令備忘

。2016年最受歡迎的編程語占是什么?

4

第1章Git簡介

Gt是什么?

Gt是目前世界上最先進的分布式版本控制系統(tǒng)(沒有之一)。

Gt有什么特點?簡單來說就是:高端大氣上檔次!

那什么是版本控制系統(tǒng)?

如果你用MicrosoftWord寫過長篇大論,那你一定有這樣的經(jīng)歷:

想刪除一個段落,又怕將來想恢復找不回來怎么辦?有辦法,先把當前文件“另存為……”一個新的Word文件,再接著

改,改到一定程度,再“另存為……”一個新文件,這樣一直改下去,最后你的Word文檔變成了這樣:

文檔庫

work

readme.dreadme-readme-

OC副本.doc0712.doc

readme-

0709.doc

readme-readme

修改.doc副本

(2).doc

過了?周,你想找回被刪除的文字,但是已經(jīng)記不清刪除前保存在哪個文件里r,只好?個一個文件去找,真麻煩。

看著一堆亂七八糟的文件,想保留最新的一個,然后把其他的刪掉,又怕哪天會用上,還不敢刪,真郁悶。

更要命的是,有些部分需要你的財務同事幫助填寫,于是你把文件Copy^U盤里給她(也可能通過Email發(fā)送一份給

她),然后,你繼續(xù)修改Word文件。一天后,同事再把Word文件傳給你,此時,你必須想想,發(fā)給她之后到你收到她

的文件期間,你作了哪些改動,得把你的改動和她的部分合并,真困難。

于是你想,如果有一個軟件,不但能自動幫我記錄每次文件的改動,還可以讓同事協(xié)作編輯,這樣就不用自己管理一堆

類似的文件了,也不需要把文件傳來傳去。如果想查看某次改動,只需要在軟件里瞄一眼就可以,自不是很方便?

這個軟件用起來就應該像這個樣子,能記錄每次文件的改動:

版本用戶說明日期

1張三刪除了軟件服務條款57/1210:38

2張三增加了License人數(shù)限制7/1218:09

3李四財務部門調(diào)整了合同金額7/139:51

4張三延長了免費升級周期7/1415:17

這樣,你就結束了手動管理多個“版本”的史前時代,進入到版本控制的20世紀。

5

1.1Git的誕生

很多人都知道,Linus在1991年創(chuàng)建了開源的Linux,從此,Linux系統(tǒng)不斷發(fā)展,已經(jīng)成為最大的服務器系統(tǒng)軟件了。

Linus雖然創(chuàng)建了Linux,但Linuxf向壯大是塞全世界熱心的志愿者參與的,這么多人在世界各地為Linu通寫代碼,那

Linux的代碼是如何管理的呢?

事實是,在2002年以前,世界各地的志愿者把源代碼文件通過diff的方式發(fā)給Linus,然后山Linus本人通過手工方式合

并代碼!

你也許會想,為什么Linus不把Linux代碼放到版本控制系統(tǒng)里呢?不是有CVS、SVN這些免費的版本控制系統(tǒng)嗎?因為

Linus堅定地反對CVS和SVN,這些賣中式的版本控制系統(tǒng)不但速度慢,而且必須聯(lián)網(wǎng)才能使用。有一些商用的版本控

制系統(tǒng),雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。

不過,到了2002年,Linux系統(tǒng)已經(jīng)發(fā)展了十年了,代碼庫之大讓Linus很難繼續(xù)通過手工方式管理了,社區(qū)的弟兄們也

這這種方式表達了強烈不滿,于是Linus選擇了一個商業(yè)的版本控制系統(tǒng)BitKeeper,BitKeeper的東家BitMover公司出

于人道主義精神,授權Linu砒區(qū)免費使用這個版本控制系統(tǒng)。

安定團結的大好局面在2005年就被打破了,原因是Linux社區(qū)牛人聚集,不免沾染了一些梁山好漢的江湖習氣。開發(fā)

Samba的Andrew試圖破解BitKeeper的協(xié)議(這么干的其實也不只他一個),被BitMover公司發(fā)現(xiàn)了(監(jiān)控工作做得不

錯?。谑荁itMover公司怒了,要收回Linuxtt區(qū)的免費使用權。

Linus可以向BitMover公司道個歉,保證以后嚴格管教弟兄們,嗯,這是不可能的。實際情況是這樣的:

Linus花了兩周時間自己用C寫了一個分布式版本控制系統(tǒng),這就是Git!一個月之內(nèi),Linux系統(tǒng)的源碼已經(jīng)由Git管理

了!牛是怎么定義的呢?大家可以體會一下。

G處速成為最流行的分布式版本控制系統(tǒng),尤其是2008年,GitHub網(wǎng)站上線了,它為開源項目免費提供Git存儲,無數(shù)

開源項目開始遷移至GitHub.包括jCuery,PHP,Rub泮等。

妨史就是這么偶然,如果不是當年BitMover公司威脅Linux社區(qū),可能現(xiàn)在我們就沒有免費而超級好用的Git了。

6

1.2集中式vs分布式

Linus一直痛恨的CVS及SVN都是集中式的版本控制系統(tǒng),而Git是分布式版本控制系統(tǒng),集中式和分布式版本控制系統(tǒng)

有什么區(qū)別呢?

先說集中式版本控制系統(tǒng),版本庫站集中存放在中央服務器的,而干活的時候,用的都是自己的電腦,所以要先從中央

服務器取得最新的版本,然后開始干活,干完活了,再把自己的活推送給中央服務器。中央服務器就好比是一個圖書

館,你要改一本書,必須先從圖書館借出來,然后回到家自己改,改完了,再放回圖書館。

集中式版本控制系統(tǒng)最大的毛病就是必須聯(lián)網(wǎng)才能工作,如果在局域網(wǎng)內(nèi)還好,帶寬夠大,速度夠快,可如果在互聯(lián)網(wǎng)

上,遇到網(wǎng)速慢的話,可能提交一個10M的文件就需要5分鐘,這還不得把人給憋死啊。

那分布式版本控制系統(tǒng)與集中式版本控制系統(tǒng)有何不同呢?首先,分布式版本控制系統(tǒng)根本沒有“中央服務器",每個人

的電腦上都是一個完整的版本庫,這樣,你工作的時候,就不需要聯(lián)網(wǎng)了,因為版本庫就在你自己的電腦上。既然每個

人電腦上都有一個完整的版本庫,那多個人如何協(xié)作呢?比方說你在自己電腦上改了文件A,你的同事也在他的電腦上

改了文件A,這時'你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。

和集中式版本控制系統(tǒng)相比,分布式版本控制系統(tǒng)的安全性要高很多,因為每個人電腦里都有完整的版本庫,某一個人

的電腦壞掉了不要緊,隨便從其他人那里夏制一個就可以了。而集中式版本控制系統(tǒng)的中央服務器要是出了問題,所有

人都沒法干活了。

在實際使用分布式版本控制系統(tǒng)的時候,其實很少在兩人之間的電腦上推送版本庫的修改,因為可能你們倆不在一個局

域網(wǎng)內(nèi),兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。因此,分布式版本控制系統(tǒng)通常

也有一臺充當"中央服務器”的電腦,自這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活?,只

是交換修改不方便而已。

7

當然,Git的優(yōu)勢不單是不必聯(lián)網(wǎng)這么簡單,后面我們還會看到Git極其強大的分支管理,把SVN等遠遠拋在了后面。

CVS作為最早的開源而且免費的集中式版本控制系統(tǒng),直到現(xiàn)在還有不少人在用。由于CVS自身設計的問題,會造成提

交文件不完整,版本庫莫名其妙損壞的情況。同樣是開源而且免費的SVN修正了CVS的一些穩(wěn)定性問題,是目前用得最

多的集中式版本庫控制系統(tǒng)。

除了免費的外,還有收費的集中式版本控制系統(tǒng),比如IBM的ClearCase(以前是Rational公司的,被舊M收購了),特

點是安裝比Windows還大,運行比蛾牛還慢.能用CgarCasa的一般是世界500強.他們有個共同的特點是財大氣粗.

或者人傻錢多。

微軟自己也有一個集中式版本控制系統(tǒng)叫VSS,集成在VisualStudio中。由于其反人類的設計,連微軟自己都不好意思

用了。

分布式版本控制系統(tǒng)除了Git以及促使Git誕生的BitKeeper外,還有類似Git的Mercurial和Bazaar等。這些分布式版本控

制系統(tǒng)各有特點,但最快、最簡單也最流行的依然是Git!

8

第2章安裝Git

最早Git是在口的迂開發(fā)的,很長一段時間內(nèi),Git也只能在Linux和Uni端統(tǒng)上跑。不過,慢慢地有人把它移植到了

Windows上?,F(xiàn)在,Git可以在Linux、Unix、Mac和Windows這兒大平臺上正常運行了。

要使用Git,第一步當然走安裝GitT。根據(jù)你當前使用的平臺來閱讀下面的文字:

在Linux上安裝Git

首先,你可以試著輸入git,看看系統(tǒng)有沒有安裝Git:

$git

Theprogram*git*iscurrentlynotinstalled.Youcaninstallitbytyping:

sudoapt-getinstallgit

像上面的命令,有很多Linux會友好地告訴你Git沒有安裝,還會告訴你如何安裝Git。

如果你碰巧用Debian或UbuntuLinux,通過?條sudoapt-getinstallgit就可以直接完成Git的安裝,非常簡單。

video:http://michaelliao.gitcafe.io/ddeo/git-apt-install.mp4

老一點的Debian或UbuntuLinux,要把命令改為sudoapt-getinstallgit-core,因為以前有個軟件也叫GIT(GNU

InteractiveTools),結果Git就只能叫git-core由于Git名氣實在太大,后來就把GNUInteractiveIdols改成gnuit,

ga-core正式改為git。

如果是其他Linu城本,可以直接通過源碼安裝。先從Git官網(wǎng)下載源碼,然后解壓,依次輸入:./config,make,sudo

makeinstall這兒個命令安裝就好了。

在MacOSX上安裝Git

如果你正在使用Mac做開發(fā),有兩種安裝Git的方法。

一是安裝homebrew,然后通過homebrew安裝Git,具體方法請參考homebrew的文檔:http://brew.sh/

第二種方法更簡單,也是推薦的方法,就是直接從AppStore安裝Xcode,Xcode集成了Git.不過默認沒有安裝,你需要

運行Xcode,選擇菜單“Xcode"->"Preferences",在彈出窗口中找到"Downloads",選擇"CommandLineBols”,

點“Install”就可以完成安裝了。

9

A

FeatsArC^orsTent

Oocum?M4tion

CheckforandinstallupdatesiSocuUcalyChecksdln$uUNow

Xcode是Apple官方IDE,功能非常強大,是開發(fā)Mac和iOSApp的必選裝備,而且是免獨的!

在Windows上安裝Git

實話實說,Windows是最爛的開發(fā)平臺,如果不是開發(fā)Windows游戲或者在IE里調(diào)試頁面,一般不推薦用Windows.

不過,既然已經(jīng)上了微軟的賊船,也是有辦法安裝Git的。

Windows下要使用很多Linux/Unix的工具時,需要Cygwin這樣的模擬環(huán)境,Git也一樣。Cygwin的安裝和配置都比較其

雜,就不建議你折騰了。不過,有高人已經(jīng)把模擬環(huán)境和Git都打包好了.名叫msysgit,只需要下載個單獨的exe安

裝程序,其他什么也不用裝,絕對好用。

msysgit是Windows版的Git,從https://git-for-windows.github.i。卜載(網(wǎng)速慢的同學山國內(nèi)鏡像),然后按默認選

項安裝即可。

安裝完成后,在開始菜單里找到“Gi->"GitBash”,蹦出?個類似命令行窗口的東西,就說明Git安裝成功!

安裝完成后,還需要最后一步設置,在命令行輸入:

3gitconfig--global"You、Name”

$gitconfig--globaluser.email"email^example.com"

10

因為Git是分布式版本控制系統(tǒng),所以,,每個機器都必須自報家門:你的名字和Email地址。你也許會擔心,如果有人故

意冒充別人怎么辦?這個不必擔心,首先我們相信大家都是善良無知的群眾,其次,真的有冒充的也是有辦法可查的。

注意gitconfig命令的-global參數(shù),月了這個參數(shù),表示你這臺機器上所有的Git倉庫都會使用這個配置.,當然也可以對

某個倉庫指定不同的用戶名和Email地址。

11

第3章創(chuàng)建版本庫

什么是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄里面的所有文件都可以

被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還

原工

所以,創(chuàng)建一個版本庫非常簡單,首先,選擇一個合適的地方,創(chuàng)建一個空目錄:

$mkdirlearngit

$cdlearngit

$pwd

/Users/michael/learngit

pwd命令用于顯示當前目錄。在我的Mac上,這個倉庫位于/Users/michael/leamgit。

如果你使用Windows系統(tǒng),為了避免遇到各種莫名其妙的問題,請確保目錄名(包括父目錄)不包含中文。

笫二步,通過gitinit命令把這個目錄變成Git可以管理的倉庫:

$gitinit

InitializedemptyGitrepositoryin/Users/michael/learngit/.git/

瞪間Git就把倉庫建好了,而且告訴你是一個空的倉庫(emptyGitrepository),細心的讀者可以發(fā)現(xiàn)當前目錄下多了一

個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄里面的文件,不然改亂了,就把Git

倉庫給破壞了。

如果你沒有看到.git目錄,那是因為這個目錄默認是隱藏的,用Is-ah命令就可以看見。

video:http://michaelliao.gitcafe.io/\ideo/git-init.mp4

也不一定必須在空目錄下創(chuàng)建Git倉庫,選擇一個已經(jīng)有東西的目錄也是可以的。不過,不建議你使用自己正在開發(fā)的公

司項目來學習Git,否則造成的一切后果概不負責。

把文件添加到版本庫

首先這里再明確一下,所有的版本控制系統(tǒng),其實只能跟蹤文本文件的改動,比如TXT文件,網(wǎng)頁,所有的程序代碼等

等,Git也不例外。版本控制系統(tǒng)可以告訴你每次的改動,比如在第5行加了一個單詞“Linux1',在第8行刪了一個單

詞"Windows”。而圖片、視頻這些二進制文件,雖然也能由版本控制系統(tǒng)管理,但沒法跟蹤文件的變化,只能把二進制

文件每次改動串起來,也就是只知道圖片從100KB改成了120KB,但到底改了啥,版本控制系統(tǒng)不知道,也沒法知道。

不幸的是,Mcrosoft的Word格式是二進制格式,因此,版本控制系統(tǒng)是沒法跟蹤Word文件的改動的,前面我們舉的例

子只是為了演示,如果要真正使用版本控制系統(tǒng),就要以純文本方式編寫文件。

因為文本是有編碼的,比如中文有常用的GBK編碼,口文有Shift_JIS編瑪,如果沒有歷史遺留問題,強烈建議使用標準

的UTF-8編碼,所有語言使用同一種編碼,既沒有沖突,又被所有平臺所支持。

使用Windows的童鞋要特別注意:

千萬不要使用Windows自帶的記事本編輯任何文本文件。原因是Microsoft開發(fā)記事本的團隊使用<?個非常弱智的行為

來保存UTF-8編碼的文件,他們自作聰明地在每個文件開頭添加了Oxefbbbf(十六進制)的字符,你會遇到很多不可思

議的問題,比如,網(wǎng)頁第一行可能會顯示一個"?”,明明正確的程序一編譯就報語法錯誤,等等,都是由記導本的弱智行

為帶來的。建議你下載Notepad++代替記事本,不但功能強大,而且免費!記得把Notepad++的默認編碼設置為UTF-8

withoutBOM即可:

12

占歸正傳,現(xiàn)在我們編寫一個readme.txt文件,內(nèi)容如下:

Gitisaversioncontrolsystem.

Gitisfreesoftware.

定耍放到learngit目錄卜.(了目錄也行),因為這是個Git倉庫,放到其他地方"Git再厲害也找不到這個文件。

和把大象放到冰箱需要3步相比,把一個文件放到Git倉庫只需要兩步。

第?步,用命令gitadd告訴Git,把文件添加到倉庫:

$gitaddreadme.txt

執(zhí)行上面的命令,沒有任何顯示,這就對了,Unix的哲學是“沒有消息就是好消息”,說明添加成功。

笫二步,用命令gitcommit告訴Git,把文件提交到倉庫:

$gitcommit-m"wroteareadmefile"

[master(root-commit)cb926e7Jwroteareadmefile

1filechanged,2insertions(*)

createmode100644readme.txt

video:http7//sinaweibopyA^deo/add-and-commit.mp4

簡單解釋一下gitcommit命令,-m后面輸入的是本次提交的說明,可以輸入任意內(nèi)容,當然最好是有意義的,這樣你就

能從歷史記錄里方便地找到改動記錄。

嫌麻煩不想輸入-m"XXX1彳亍不行?確實有辦法可以這么干,但是強烈不建議你這么干,因為輸入說明對自己對別人閱讀

都很重要。實在不想輸入說明的童鞋請自行Google,我不告訴你這個參數(shù).

gitcommit命令執(zhí)行成功后會告訴你,1個文件被改動(我們新添加的readme.txt文件),插入了兩行內(nèi)容(readme.txt

有兩行內(nèi)容)。

為什么Git添加文件需要add,commit一共兩步呢?因為commit可以一次提交很多文件,所以你可以多次add不同的文

件,比如:

$gitaddfilel.txt

$gitaddfile2.txtfile3.txt

$gitcommit-m"add3files.*

13

小結

現(xiàn)在總結一下今天學的兩點內(nèi)容:

初始化一個Git倉庫,使用gitinit命令,

添加文件到Git倉庫,分兩步:

笫一步,使用命令gitadd<file>,注意,可反復多次使用,添加多個文件:

第二步,使用命令gitcommit,完成°

14

第4章時光穿梭機

我們已經(jīng)成功地添加并提交了一個readme.txt文件,現(xiàn)在,是時候繼續(xù)工作了,于是,我們繼續(xù)修改readme.txt文件,

改成如下內(nèi)容:

Gitisadistributedversioncontrolsystem.

Gitisfreesoftware.

現(xiàn)在,運行gitstatus命令看看結果:

$gitstatus

#Onbranchmaster

#Changesnotstagedforcommit:

#(use"gitadd<file>..toupdatewhatwillbecommitted)

#(use"gitcheckout--<file>???"todiscardchangesinworkingdirectory)

#modified:readme.txt

nochangesaddedtocommit(use"gitadd"and/or"gitcommit-aM)

gitstatus命令可以讓我們時刻掌握倉庫當前的狀態(tài),上面的命令告訴我們,readme.txt被修改過了,但還沒有準備提交

的修改。

雖然Git告訴我們readme.txt被修改了,但如果能看看具體修改了什么內(nèi)容,自然是很好的。比如你休假兩周從國外回

來,第一天上班時,已經(jīng)記不清上次怎么修改的readme.txt,所以,需要用gitdiff這個命令看看:

$gitdiffreadme.txt

diff--gita/readme.txtb/readme.txt

index46d49bf..9247db6166644

—a/readme.txt

++?b/readme.txt

能-1,2+1,2的

-GitIsaversioncontrolsystem.

+Gitisadistributedversioncontrolsystem.

Gitisfreesoftware.

gitdiff顧名思義就是查看difference,顯示的格式正是Uni疝i用的diff格式,可以從上面的命令輸出看到,我們在第?行

添加了一*個"distributed”單詞。

知道了對readme.txt作了什么修改后,再把它提交到倉庫就放心多了,提交修改和提交新文件是一樣的兩步,第一步是

gitadd:

$gitaddreadme.txt

同樣沒有任何輸出。在執(zhí)行第二步gitcommit之前,我們再運行gitstatus看看當前倉庫的狀態(tài):

$gitstatus

#Onbranchmaster

#Changestobecommitted:

#(use"gitresetHEAD<file>...**tounstage)

modified:readme.txt

gitstatus告訴我們,將要被提交的修改包括readme.txt,下一步,就可以放心地提交了:

15

$gitcommit-m"adddistributed*'

(masterea34578]adddistributed

1filechange%1insertion(+),1deletion(-)

提交后,我們再用gitstatus命令看看倉庫的當前狀態(tài):

$gitstatus

#Onbranchmaster

nothingtocommit(workingdirectoryclean)

Gt告訴我們當前沒有需要提交的修改,而且,工作目錄是干凈(workingdirectoryclean)的。

video:http://michaelliao.gitcafe.io/\ideo/git-diff-status.mp4

小結

要隨時掌握工作區(qū)的狀態(tài),使用gitstatus命令。

如果gitstatus告訴你有文件被修改過,用gitd肝可以查看修改內(nèi)容。

16

4.1版本回退

現(xiàn)在,你已經(jīng)學會了修改文件、然后把修改提交到Gi瓶本庫,現(xiàn)在,再凍習一次,修改readme.txt文件如h

Gitisadistributedversioncontrolsystem.

GitisfreesoftwaredistributedundertheGPL.

然后嘗試提交:

$gitaddreadme.txt

$gitcommit-m"appendGPL"

[master3628164]appendGPL

1filechanged,1insertion(+),1deletion(-)

像這樣,你不斷對文件進行修改,然后不斷提交修改到版本庫里,就好比玩RPG游戲時,每通過一關就會自動把游戲狀

態(tài)存盤,如果某一關沒過去,你還可以選擇讀取前一關的狀態(tài)。有些時候,在打Boss之前,你會手動存盤,以便萬一

打Boss失敗了,可以從最近的地方重新開始。Git也是一樣,每當你覺得文件修改到一定程度的時候,就可以“保存一個

快照:這個快照在Git中被稱為commit。?旦你把文件改亂了,或者誤刪了文件,還可以從最近的?個commit恢復,

然后繼續(xù)工作,而不是把幾個月的工作成果全部丟失。

現(xiàn)在,我們回顧一下readme.txt文件一共有幾個版本被提交到Git倉庫里了:

版本1:wroteareadmefile

Gitisaversioncontrolsystem.

Gitisfreesoftware.

版本2:adddistributed

Gitisadistributedversioncontrolsystem.

Gitisfreesoftwaie.

版本3:appendGPL

Gitisadistributedversioncontrolsystem.

GitisfreesoftwaredistributedundertheGPL.

當然了,在實際工作中,我們腦子里怎么可能記得一個幾千行的文件每次都改了什么內(nèi)容,不然要版本控制系統(tǒng)干什

么。版本控制系統(tǒng)肯定有某個命令可以告訴我們歷史記錄,在Git中,我們用gitlog命令查看:

$gitlog

commit3628164fb26d4839S383f8f31179f24e0882ele0

Author:MichaelLiaooskxuefen&>

Date:TueAug2015:11:492013+08W

appendGPL

commitea34578dS496d7dd233c827ed32a8:d576c5ee85

Author:MichaelLiao<>

Date:TueAug2014:53:122013+08相

adddistributed

commitcb92be/eab0adllb8t9ey09c?t>226J33bt/bb030

Author:MichaelLiao<>

17

Date:MonAug1917:51:552013+08相

wroteareadmefile

gitlog命令顯示從最近到最遠的提交日志,我們可以看到3次提交,最近的一次是appendGPL,上一次是add

distributed,最早的一次是wroteareadmefile。

如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上-pretty=oneline參數(shù):

$gitlog--pretty=oneline

3628164fb26d48395383f8f31179f24e0882ale0appendGPL

ea34578d5496d7dd233c827ed32a8cd576cse85adddistributed

Cb926e7ea50adllb8f9e909c05226233bf755030wroteareadmefile

需要友情提示的是,你看到的一大串類似3628164...882e1eO的是commitid(版本號),和SVN不一樣,Git的commit

id不是1,2,3……遞增的數(shù)字,而是一個SHA1計尊出來的一個非常大的數(shù)字,用十六進制表示,而且你看到的

commitid和我的肯定不一樣,以你自己的為準。為什么commitid需要用這么一大串數(shù)字表示呢?因為Git是分布式的版

本控制系統(tǒng),后面我們還要研究多人在同一個版本庫里工作,如果大家都用1,2,3……作為版本號,那肯定就沖突

了。

每提交一個新版本,實際上Git就會把它們自動串成一條時間線。如果使用可視化工具查看Git歷史,就可以更清楚地看

到提交歷史的時間線:

0noCjl?arngit(Cit)

HLESTATUSC3R

yWodcinGraphDe$<np<ion匚0mm殖Author

QDappendCPt362S164MichaelUao<askxAug20.20

BRANCHES

0adddistributedMichaelLIM<a$kxu.Aug20.

4master

wrotearzmehke9H<7Michac*LiM<askxu.

TAGS

RiMOTES

STASHES

7FUenafnePath

00rnarterQClew

好了,現(xiàn)在我們啟動時光穿梭機,準備把readme.txt回退到上一個版本,也就是“adddistributed”的那個版K,怎么做

呢?

首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交3628164...832e1e0(注

意我的提交ID和你的肯定不一樣),上一個版本就是HEADA上上一個版本就是HEADM,當然往上100個版本寫100個

人比較容易數(shù)不過來,所以寫成HEADT00。

現(xiàn)在,我們要把當前版本“appendGPL啊退到上一個版本"adddistributed",就可以使用gitreset命令:

$gitreset--hardHEADA

HEADisnowatea3457gadddistributed

-iard參數(shù)有啥意義?這個后面再講,現(xiàn)在你先放心使用。

看看readme.txt的內(nèi)容是不是版本adddistributed:

$catreadme.txt

Gitisadistributedversioncontrolsystem.

Gitisfreesoftware.

果然。

還可以繼續(xù)回退到上?個版本wroteareadmefile,不過且慢,然我們用gitlog再看看現(xiàn)在版本庫的狀態(tài):

18

igitlog

commitea34578d5496d7dd233c827"32a8二d576c5ee85

Author:MichaelLiao<askxuefeng^gmail.com>

Date:TueAug2014:53:122013+08W

adddistributed

conrnitcb926e7eaS0adllb8f9e909c0S226233bf755030

Author:MichaelLiaooskxuefeng^gmail.com>

Date:MonAug1917:51:552013+08物

wroteareadmefile

最新的那個版本appendGPL已經(jīng)看不到了!好比你從21世紀坐時光穿梭機來到了19世紀,想再回去已經(jīng)回不去了,腫

么辦?

辦法其實還是有的,只要上面的命令行窗口還沒有被關掉,你就可以順著往上找啊找啊,找到那個appendGPL的

commitid是3628164…,于是就nJ■以指定回到未來的某個版本:

$gitreset--hard3628164

HEADisnowat3628164appendGPL

版本號沒必要寫全,前幾位就可以了,Git會自動去找。當然也不能只寫前一兩位,因為Git可能會找到多個版本號,就

無法確定是哪一個了。

再小心翼翼地看看readme.txt的內(nèi)容:

$catreadme.txt

Gitisadistributedversioncontrolsystem.

GitisfreesoftwaredistributedundertheGPL.

果然,我胡漢三又回來了。

Gt的版本回退速度非??欤驗镚it在內(nèi)部有個指向當前版本的HEAD指針,當你回退版本的時候,Git僅僅是把HEAD從

指向appendGPL:

appendGPL

adddistributed

Qwroteareadmefile

改為指向adddistributed:

IHEAD

appendGPL

adddistributed

wroteareadmefik?

19

然后順便把工作區(qū)的文件更新了。所以你讓HEAD指向哪個版本號,你就把當前版本定位在哪。

video:http://michaelliao.gitcafe.io/\ideo/git-reset.mp4

現(xiàn)在,你回退到了某個版本,關掉了電腦,第二天早上就后悔了,想恢復到新版本怎么辦?找不到新版本的commitid

怎么辦?

在Git中,總姥有后悔藥可以吃的。生你用$gitreset-hardHEADA回退到adddistributed版本時,再想恢復到append

GPL,就必須找到appendGPL的commitid。Git提供了一個命令gitreflog用來記錄你的每一次命令:

$gitreflog

ea34578HEAD@{0}:reset:movingtoH:ADA

3628164HEAD^{1}:commit:appendGPL

ea34578HEAD(a{2}:commit:adddistributed

cb926e7HEAD^{3}:commit(initial):wroteareadmefile

終于舒了口氣,第二行顯示appendGPL的8mmitid是3628164,現(xiàn)在,你乂可以乘坐時光機回到未來了。

video:http://michaelliao.gitcafe.io/^deo/git-reflog-reset.mp4

小結

現(xiàn)在總結一卜:

HEAD指向的版本就是當前版本,因比,Git允許我們在版本的歷史之間穿梭,使用命令gitreset--hardcommit_id。

穿梭前,用gitlog可以查看提交歷史,以便確定要回退到哪個版本。

要重返未來,用gitreflog查看命令歷史,以便確定要回到未來的哪個版本。

20

4.2工作區(qū)和暫存區(qū)

Gt和其他版本控制系統(tǒng)如SVN的一個不同之處就是有暫存區(qū)的概念。

先來看名詞解釋。

工作區(qū)(WorkingDirectory)

就是你在電腦里能看到的目錄,比如我的leamgit文件夾就是一個工作區(qū):

0OO口learngit

上]跑三皿畫〔需▼〕【吐jQ

FAVORITES

YAirDrop

肉Applications

EDesktopLICENSEreadme.txt

Documents

Downloads

Movies

Music

Pictures

版本庫(Repository)

工作區(qū)有一個隱藏目錄.git,這個不算工作區(qū),而是Git的版本庫。

Gt的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一

個分支master,以及指向master的一個指針叫HEAD,

21

-工作區(qū)一版本本

DHEAD

t后master

l目s

i后

commit喧

p

L-E

J-E

分支和HEAD的概念我們以后再講。

前面講了我們把文件往Gi瞅本庫里添加的時候,是分兩步執(zhí)行的:

第一步是用gitadd把文件添加進去,實際上就是把文件修改添加到暫存區(qū):

第二步是用gitcommit提交更改,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前分支。

溫馨提示

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

評論

0/150

提交評論