适合小白的大白话讲解---Git与Github的区别
本文由?伯樂(lè)在線?-?聽(tīng)風(fēng)?翻譯,艾凌風(fēng)?校稿。未經(jīng)許可,禁止轉(zhuǎn)載!
英文出處:Red Radger。歡迎加入翻譯組。
?
?
本文旨在使用通俗易懂的文字,講解版本控制背后的理論,以便你能對(duì)程序員們?nèi)绾喂ぷ饔袀€(gè)全局概念。本文不涉及代碼,不用下載啥東西,循序漸進(jìn),不關(guān)注繁復(fù)細(xì)節(jié),只有文字和一些不怎么漂亮的手繪涂鴉。
寫本文的動(dòng)機(jī)
學(xué)習(xí)任何東西都能在網(wǎng)絡(luò)上找到如此之多的指導(dǎo)教程,這一直令我驚訝不已。Git 和 Github 也不例外,網(wǎng)絡(luò)上有大量?jī)?yōu)秀資源,這些資源要么只對(duì)其中一個(gè),要么兼顧二者引導(dǎo)你開(kāi)始學(xué)習(xí)。以下是我特別喜歡的一些資源:
- Treehouse – 寫給設(shè)計(jì)師的 Git 入門介紹
- Roger Dudler – Git 簡(jiǎn)易教程
- Pluralsight – Github:初學(xué)者指南
然而,我發(fā)現(xiàn)這些教程總是跳過(guò)許多理論知識(shí),直接解釋如何通過(guò)命令行或 Github 桌面應(yīng)用程序使用 Git 。坦白說(shuō),如果你只是想知道你的開(kāi)發(fā)團(tuán)隊(duì)談?wù)摰牡降资鞘裁?#xff0c;這些指導(dǎo)教程也綽綽有余了。如上所述,我的目標(biāo)是對(duì)版本控制的整體概念進(jìn)行簡(jiǎn)明扼要地講解,同時(shí)希望能讓你了解到版本控制是如此酷。
讓我們從最基礎(chǔ)的開(kāi)始:版本控制
Image credit: weebletheringskite, WordPress
版本控制(Version control):學(xué)習(xí)它,愛(ài)上它,享受它。顧名思義,版本控制系統(tǒng)是任何能讓你了解到一個(gè)文件的歷史,以及它的發(fā)展過(guò)程的系統(tǒng)。之前作為平面設(shè)計(jì)師時(shí),我常常會(huì)遇到這種文件:
看起來(lái)眼熟?盡管上述系統(tǒng)不是一個(gè)好用的系統(tǒng) ,但它確實(shí)是一個(gè)版本控制系統(tǒng)。更復(fù)雜點(diǎn)的例子就像,Google 文檔的 “修訂歷史”或? Photoshop 的“歷史”工具。
?開(kāi)始 Git
Git?是一種專為處理文本文件而設(shè)計(jì)的版本控制系統(tǒng)。因?yàn)?#xff0c;歸根到底,這就是代碼的本質(zhì):一堆堆以某種方式聯(lián)合在一起的文本文件。Git 是一個(gè)可安裝應(yīng)用,它允許你對(duì)你自己所做的更改進(jìn)行注釋,用以創(chuàng)建易于導(dǎo)航的系統(tǒng)歷史。
(附: “Git” ?也是工程師取的名字,我們對(duì)市場(chǎng)部同仁感到抱歉)
那么,?Git?做了什么,是簡(jiǎn)單地保存文件所做不到的呢?從根本上講,文件保存就是一個(gè)簡(jiǎn)化的版本控制系統(tǒng),但坦率地說(shuō),它并不是一個(gè)好用的系統(tǒng),因?yàn)樗荒芮斑M(jìn)。當(dāng)然,你也許會(huì)爭(zhēng)論“撤消”按鈕可以讓你的文件回滾到以前的狀態(tài)。但我們都清楚,“撤消”按鈕有其局限性,最明顯示的是,在關(guān)閉文件時(shí),文件的過(guò)去也隨之丟失。
另外,文件保存是非常個(gè)人化的。它不能夠顯示整個(gè)系統(tǒng)的歷史,只能夠顯示該文件的。針對(duì)這一點(diǎn),你可能會(huì)想,“嗯,我不是一個(gè)工程師,我不需要為系統(tǒng)煩惱”。我愿意花些時(shí)間來(lái)解釋一下,很多事情你認(rèn)為不是“系統(tǒng)”,而實(shí)際上它們就是。
以? Sally為例,她是一個(gè)正在寫下一個(gè)大冒險(xiǎn)奇幻小說(shuō)系列的作家。Sally 已經(jīng)寫完該系列小說(shuō)中的第一本,并把它傳給了她的編輯。此外,由于她才華出眾,在等待編輯的反饋的同時(shí),她還寫了第二本書的前三章。每本書都建立了獨(dú)立的 World 文件。
在某個(gè)快樂(lè)的日子,Sally? 等來(lái)了她的編輯關(guān)于第一本書的反饋。他擔(dān)心年輕的讀者不想讀一系列專寫獸人故事的書,希望她在這個(gè)故事中引入一些精靈。關(guān)于這點(diǎn),Sally? 嘆了口氣,但很快意識(shí)到,她的精靈新角色將帶來(lái)始料未及的沖突和曲折的情節(jié)。然后,她做了以下事情:
- 在第一本書中加入新角色,并修改故事情節(jié)。
- 完成第一本書之后,對(duì)第二本書的故事情節(jié),進(jìn)行必要的修改。
- 所有的這些修改,導(dǎo)致她需要引入某個(gè)地理位置到第一本書中,而不是第二本書。
- 重新編輯第一本書,讓它包含新的地理位置。
終于,她推開(kāi)了她的鍵盤,確信已經(jīng)把精靈融入到了她的奇幻世界之中。
你瞧,Sally 實(shí)際上在處理一個(gè)系統(tǒng)。她的兩本書互相影響。角色、地理位置和故事情節(jié)在兩本書中流動(dòng)交織。然而,遺憾的是,一個(gè)月后,她的文件系統(tǒng)里什么都沒(méi)有了。Word 的 “文檔歷史”工具,或她曾經(jīng)粘貼在顯示屏邊緣用于記錄修改過(guò)程的便簽紙,將把所有的變化過(guò)程都揉合在一起。
這正是Git 大放光芒之處。如果 Sally 一直結(jié)合 Git 使用Word,她就能對(duì)所有這些相關(guān)的變化做一個(gè)關(guān)于“將精靈引入到系列”的簡(jiǎn)潔小結(jié)。她可以看到所有穿插在頁(yè)、章節(jié)、文件,以及每本書中的修改記錄,讓她真正地了解引入精靈對(duì)她的奇幻系列產(chǎn)生的影響。這個(gè)“簡(jiǎn)潔的小結(jié)”就是我們?cè)?Git 領(lǐng)域中所講的提交(commit)。
回顧一下。 Git 是一個(gè)軟件,它允許你通過(guò)提交對(duì)一個(gè)系統(tǒng)(或一組)文件的歷史進(jìn)行注釋。這些提交便是在給定時(shí)間點(diǎn)對(duì)系統(tǒng)做出的差異“快照”。
那么,如果我是Sally,我的提交歷史看起來(lái)是這樣子的:
Github
到目前為止,一切都還不錯(cuò)。但是,如果 Sally 同時(shí)用到兩臺(tái)電腦工作,將會(huì)發(fā)生什么呢?問(wèn)得好。這時(shí),就該用到 Github了。注意,不要和 Git 混淆了。Github 獲取 Git 中的提交歷史,并將其存儲(chǔ)在互聯(lián)網(wǎng)上,因此你可以從任一一臺(tái)電腦訪問(wèn)它。你在本機(jī)(例如:你當(dāng)前正在使用的電腦)推送(pushing)提交到 Github,然后,從另一臺(tái)新的或不同的電腦上拉取(pulling)這些提交。
讓我們假設(shè)上圖為 Sally 的工作流程。她在家里的臺(tái)式電腦(左邊,橘黃色的)上開(kāi)啟她一天的工作。接下來(lái),她完成了幾個(gè)章節(jié)的寫作,又做了一些編輯工作,等等。整個(gè)過(guò)程中,她對(duì)工作總共進(jìn)行了三次策略性的“快照”(Git 提交)。
下午,Sally 常常喜歡帶著她的筆記本電腦(上圖中的右側(cè),藍(lán)色的)去咖啡館寫作。今天也不例外。因此,在關(guān)閉家里的臺(tái)式電腦之前,她需要確認(rèn)當(dāng)前的Git 提交歷史已推送(push)到了在線Github。一旦被上傳到 Github,這些提交記錄就被存儲(chǔ)在遠(yuǎn)程倉(cāng)庫(kù)(remote repository)中。
我們先來(lái)分析一下幾個(gè)計(jì)算機(jī)術(shù)語(yǔ):遠(yuǎn)程(remote)僅僅意味著聯(lián)網(wǎng)(與“本地”的意思相反,和之前我們理解到的意思一樣的,代表當(dāng)前正在使用的電腦)。而倉(cāng)庫(kù)(repository,經(jīng)常簡(jiǎn)寫為“repo”),就是一個(gè)具備 Git 超級(jí)權(quán)限的文件夾。
因此,Github 就是讓你把工作(通過(guò)Git提交進(jìn)行注解)存儲(chǔ)在了一個(gè)指定的在線文件夾(repo)。明白了吧?簡(jiǎn)單。
午餐之后,在當(dāng)?shù)氐囊患铱Х瑞^中,Sally 拿出了她的筆記本電腦。很明顯,她想接著家里的工作進(jìn)度繼續(xù)。因些,她從 Github 倉(cāng)庫(kù)上獲取到最新進(jìn)度的工作。“從 Github 上獲取她的工作”,這一過(guò)程就叫拉取(pulling)。再看一下上面這幅圖片,你將看到 Sally 拉取了之前她在家時(shí)進(jìn)行的三個(gè)提交。
現(xiàn)在,在她的筆記本電腦上,Sally 有整個(gè)系統(tǒng)(包含她的幻想系列的所有文本文件)的最新的完整副本,并能夠基于上次的進(jìn)度,繼續(xù)工作。她寫了更多的章節(jié),對(duì)工作進(jìn)行了兩次以上的策略“快照”(提交)。最后,Sally 把這些提交推送(push)到 Github 上,結(jié)束了這一天的工作。這樣第二天上午的時(shí)候,在家里的臺(tái)式電腦上就可以取得這些最新進(jìn)度的工作。
協(xié)同工作
好吧,這一切都能說(shuō)得通。但是, Sally再如何酷,整個(gè)項(xiàng)目也只有她一人而已。工程團(tuán)隊(duì)要如何確保他們的工作不會(huì)重疊?
簡(jiǎn)而言之,創(chuàng)建分支。將你的 Git 提交歷史想像成一棵樹(shù)。樹(shù)的主干就是我們談到的主分支。為了讓團(tuán)隊(duì)成員避免彼此牽扯,他們?cè)讵?dú)立于他人的隔離區(qū)(在一個(gè)功能分支)進(jìn)行工作,然而最終,每個(gè)人的工作成果都會(huì)被提交到主代碼庫(kù) (主分支)。
現(xiàn)在,回到 Sally 的例子。她加入了奇幻作家協(xié)會(huì),在這里每個(gè)人都與他人合作完成這本書——《奇幻系列生物辭典》。這本辭典更像一本教材,由多個(gè)作者共同完成:Sally、Tom 和 Adam。
讓我們來(lái)看看《奇幻系列生物辭典》項(xiàng)目的在線 Github 倉(cāng)庫(kù),現(xiàn)在的情況是:
如上圖所示,樹(shù)的類比完全適用于奇幻作家協(xié)會(huì)在這個(gè)項(xiàng)目上的合作情況,倉(cāng)庫(kù)歷史沿主分支向上移動(dòng)。常規(guī)工作流始于每個(gè)作者為完成一個(gè)工作任務(wù)(例如編寫章節(jié)內(nèi)容,或排版章節(jié))而在主分支上創(chuàng)建分支。只有當(dāng)更改得到其他合作作家的批準(zhǔn)時(shí),分支才會(huì)被合并到主分支上(請(qǐng)謹(jǐn)記,主分支上的內(nèi)容,才是最終要發(fā)布的內(nèi)容)。
當(dāng)一個(gè)分支的內(nèi)容合并(merged)到主分支時(shí),意味著該分支的內(nèi)容會(huì)覆蓋主分支上的。因此,現(xiàn)有內(nèi)容的任何更改都將會(huì)替代之前的。當(dāng)然,任何新添加的內(nèi)容也會(huì)添加到主分支。實(shí)際上,當(dāng)分支合并到主分支時(shí),該分支的提交歷史被添加到主分支提交歷史的頂部。
然而,你可能正在思考:人們?cè)诒緳C(jī)的工作和之后才推送到 Github 的工作變更是如何連接到一起的呢?
關(guān)于這個(gè)問(wèn)題,重點(diǎn)在于:你在 Github 的遠(yuǎn)程倉(cāng)庫(kù)是你本機(jī)工作項(xiàng)目的一個(gè)鏡像。這意味著,你在自己的電腦里存儲(chǔ)了該項(xiàng)目(例如:一個(gè)已設(shè)置可進(jìn)行 Git 提交的文件夾)的本地 Git 倉(cāng)庫(kù)。在這個(gè)本地的 Git 倉(cāng)庫(kù)(再次,這是一個(gè)特定術(shù)語(yǔ),指你的電腦里某個(gè)啟用了 Git 功能的文件夾)中,你擁有與該項(xiàng)目相關(guān)的所有文件,在本文的例子中,即《奇幻系列生物辭典》。
它的工作原理很像 Dropbox :你在不同的設(shè)備(你的家庭電腦、辦公室電腦,等等)上創(chuàng)建本地文件夾,進(jìn)行工作并更新這些文件。最后,這些操作被同步到網(wǎng)絡(luò)上。然而,我們知道,Git/Github 工作流還包含了一些額外的步驟。首先,你必須有意識(shí)地對(duì)某一時(shí)刻的工作執(zhí)行“快照”(即執(zhí)行一次提交)。然后,你必須特意地推送這些提交(push) 到 Github。只有這樣,你的工作才被同步到網(wǎng)絡(luò)上的位置(Github 版本庫(kù))。
既然如此,為什么不自動(dòng)化該工作流呢?為什么不讓它像 Dropbox一樣,當(dāng)你更新本地文件時(shí),同時(shí)自動(dòng)更新 Github 上的文件?有很多理由讓我們不這么做。最主要的理由是——bugs 。同出版界一樣,軟件工程中也不是所有寫過(guò)的東西都要保留。有時(shí),你希望實(shí)驗(yàn)一下你的想法,如果實(shí)驗(yàn)失敗,你希望有一種簡(jiǎn)單的方式能讓工作快速回滾到之前的正確狀態(tài)上。這也是為什么我們提倡這個(gè)經(jīng)驗(yàn)法則,即在你試圖用不同的方法編輯或?qū)嶒?yàn)之前,先對(duì)當(dāng)前你希望保留的修改進(jìn)行提交。頻繁地提交小塊工作有益無(wú)害,事實(shí)上,許多工程師為自己能做到這一點(diǎn)而感到自豪。
現(xiàn)在,回到《奇幻系列生物辭典》。由于? Sally 對(duì)獸族有較深的了解,她被挑選為寫獸族章節(jié)。但她不想在沒(méi)有經(jīng)過(guò)其它合作人員允許的情況下去修改這本書,于是,她創(chuàng)建了一個(gè)本地分支,并在該分支上進(jìn)行寫作和提交。然后,她將本地分支推送到 Github。像往常一樣,Github 的遠(yuǎn)程倉(cāng)庫(kù)是本地庫(kù)的一個(gè)鏡像,最新進(jìn)展顯示 Sally 已創(chuàng)建了一個(gè)包含部分提交的分支(如下圖所示)。
隨著她對(duì)本章節(jié)的持續(xù)寫作,Sally 進(jìn)行了更多的提交,并將它們推送到 Github 的在線鏡像分支。終于,她準(zhǔn)備請(qǐng) Tom 和 Adam 一起對(duì)她的工作進(jìn)行評(píng)審。因此,她在 Github 上發(fā)布了一個(gè)?Pull Request(發(fā)布請(qǐng)求),這是一個(gè) Github 功能,允許她解釋該分支相對(duì)于主分支做了哪些修改。Github 還提供了一個(gè)簡(jiǎn)易平臺(tái),合作人員可以在該平臺(tái)上針對(duì)分支的修改內(nèi)容進(jìn)行討論,并要求 Sally 在分支合并到主分支之前對(duì)一些有異議的內(nèi)容進(jìn)行修改。
在對(duì)部分內(nèi)容請(qǐng)求修改后,如上圖所示,Tom 和 Adam 對(duì) Sally 的分支內(nèi)容很滿意,并決定將她的工作成果合并到 Github 的主分支上。此時(shí),他們所要做的就是將 Sally 之前獨(dú)立提交的內(nèi)容,添加到主分支的提交歷史頂部:
此時(shí),Sally可以切換(或“check out”)到本地計(jì)算機(jī)上的主分支,并將先前在功能分支(獸人章節(jié)分支)中的獨(dú)立提交拉取下來(lái)。現(xiàn)在她又要在新的主分支上重新開(kāi)始了:以該主分支為基礎(chǔ)為她的下一步工作創(chuàng)建一個(gè)新的本地分支,幫助湯姆編輯有關(guān)妖精的章節(jié)。因此,這一過(guò)程又將重復(fù):
正如你所看到的,這是一個(gè)非常流暢的工作流,完美地結(jié)合了獨(dú)立工作與團(tuán)隊(duì)協(xié)作。你本機(jī)的 Git 提供了一個(gè)絕妙的方法,即通過(guò)由你自己控制和策劃的豐富的歷史提交,來(lái)創(chuàng)建你工作的各種版本。Github 是一個(gè)非常棒的在線版本控制工具,不僅存儲(chǔ)和提供了清晰的可視化歷史記錄,而且還能進(jìn)行協(xié)同工作和質(zhì)量控制。
總而言之,我希望我已經(jīng)說(shuō)服你去嘗試使用 Git ?和 Github 進(jìn)行任何項(xiàng)目。沒(méi)有理由只有工程師能從這個(gè)很棒的工具中受益。畢竟,我們也想看到更多有關(guān)獸人的故事。
?
致謝:
非常感謝?Common Craft?對(duì)本文的涂鴉和解釋風(fēng)格的啟發(fā)。還要感謝這個(gè)視頻《?saving me from the horror of having to explain Twitter to my mum?》。
本文涉及的術(shù)語(yǔ)
- Version Control(版本控制):?任何一個(gè)能夠讓你了解文件的歷史,以及該文件的發(fā)展進(jìn)程的系統(tǒng)。
- Git:一個(gè)版本控制程序,通過(guò)對(duì)變更進(jìn)行注釋,以創(chuàng)建一個(gè)易于遍歷的系統(tǒng)歷史。
- Commit(提交):在指定時(shí)間點(diǎn)對(duì)系統(tǒng)差異進(jìn)行的注釋 “快照”。
- Local(本地):指任意時(shí)刻工作時(shí)正在使用的電腦。
- Remote(遠(yuǎn)程):?指某個(gè)聯(lián)網(wǎng)的位置。
- Repository (倉(cāng)庫(kù),簡(jiǎn)稱 repo):配置了Git超級(jí)權(quán)限的特定文件夾,包含了你的項(xiàng)目或系統(tǒng)相關(guān)的所有文件。
- Github:獲取本地提交歷史記錄,并進(jìn)行遠(yuǎn)程存儲(chǔ),以便你可以從任何計(jì)算機(jī)訪問(wèn)這些記錄。
- Pushing(推送):取得本地Git提交(以及相關(guān)的所有工作),然后將其上傳到在線Github。
- Pulling(拉取):從在線的Github上獲取最新的提交記錄,然后合并到本地電腦上。
- Master (branch):主分支,提交歷史 “樹(shù)”的 “樹(shù)干”,包含所有已審核的內(nèi)容/代碼。
- Feature branch(功能分支/特性分支):一個(gè)基于主分支的獨(dú)立的位置,在再次并入到主分支之前,你可以在這里安全地寫工作中的新任務(wù)。
- Pull Request(發(fā)布請(qǐng)求):一個(gè) Github 工具,允許用戶輕松地查看某功能分支的更改 (the difference或 “diff”),同時(shí)允許用戶在該分支合并到主分支之前對(duì)其進(jìn)行討論和調(diào)整。
- Merging(合并):該操作指獲取功能分支的提交,加入到主分支提交歷史的頂部。
- Checking out(切換):該操作指從一個(gè)分支切換到另一個(gè)分支。
轉(zhuǎn)載于:https://www.cnblogs.com/asplover/p/10290772.html
總結(jié)
以上是生活随笔為你收集整理的适合小白的大白话讲解---Git与Github的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中信易卡,你值得搬砖吗?
- 下一篇: 计算机报名照片在线修图,网上报名照片处理