白话谈 Git
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一、Git是什么?
定義
Git 的定義 是 一款免費(fèi)、開(kāi)源的版本控制系統(tǒng)。
免費(fèi)不必多說(shuō);開(kāi)源則是指將源代碼公布,并允許公眾查看、修改代碼。
如果我們將項(xiàng)目每一個(gè)節(jié)點(diǎn)處的修改(這些節(jié)點(diǎn)可能是一些標(biāo)志性事件,比如第一個(gè)章節(jié)完成、草稿完成、審核通過(guò); 也可能是一些時(shí)間節(jié)點(diǎn),比如下班回家)看做是一個(gè)版本,對(duì)這些版本的記錄、查看、更新等操作即是版本控制。
Git?
Git 誕生于 2005 年,創(chuàng)作者是 Linux 之父 Linus Torvalds。
Git 中文翻譯是 “傻子;飯桶;無(wú)用的人”。
為什么這樣一款流行的工具會(huì)起這樣一個(gè)名字呢?
坊間傳說(shuō)Linus 曾說(shuō)過(guò)這樣一句話,“我是個(gè)自負(fù)的混蛋,所有我的項(xiàng)目都以我自己的名字命名,先有 Linux, 現(xiàn)在是 Git”。
Linus 也曾在公共場(chǎng)合表示過(guò)對(duì) Git 的看法 “Git,the stupid content tracker”。 Git, 傻瓜內(nèi)容追蹤器。如傻瓜相機(jī)一樣, 這里的 “傻瓜”指的是讓復(fù)雜的操作變得更簡(jiǎn)單。
也有人認(rèn)為 Git 是 “Global information tracker” 的縮寫。如果將項(xiàng)目整體認(rèn)為是“全局”,項(xiàng)目文件內(nèi)容認(rèn)為是 “信息”,文件內(nèi)容的增刪改查認(rèn)為是“跟蹤”, Git的本質(zhì)的確是 “全局信息跟蹤”。
分布式
與傳統(tǒng)的版本控制工具不同的是,Git 采用分布式管理。我們?cè)谶h(yuǎn)程服務(wù)器建立中央倉(cāng)庫(kù),團(tuán)隊(duì)每位成員將其同步到本地。之后團(tuán)隊(duì)成員每做一次修改,即將項(xiàng)目最新?tīng)顟B(tài)上傳到中央倉(cāng)庫(kù),并通知團(tuán)隊(duì)其他成員拉取中央倉(cāng)庫(kù)項(xiàng)目狀態(tài)以更新他們的本地倉(cāng)庫(kù)。這是一種高效的團(tuán)隊(duì)協(xié)作方式。我們?nèi)∧骋粋€(gè)時(shí)間節(jié)點(diǎn)來(lái)看,項(xiàng)目的最新?tīng)顟B(tài)確實(shí)是分布式地存儲(chǔ)在團(tuán)隊(duì)各個(gè)成員的本地倉(cāng)庫(kù)中的。
?
二、為什么要用Git?
備份文件
有沒(méi)有人會(huì)擔(dān)心突然哪一天電腦壞掉了,不能用了呢?為了不使工作成果消失,一般我們會(huì)使用 U盤、光盤或者云端工具如百度網(wǎng)盤、360云盤、Google Drive等留存一份副本。同樣, Git 也具有這種功能。當(dāng)我們?cè)谥醒雮}(cāng)庫(kù)建立唯一副本后,無(wú)論我們是在公司、家里、酒店、會(huì)所等任何有網(wǎng)有電腦的地方,都可以快速還原工作環(huán)境。
記錄歷史
每一次提交項(xiàng)目修改時(shí),Git 會(huì)記錄提交者、提交日期等信息,并自動(dòng)識(shí)別項(xiàng)目發(fā)生變化的地方。同時(shí),我們還可以為每次提交添加注釋以幫助我們回憶和梳理項(xiàng)目歷史。
Git 對(duì)于二進(jìn)制文件的支持并不算友好,它不能識(shí)別文件發(fā)生變化的區(qū)塊,因此會(huì)帶來(lái)一些限制,之后會(huì)提到。不過(guò)我們依舊可以用它來(lái)記錄一些信息。
切換版本
在進(jìn)行長(zhǎng)篇大論的寫作時(shí),往往會(huì)遇到這樣一些情況,想要?jiǎng)h除某一個(gè)段落、或者替換一些數(shù)據(jù),但又怕之后會(huì)用到。于是我們建立了一份副本。可這樣的情景多了,文檔結(jié)構(gòu)就會(huì)變得很復(fù)雜,當(dāng)然我們可以通過(guò)標(biāo)注文件名稱簡(jiǎn)單管理一下。于是,我們得到了多個(gè)版本、看起來(lái)比較混亂的文檔結(jié)構(gòu)。
而Git 則通過(guò)版本控制很好地解決了這個(gè)問(wèn)題。在每次提交時(shí), Git 生成一個(gè)HASH值作為版本號(hào),我們可以通過(guò)查看項(xiàng)目歷史找到想要的版本,并通過(guò)版本號(hào)將當(dāng)前版本回滾到指定版本。
團(tuán)隊(duì)協(xié)作
即使一個(gè)團(tuán)隊(duì)里的每個(gè)人都能夠獨(dú)當(dāng)一面,在遇到更復(fù)雜的情況和更難對(duì)付的對(duì)手,他們?nèi)匀恍枰献?#xff0c;或合力一處攻破難關(guān),或各施所長(zhǎng)處理不同的業(yè)務(wù)。然而,若是沒(méi)有一套良好的合作機(jī)制,不能夠有效地進(jìn)行團(tuán)隊(duì)協(xié)作,所起的作用是事倍功半的。
假設(shè)團(tuán)隊(duì)合作一個(gè)項(xiàng)目,我們可以讓擅畫圖的去作圖,文筆好的去作文,負(fù)責(zé)人組織全局結(jié)構(gòu),協(xié)調(diào)各部分資源。這樣不僅使得團(tuán)隊(duì)成員術(shù)業(yè)專攻,也使得業(yè)務(wù)的每個(gè)部分得到最專業(yè)的打磨,同時(shí)有效地縮短了項(xiàng)目的開(kāi)發(fā)周期。
舉個(gè)傳統(tǒng)方式團(tuán)隊(duì)協(xié)作的例子,Jack在開(kāi)發(fā)項(xiàng)目時(shí),發(fā)現(xiàn)某一部分需要 John完成,于是他把文件復(fù)制了一份發(fā)給 John,之后繼續(xù)自己的工作。第二天John將文件傳回來(lái),可這時(shí)Jack并不知道John對(duì)文件做了哪些修改,也無(wú)法清楚地分辨出自己做過(guò)的變動(dòng),除非他們之間事先做過(guò)良好清晰的約定或者Jack等待John完成后再繼續(xù)自己的工作。
使用Git則會(huì)極大地簡(jiǎn)化這一過(guò)程。Jack將自己的工作內(nèi)容上傳到遠(yuǎn)程倉(cāng)庫(kù)中,John復(fù)制遠(yuǎn)程倉(cāng)庫(kù)內(nèi)容到本地,之后兩個(gè)人各自進(jìn)行自己工作。當(dāng)John完成工作時(shí),通知Jack拉取項(xiàng)目更新,在拉取過(guò)程中, Git會(huì)自動(dòng)合并雙方的修改為一體,如果項(xiàng)目成員的修改發(fā)生沖突(比如修改同一處),Git 允許你手動(dòng)選擇使用什么內(nèi)容來(lái)填充沖突處。
這一功能也得益于Git的版本控制機(jī)制。在文件內(nèi)容發(fā)生修改時(shí),Git會(huì)將發(fā)生修改的部分劃分為區(qū)塊進(jìn)行記錄,以區(qū)塊為單位從而實(shí)現(xiàn)自動(dòng)合并。我們之前說(shuō)到 Git對(duì)于二進(jìn)制文件的支持并不算友好,因?yàn)镚it不能識(shí)別文件發(fā)生變化的區(qū)塊,它會(huì)將二進(jìn)制數(shù)據(jù)流視作整個(gè)區(qū)塊,因此Git并不能自動(dòng)合并不同版本的二進(jìn)制文件, 如 word、excel、ppt 等。
工作透明
在軟件團(tuán)隊(duì)中,有一個(gè)不成文的習(xí)慣,團(tuán)隊(duì)成員在每天晚上下班前,先將一天工作內(nèi)容上傳到中央倉(cāng)庫(kù),早上上班時(shí)先從中央倉(cāng)庫(kù)拉取項(xiàng)目更新。由于項(xiàng)目的每個(gè)成員都可以通過(guò)版本歷史記錄查看其它成員的工作內(nèi)容和項(xiàng)目進(jìn)展,因此也就形成了團(tuán)隊(duì)內(nèi)部工作透明的機(jī)制。
?
三、怎么使用Git?
下載安裝
Git 全平臺(tái)通用,我們可以在官網(wǎng)上下載安裝。
Git 命令
在上面的內(nèi)容中,我們提到過(guò) Git 相關(guān)一系列操作,如拉取、提交、查看歷史等。可是究竟要如何實(shí)現(xiàn)呢?
Git 為這些操作提供了一系列配套命令,常用命令如
# 克隆遠(yuǎn)程倉(cāng)庫(kù) git clone # 初始化一個(gè)倉(cāng)庫(kù) git init # 將文件修改添加到緩沖區(qū) git add # 移動(dòng)或重命名一個(gè)文件、一個(gè)文件夾或快捷方式 git mv # 回滾項(xiàng)目版本 git reset # 將文件修改從緩沖區(qū)中移除 git rm # 顯示項(xiàng)目當(dāng)前狀態(tài) git status # 顯示項(xiàng)目日志 git log # 顯示項(xiàng)目分支 git branch # 切換分支或重置文件 git checkout # 提交項(xiàng)目修改到倉(cāng)庫(kù) git commit # 對(duì)比版本之間、版本和當(dāng)前工作狀態(tài)之間的差異 git diff # 合并文件 git merge # 將提交放在另一個(gè)基的上面 git rebase # 創(chuàng)建、顯示、校驗(yàn)標(biāo)簽對(duì)象 git tag # 拉取其他倉(cāng)庫(kù)的對(duì)象和索引 git fetch # 拉取其他倉(cāng)庫(kù)內(nèi)容并和本地分支合并 git pull # 更新遠(yuǎn)程倉(cāng)庫(kù) git push同時(shí),這些命令還有配套的一些參數(shù),之后會(huì)推薦一些相關(guān)教程。
Git GUI
如果覺(jué)得對(duì)著黑盒子敲命令很不舒服的話,你也可以使用 Git 的圖形界面。
推薦一款我常用的 GUI,Source Tree。
Git 工作流程
下面簡(jiǎn)單講述兩個(gè) Git 的基本工作流程。
提交項(xiàng)目修改
文件發(fā)生修改時(shí),選擇想要提交的內(nèi)容添加到緩沖區(qū)
提交緩沖區(qū)內(nèi)容到倉(cāng)庫(kù),Git 會(huì)自動(dòng)生成版本記錄、版本號(hào)等
可能有人會(huì)有疑問(wèn),為什么不直接提交修改到倉(cāng)庫(kù)呢?
這里,緩沖區(qū)起到一個(gè)緩沖的作用,允許你考慮和修改用哪些內(nèi)容生成此次版本。
團(tuán)隊(duì)協(xié)同合作
上文曾簡(jiǎn)單描述過(guò)這個(gè)流程:
團(tuán)隊(duì)在遠(yuǎn)程服務(wù)器上建立中央倉(cāng)庫(kù)
團(tuán)隊(duì)成員在本機(jī)上各自建立本地倉(cāng)庫(kù)
成員提交更新到中央倉(cāng)庫(kù)
其他成員拉取項(xiàng)目最新提交以更新本地倉(cāng)庫(kù)
?
四、相關(guān)鏈接
Git 下載地址
https://git-scm.com/
Git 英文教程(基本原理)
https://jwiegley.github.io/git-from-the-bottom-up/
Git中文教程(命令用法)
https://github.com/lonelydawn/git-recipes/
Git GUI 推薦
Source Tree: https://www.sourcetreeapp.com/
GitHub 官方 GUI: https://desktop.github.com/
Git項(xiàng)目托管平臺(tái)推薦
GitHub: https://github.com/
BitBucket: https://bitbucket.org/
碼云(國(guó)內(nèi)平臺(tái),備受好評(píng)!):?https://gitee.com/
關(guān)于 Git 項(xiàng)目托管平臺(tái)有一點(diǎn)要說(shuō)的是,GitHub 雖然是最大 Git 開(kāi)源項(xiàng)目社區(qū),但它的 私有庫(kù)是收費(fèi)的,而 BitBucket 則提供限量免費(fèi)私有庫(kù),這對(duì)中小型公司是比較友好的。
五、PS
配套 PPT 如有需要, 請(qǐng)自取:
百度網(wǎng)盤鏈接
?
?
?
?
?
轉(zhuǎn)載于:https://my.oschina.net/lonelydawn/blog/1633511
總結(jié)
- 上一篇: Spring MVC源码分析(一)
- 下一篇: 架构思考