一济锄、Git 與 GitHub 的歷史
你來(lái)了步清,快坐下瘪撇,今天我們來(lái)講講編程界的兩大神器: Git 和 Github。
Git 和 Github 都是程序員每天都要用到的東西 —— 前者是目前最先進(jìn)的 版本控制工具侣灶,擁有最多的用戶,且管理著地球上最龐大的代碼倉(cāng)庫(kù)缕碎;而后者是全球最大 同性交友 代碼托管平臺(tái)褥影、開源社區(qū)。
如果你之前沒接觸過「版本控制」的概念咏雌,看到這里一定是一臉 xx 的凡怎,別急,看了這篇文章你一定能明白:
簡(jiǎn)單復(fù)述一下文章中的例子:
大四畢業(yè)生 小張 在寫 畢業(yè)論文赊抖,他經(jīng)常刪刪改改统倒,有時(shí)還會(huì)后悔“昨天那個(gè)思路那么好,我怎么就給刪了”……
有了多次教訓(xùn)后氛雪,他決定每次寫之前都先復(fù)制一份房匆,在復(fù)制的那份里修改,這么一來(lái)报亩,文件夾里有了:
畢業(yè)論文_初稿.doc
畢業(yè)論文_修改1.doc
畢業(yè)論文_修改2.doc
畢業(yè)論文_修改3.doc
畢業(yè)論文_完整版1.doc
畢業(yè)論文_完整版2.doc
畢業(yè)論文_完整版3.doc
畢業(yè)論文_最終版1.doc
畢業(yè)論文_最終版2.doc
畢業(yè)論文_確定版1.doc
畢業(yè)論文_確定版2.doc
……
小張想:“雖然很痛苦浴鸿,但不至于丟掉以前的靈感了吧……等等,最終版和確定版哪個(gè)是昨天寫的來(lái)著弦追?岳链??”
同時(shí)骗卜,他還要把論文發(fā)給學(xué)霸女友求幫忙,第二天他的文件夾里又有了:
畢業(yè)論文_最終版3.doc
畢業(yè)論文_女友版1.doc
畢業(yè)論文_女友版2.doc
幾星期的煎熬下來(lái)左胞,文件夾里多了幾十份文件寇仓,小張的論文也快成型了,是時(shí)候把自己和女朋友的內(nèi)容合并起來(lái)了烤宙。
這時(shí)又發(fā)生了一件喜聞樂見的事:U 盤中病毒了遍烦,而電腦里只有 1 個(gè)月前的版本……
如何拯救生無(wú)可戀的小張?其實(shí)躺枕,如果小張一早知道用「版本控制」工具就好了服猪,他的文件可以整整齊齊地排列,就像這樣:
“哎呀拐云,早知道能這樣罢猪,就不用手動(dòng)控制那么多版本啦!”
但這還不夠叉瘩,如果能有一個(gè)支持「論文托管 + 論文版本控制」的網(wǎng)站就更好了膳帕。這樣一來(lái),小張不但能和女朋友合作編輯內(nèi)容薇缅,還不用擔(dān)心因電腦故障危彩,導(dǎo)致之前論文版本的丟失攒磨。
這時(shí) —— 論文Hub 出現(xiàn)了,它可以幫你托管論文汤徽,而且和版本控制工具無(wú)縫連接娩缰。
越來(lái)越多人發(fā)現(xiàn)了 論文Hub 的好處,相繼把論文托管在論文 Hub 上 谒府,網(wǎng)站上的論文越來(lái)越多拼坎。一些優(yōu)秀的作者還會(huì)把論文開源出來(lái),讓每個(gè)人都可以查閱狱掂、交流演痒、學(xué)習(xí)……
慢慢的,論文 Hub 變成了全球最大的「交友社區(qū)」趋惨,并逐漸演化成了一種時(shí)尚 —— 找工作時(shí)鸟顺,面試官會(huì)先問你有沒有 論文 hub 的賬號(hào),有多少個(gè)贊器虾、多少粉絲讯嫂;而有優(yōu)秀作品的人,會(huì)被大公司爭(zhēng)搶錄用……
這個(gè) 論文 hub兆沙,就是我們今天要學(xué)習(xí)的 Github 欧芽,只不過論文換成了程序代碼。Github 大概長(zhǎng)這樣:
在沒有這兩個(gè)工具時(shí)葛圃,編程可能是這樣的:
- 哪個(gè)同事修改了我的代碼??我要?dú)⒘怂?/li>
- 我把自己的代碼改崩潰了???我選擇自殺
- 電腦崩潰千扔、硬盤損壞、中毒库正,幾萬(wàn)行代碼找不到了??
但有了他們曲楚,一切都不一樣了:
- 同步代碼到網(wǎng)絡(luò)倉(cāng)庫(kù),在家里寫好代碼上傳褥符,回到公司就可以繼續(xù)寫了龙誊,而且不怕丟失。
- 記錄每次代碼的修改喷楣,即使把程序?qū)懕懒颂舜螅材芗词够厮莸缴弦粋€(gè)版本。這在產(chǎn)品更新時(shí)也經(jīng)常使用铣焊。
- 可以多人協(xié)作完成項(xiàng)目逊朽,每個(gè)人的提交都有清晰的記錄。
你也會(huì)不斷用到 Git 和 Github曲伊,把你完成的項(xiàng)目惋耙、學(xué)習(xí)記錄,同步在 Github 的倉(cāng)庫(kù)中。這樣做的結(jié)果是:你將有一份 非常漂亮的 Github 主頁(yè)绽榛,能給你的簡(jiǎn)歷加分很多湿酸。
Linux 之父 林納斯(Linus) 在 1991 年創(chuàng)建了開源的 Linux 系統(tǒng),隨著 Linux 代碼量越來(lái)越大灭美,合并志愿者提交的代碼已經(jīng)無(wú)法依靠人工完成推溃,所以 林納斯 選擇了商業(yè)的管理軟件 BitKeeper ,來(lái)管理 Linux 的代碼版本届腐。
在 2005 年铁坎,BitKeeper 公司發(fā)現(xiàn),有 Linux 社區(qū)的人試圖破解 BitKeeper 軟件犁苏,他們決定收回 Linux 社區(qū)的免費(fèi)使用權(quán)硬萍。林納斯 對(duì)此事調(diào)解數(shù)周無(wú)果,決定自己搞一個(gè)围详。他花了十天時(shí)間用 C 語(yǔ)言寫好了一個(gè)開源的版本控制系統(tǒng)朴乖,就是著名的 Git。
(先寫出一個(gè)操作系統(tǒng)助赞,再用 10 天寫出 Git买羞,林納斯已經(jīng)不能用大神來(lái)形容,只能理解為外星人來(lái)技術(shù)扶貧的)
2007 年雹食,舊金山的三個(gè)年輕人覺得 Git 是個(gè)好東西畜普,創(chuàng)建一個(gè)公司名字叫 GitHub,第二年上線了使用 Ruby 編寫的同名網(wǎng)站群叶。這是一個(gè)基于 Git 的免費(fèi)代碼托管網(wǎng)站(有付費(fèi)服務(wù))吃挑,十年間迅速躥紅,擊敗了實(shí)力雄厚的 Google Code街立,成為全世界最受歡迎的代碼托管網(wǎng)站舶衬。根據(jù) 2018 年 10 月的 GitHub 年度報(bào)告顯示,目前有 3100 萬(wàn)開發(fā)者創(chuàng)建了 9600 萬(wàn)個(gè)項(xiàng)目倉(cāng)庫(kù)几晤,有 210 萬(wàn)企業(yè)入駐约炎。
值得一提的是植阴,GitHub 的 創(chuàng)始人蟹瘾、CEO —— Wanstrath 是一位大學(xué)肄業(yè),自學(xué)成才的程序員掠手。而他大學(xué)的專業(yè)是英語(yǔ)憾朴,相當(dāng)于我們的“漢語(yǔ)言文學(xué)”專業(yè),是一名地地道道的 “文科生” 喷鸽,如今众雷,他的身家可能超過了10億美元,也算是一位自學(xué)編程成才的標(biāo)志人物吧。
二砾省、我們?nèi)绾斡?Git
來(lái)控制本地目錄demo鸡岗?
在demo目錄中右鍵點(diǎn)擊 git bash here打開git命令窗口,在命令行內(nèi)輸入 git init
即可编兄。
git init
這是 Git
的初始化操作轩性,作用是將一個(gè)已存在文件夾,置于 Git 的控制管理之下狠鸳。
再 ls -la
命令揣苏,會(huì)發(fā)現(xiàn)一個(gè)名叫 .git 的目錄被創(chuàng)建了,這意味著倉(cāng)庫(kù)初始化成功件舵⌒恫欤可以進(jìn)入到 .git 目錄查看下有哪些內(nèi)容。
Git 提交代碼的基本流程是這樣的:
- 創(chuàng)建或修改 本地文件
- 使用 git add 命令铅祸,將創(chuàng)建或修改的文件添加到本地的 暫存區(qū)坑质,這里保存的是你的臨時(shí)更改
- 使用 git commit 命令,提交文件到 本地倉(cāng)庫(kù)
- 使用 git push命令个少,將本地代碼庫(kù)同步到 遠(yuǎn)端倉(cāng)庫(kù)
目前為止洪乍,我們實(shí)現(xiàn)了第一步,創(chuàng)建了一個(gè)文件夜焦,我們的最終目標(biāo)是:將本地的 demo 倉(cāng)庫(kù)壳澳,同步到 GitHub 上的 demo 倉(cāng)庫(kù)中。
?? git add
使用 git add + 文件名/目錄名
命令茫经,可以將你需要同步的文件巷波,添加到本地的暫存區(qū)。我們先進(jìn)入 demo 目錄卸伞,然后把 README.md 文件添加一下:
$ git add README.md
輸入 git status
抹镊,可以檢測(cè)當(dāng)前目錄和暫存區(qū)的狀態(tài),查看哪些修改被暫存了:
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
可以看到我們剛剛 add
的文件已經(jīng)被初始提交了荤傲。
?? git commit
git commit
提交是你工作的一個(gè)里程碑 —— 每當(dāng)你完成一些工作垮耳,都可以創(chuàng)建一次提交,保存當(dāng)前的版本遂黍。
這樣一來(lái)终佛,無(wú)論你何時(shí)修改了文件,都創(chuàng)建一個(gè)新版本的文件雾家,你可以很方便地查看以往所有版本的文件和內(nèi)容铃彰。
在提交之前,你必須先設(shè)置你的名字和 email芯咧,這是你在提交 commit 時(shí)的簽名牙捉,每次提交記錄里都會(huì)包含這些信息竹揍。
使用 git config 命令進(jìn)行配置:
$ git config --global user.name "YourName"
$ git config --global user.email "YourEmail@xxx.com"
完成配置后,我們可以創(chuàng)建提交了邪铲,請(qǐng)輸入:
git commit -m "first commit"
commit
的語(yǔ)法結(jié)構(gòu)是 git commit -m "注釋"
芬位,通過上個(gè)命令,你創(chuàng)建了一條注釋為 “first commit” 的 Git 提交带到。
$ git commit -m "fisrt commit"
[master (root-commit) d1202f9] fisrt commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
?? 注意:每次提交晶衷,您都必須用 -m + '注釋'
編輯注釋信息 。它不僅能協(xié)助您辨別不同的版本阴孟,而且能讓你理解晌纫,自己當(dāng)時(shí)對(duì)文件做了什么修改。
比如當(dāng)你每次在文件中添加了新的代碼后永丝,你可以寫一句提交信息:“添加了 XXX 代碼” —— 當(dāng)你一個(gè)月后回來(lái)看提交記錄或者 Git 日志 時(shí)锹漱,你還能知道當(dāng)時(shí)做了什么。
三慕嚷、與 Github 倉(cāng)庫(kù)同步
終于到了激動(dòng)人心的時(shí)刻哥牍,我們要把本地倉(cāng)庫(kù)提交到遠(yuǎn)端倉(cāng)庫(kù)(即 Github 倉(cāng)庫(kù))中。
?? 連接 Github 倉(cāng)庫(kù)
使用如下命令喝检,將本地倉(cāng)庫(kù)連接到 GitHub 倉(cāng)庫(kù)中:
git remote add origin 倉(cāng)庫(kù)鏈接
倉(cāng)庫(kù)鏈接請(qǐng)?jiān)谶@里復(fù)制嗅辣,并用剪切板功能粘貼進(jìn)去:
!我們分析一下這個(gè)命令,首先 remote 的意思是遠(yuǎn)程:
add
很容易明白 —— 添加挠说。git remote add
表示通知 Git 去添加一個(gè)遠(yuǎn)程倉(cāng)庫(kù)澡谭,后面接上的 origin
是這個(gè)倉(cāng)庫(kù)的小名,方便以后溝通损俭,通常默認(rèn)用 origin
來(lái)表示蛙奖;最后再接上遠(yuǎn)程倉(cāng)庫(kù)的地址,即你剛剛創(chuàng)建的 Github 倉(cāng)庫(kù)鏈接杆兵。
?? push 命令
push
顧名思義雁仲,就是推送, 使用 push
可以把本地倉(cāng)庫(kù)推送到遠(yuǎn)端倉(cāng)庫(kù)中琐脏。
具體命令如下:
git push origin master
執(zhí)行后攒砖,GitHub服務(wù)器 需要驗(yàn)證你的身份,按提示輸入你的用戶名和密碼即可完成 push 同步日裙。
?? 注意:在Linux 中輸入密碼是不可見的吹艇,輸完后直接按回車鍵即可。
CBI-IT-05@DESKTOP-5HSUPIA MINGW64 /d/project/demo (master)
$ git remote add origin https://github.com/cfe/demo.git
CBI-IT-05@DESKTOP-5HSUPIA MINGW64 /d/project/demo (master)
$ git push origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 211 bytes | 211.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/cfe/demo.git
* [new branch] master -> master
CBI-IT-05@DESKTOP-5HSUPIA MINGW64 /d/project/demo (master)
$gti
接下來(lái)就是見證奇跡的時(shí)刻 —— 再刷新你的 Github 倉(cāng)庫(kù)阅签,就會(huì)發(fā)現(xiàn)多了這些東西:
!??分支的概念:分支在多人協(xié)作中經(jīng)常會(huì)被用到掐暮,但前期我們用不到這個(gè)功能蝎抽,為了不給你增加認(rèn)知負(fù)擔(dān)政钟,這里就先不講了路克。你只需知道 Git 管理的項(xiàng)目進(jìn)程中,有一條默認(rèn)的主分支 - master
即可养交。(想象 Git 是一棵樹精算,master
就是樹干,樹干上還可以生出很多分支來(lái)碎连,如 master 2.0灰羽、master 3.0 等)
四、克隆 GitHub 上的倉(cāng)庫(kù)
本節(jié)實(shí)驗(yàn)最后一個(gè)知識(shí)點(diǎn)是 git clone
命令鱼辙,它可以幫你拷貝一個(gè) Git 倉(cāng)庫(kù)到本地廉嚼,讓自己能夠查看該項(xiàng)目,或者進(jìn)行修改倒戏。
如果你想要復(fù)制一個(gè)項(xiàng)目怠噪,看看代碼,或者把自己的遠(yuǎn)程倉(cāng)庫(kù)復(fù)制到本地杜跷,可以執(zhí)行命令:
git clone [url]
[url] 指的就是你想復(fù)制的倉(cāng)庫(kù)傍念,我們?cè)?github.com
上提供了一個(gè)名字為 gitproject
的公開倉(cāng)庫(kù), 供大家測(cè)試葛闷,現(xiàn)在你要把這個(gè)倉(cāng)庫(kù)復(fù)制到實(shí)驗(yàn)環(huán)境中憋槐,只需輸入:
$ git clone https://github.com/cfe/demo.git