我寫(xiě)東西廢話向來(lái)很多,這次不扯東扯西,爭(zhēng)取20分鐘之內(nèi)進(jìn)入正題。
Just kidding.
今天來(lái)介紹一下Git和Github。本文必將有不少奇怪和模糊(但足夠初學(xué)者大致理解)的比喻以及極度口語(yǔ)化的文字,請(qǐng)慎重閱讀。
Git & Github:
Git是一個(gè)版本控制軟件。你在寫(xiě)代碼的時(shí)候想要測(cè)試一個(gè)新功能,卻并不想在已經(jīng)穩(wěn)定的版本上做實(shí)驗(yàn)(萬(wàn)一刪刪改改出了問(wèn)題,想要恢復(fù)到之上個(gè)版本怎么辦?),這時(shí)就需要版本控制,將當(dāng)前的代碼保護(hù)起來(lái),另起爐灶;如果測(cè)試結(jié)果不滿意,把不穩(wěn)定的爐灶全部推倒,還能滾回之前好用的版本。
你用git控制的文件和這些文件的修改記錄都是保存在本地的,為了多人協(xié)作/不把雞蛋放在一個(gè)籃子里,某位古神(應(yīng)該是Linus)創(chuàng)建了網(wǎng)站github。你可以用git在本地控制每個(gè)文件,記錄每一次增刪,然后把這些文件連同所有的修改記錄推送到github上。
好的,跟我重復(fù)重點(diǎn):
Git是本地的版本控制軟件,可以跟蹤文件的所有修改記錄;
Github是修改記錄和文件的在線保存地。
Github和多人協(xié)作:
張三等人一起用github開(kāi)發(fā)一個(gè)軟件,他們認(rèn)為該軟件主要有3個(gè)功能。
張三寫(xiě)好了功能1,測(cè)試穩(wěn)定了;
李四在張三的基礎(chǔ)上寫(xiě)好了功能2,測(cè)試穩(wěn)定了;
王五覺(jué)得自己能寫(xiě)出更高效的功能2,就從張三的版本上另起爐灶,寫(xiě)了功能2',測(cè)試穩(wěn)定了,三人討論后決定采用2'版本,于是王五把自己的功能2'推送回了主程序,成為主程序的一部分;
張三和李四也一起寫(xiě)好了功能3,和王五同步完成工作;
bad bad example, just for reference.
最簡(jiǎn)單的git指令以及工作流程
定義
- zelda.txt是我需要版本控制的文件
- 我的項(xiàng)目名稱(chēng)叫mario
往下看之前確認(rèn)你知道cd是什么意思。
另外強(qiáng)烈建議邊看教程邊動(dòng)手做一遍。
1. 創(chuàng)建repository
為了版本控制任何文件,你首先要?jiǎng)?chuàng)建一個(gè)修改記錄儲(chǔ)藏中心,又叫做repository。
這個(gè)中心可以
- 從無(wú)到有生成(如果你在寫(xiě)一個(gè)全新的項(xiàng)目)
或者
- 從別人已有的儲(chǔ)藏中心拷貝一份過(guò)來(lái)(如果你想接著別人的進(jìn)度繼續(xù)寫(xiě))
對(duì)于1,你又有兩種方法
a. cd到任意一個(gè)文件夾里,比如說(shuō)~/Desktop/,用git init mario
來(lái)創(chuàng)建新的repository。這步之后你會(huì)在桌面上看到一個(gè)叫做mario的文件夾,點(diǎn)進(jìn)去,把你的zelda.txt文件拷貝進(jìn)去,之后就可以在mario這個(gè)repository之中開(kāi)始版本控制啦。
b. 到github官網(wǎng),點(diǎn)擊一個(gè)綠色的按鍵(new repository),在新頁(yè)面中給新repository起名叫mario,確定;然后他會(huì)在新頁(yè)面中有一個(gè)地方讓你復(fù)制鏈接(非常類(lèi)似于https://github.com/chenxi-ge/mario.git
的一個(gè)鏈接);復(fù)制,cd到任意一個(gè)文件夾里,用git clone 剛才的鏈接
來(lái)把在線創(chuàng)建的repository聯(lián)動(dòng)到本地。
對(duì)于2,直接用git clone 別人的repository
就可以了。
好的,重復(fù)重點(diǎn):
本地生成,git init folder_name
在線拷貝下來(lái)(不管是自己的還是別人的),git clone repo_url
插一句,Github是可以免費(fèi)使用的。但免費(fèi)使用的代價(jià)是,你也要保持所有的代碼開(kāi)源:任何人都可以查看你的代碼,你也可以下載別人的代碼,程序員們?cè)诨ハ鄬W(xué)習(xí)中成長(zhǎng)。開(kāi)源是我非常欽佩和堅(jiān)持的精神——不然寫(xiě)啥教程啊。
當(dāng)然對(duì)于企業(yè)用戶(hù),每人每月7刀,可以創(chuàng)建私人repository用于公司項(xiàng)目,也挺好。
2. 管理文件
那么現(xiàn)在你有一個(gè)文件夾,叫mario,在本地;這個(gè)文件夾里有一個(gè)幽靈(.git)在監(jiān)視著所有你讓他監(jiān)視的文件;還有一個(gè)你剛剛拷貝進(jìn)去的zelda.txt。
現(xiàn)在這個(gè)zelda.txt是沒(méi)有被監(jiān)視的,幽靈也是有拖延癥的,不會(huì)主動(dòng)幫你干活的。
何以見(jiàn)得?用git status
查看當(dāng)前管理進(jìn)度。
git status
之后,你會(huì)看到zelda.py是在'Untracked Files'里面的,并且是紅色的。于是我們使用git add zelda.txt
,告訴git開(kāi)始監(jiān)視zelda.txt的每一行增刪(把這個(gè)文件add到監(jiān)視列表里)。
增加之后再用git status
,會(huì)發(fā)現(xiàn)文件進(jìn)入了'Changes to be committed'的列表里,并且名字前面顯示'new file'。
那么我們來(lái)談?wù)刢ommit。什么叫commit呢?就是告訴git:在這兒存?zhèn)€檔,記錄一下當(dāng)前文件和上一次commit的差異。這樣追根溯源,之后就能恢復(fù)每個(gè)文件每個(gè)版本。
我習(xí)慣在add新文件之后進(jìn)行一次commit。
git commit -a -m 備注內(nèi)容
是commit的常用方法,這里-a 是要求“記錄所有修改”,-m是提示后面緊跟著備注,而備注內(nèi)容當(dāng)然是人類(lèi)能看懂的語(yǔ)言,不好好寫(xiě)吊起來(lái)打。
在commit之后,再再再git status
一下,發(fā)現(xiàn)所有的改動(dòng)都已提交,無(wú)比清爽。
我猜這兒正經(jīng)教程要開(kāi)始講什么叫stage,不然沒(méi)法講清
git commit -a
的-a
是什么。然而這種會(huì)搞亂新手的東西我也不能說(shuō)完全能講清,想了解的請(qǐng)自己去看官方文檔。
這時(shí)我們手賤去改動(dòng)一下zelda.txt的內(nèi)容,然后git status
,會(huì)發(fā)現(xiàn)zelda.txt又變成了modified,并且是紅色狀態(tài)。很好,如果改動(dòng)是你需要的,就commit;如果是commit之后發(fā)現(xiàn)不需要的(比如十幾個(gè)commit后發(fā)現(xiàn)性能反而降低了),之后會(huì)講如何回滾。
在commit之前,如果你想了解一下你的改動(dòng),用git diff
可以做到這一點(diǎn)。但綠色代表什么,加減號(hào)又代表什么,請(qǐng)查閱文檔。
好的重復(fù)重點(diǎn),
git add
跟蹤文件
git status
查看當(dāng)前跟蹤進(jìn)度
git commit
存檔一下
3. 版本控制
最后光速講一下log
, reset
和push
然后我就去睡覺(jué)。
首先,之前吹了半天版本控制,到底怎么才能回滾到之前的一個(gè)穩(wěn)定可用版本呢?
首先是查看記錄,用git log
可以查看到歷史上所有的commit編號(hào)、commit的提交者和提交時(shí)間,還有當(dāng)時(shí)的備注。假設(shè)你在有一個(gè)穩(wěn)定可用版本時(shí)commit了一下,這條commit記錄會(huì)留在log上。
然后是回滾版本,用git reset --hard log編號(hào)
。所謂log編號(hào)是用git log
查看時(shí)在每個(gè)commit最頂端的一串30個(gè)字母左右的亂碼,在reset的時(shí)候只要輸入前六位就可以回滾版本。執(zhí)行完git reset
指令后,再次查看zelda.txt就會(huì)發(fā)現(xiàn)回到了那條特定的commit時(shí)的樣子。
新手不必在意git reset log編號(hào)
和有--hard
的版本不一樣,前者是回滾所有commit但不修改本地文件,后者是回滾所有commit并且修改本地文件。
最后就是git push
。之前所有的版本控制都是在本地的,如果想把本地的所有修改都推送到github上存儲(chǔ)怎么辦呢?git push origin master
,認(rèn)準(zhǔn)這一條。其中git push
很顯然是推送,origin master
是說(shuō)推送目標(biāo)是主分支,對(duì)于沒(méi)有開(kāi)其他分支的你——你要能讀到這兒,肯定是還沒(méi)用到啦——也是唯一選擇。
git push
的頻率當(dāng)然可以自己定,我習(xí)慣是每寫(xiě)好一個(gè)功能/最多15分鐘commit
一下,而每寫(xiě)完一個(gè)項(xiàng)目(比如說(shuō)一次作業(yè)),如果是連續(xù)的幾個(gè)小時(shí)寫(xiě)完就最后push一次,否則今天的份額寫(xiě)完了就push。
PS,如果忘記在寫(xiě)完項(xiàng)目之后做git push
,這個(gè)project就拿零分了。
重點(diǎn)?
git log
查看所有commit
git reset
回滾版本
git push
推送修改到Github——在線的數(shù)據(jù)中心
4. 坑
說(shuō)了是坑嘛,肯定不會(huì)填的。
這個(gè)教程最主要是面向新手,展示一個(gè)文件跟蹤的流程,用到的都是最基本的幾個(gè)指令:git init
, git clone
, git add
, git commit
, git log
, git push
, git reset
,讓人能跟蹤一個(gè)文件,不斷記錄修改,可以方便回滾,也可以提交到github,這些足夠啦。
度過(guò)了最開(kāi)始的confusion,任何一個(gè)官方文檔不比我說(shuō)的嚴(yán)謹(jǐn)標(biāo)準(zhǔn)一萬(wàn)倍么。
所以這一塊主要是說(shuō)一下還有哪些沒(méi)說(shuō)到的,留給讀者自行探索吧。
-
git merge
,git fetch
,git branch
分支控制 -
git stash
暫存修改 -
git pull
下載別人的修改