大家好歉秫,我是二哥呀!
這篇文章的靈感來源于阿秀的一篇關(guān)于 Git 倉庫的文章养铸,當時看完后挺感慨的雁芙。阿秀是我河南老鄉(xiāng),目前在字節(jié)工作钞螟,他的成長經(jīng)歷非常的勵志兔甘。
對于新手來說,Git 操作確實容易給代碼的版本庫帶來一些不必要的混亂鳞滨,畢竟大學的時候洞焙,學習的重點在編程語言上,在計算機基礎(chǔ)上拯啦∶龌蓿可一旦參加了工作,就必須得在代碼版本庫上狠下一番功夫了提岔,畢竟要多人運動啊仙蛉,不,多人協(xié)作啊碱蒙。
恰好二哥最近在連載 Git 方面的一系列文章荠瘪,這篇就來手把手地教大家重溫一下 Git 的基本使用。嗯赛惩,我聞到了收藏夾吃灰的味道~
為了能在一周內(nèi)把 Git 這條線學好哀墓,我勸你最好把前面 4 個章節(jié)回顧一下:
- 可能是 Git 歷史上最偉大的一次代碼提交
- 終于有人把 Git 的數(shù)據(jù)模型講清楚了
- 昨晚看完 Linus 第一次提交的 Git 代碼后,我失眠了喷兼!
- 要熟練使用 Git篮绰,恐怕要記住這60個命令
由于公眾號的文章發(fā)布后不能修改,也沒辦法加個統(tǒng)一的目錄作為索引頁季惯,所以二哥就把《Java 程序員進階之路》的系列文章開源到了 GitHub(點擊閱讀原文可以直接跳轉(zhuǎn)):
每天看著 star 數(shù)(目前已有 808 個 star)的上漲我心里非常的開心吠各,希望越來越多的 Java 愛好者能因為這個開源項目而受益臀突,而越來越多人的 star,也會激勵我繼續(xù)更新下去~
一贾漏、創(chuàng)建倉庫
倉庫候学,也就是 repository,可以簡單理解為一個目錄纵散,這個目錄里面的所有文件都將被 Git 管理起來梳码,每個文件的一舉一動,都將被 Git 記錄下來伍掀,以便在任何時刻進行追蹤和回滾掰茶。
新建一個文件夾,比如說 testgit蜜笤,然后使用 git init
命令就可以把這個文件夾初始化為 Git 倉庫了符匾。
初始化Git 倉庫成功后,可以看到多了一個 .git 的目錄瘩例,沒事不要亂動,免得破壞了 Git 倉庫的結(jié)構(gòu)甸各。
接下來垛贤,我們來新增一個文件 readme.txt,內(nèi)容為“老鐵趣倾,記得給二哥三連啊”聘惦,并將其提交到 Git 倉庫。
第一步儒恋,使用 git add
命令將新增文件添加到暫存區(qū)善绎。
第二步,使用 git commit
命令告訴 Git诫尽,把文件提交到倉庫禀酱。
可以使用 git status
來查看是否還有文件未提交。
也可以在文件中新增一行內(nèi)容“傳統(tǒng)美德不能丟牧嫉,記得點贊哦~”剂跟,再使用 git status
來查看結(jié)果。
如果想查看文件到底哪里做了修改酣藻,可以使用 git diff
命令:
確認修改的內(nèi)容后曹洽,可以使用 git add
和 git commit
再次提交。
二辽剧、版本回滾
再次對文件進行修改送淆,追加一行內(nèi)容為:“xxx,我愛你?”怕轿,并且提交到 Git 倉庫偷崩。
現(xiàn)在我已經(jīng)對 readme.txt 文件做了三次修改了辟拷。可以通過 git log
命令來查看歷史記錄:
也可以通過 gitk
這個命令來啟動圖形化界面來查看版本歷史环凿。
如果想回滾的話梧兼,比如說回滾到上一個版本,可以執(zhí)行以下兩種命令:
1)git reset --hard HEAD^
智听,上上個版本就是 git reset --hard HEAD^^
羽杰,以此類推。
2)git reset --hard HEAD~100
到推,如果回滾到前 100 個版本考赛,用這個命令比上一個命令更方便。
那假如回滾錯了莉测,想恢復(fù)颜骤,不記得版本號了,可以先執(zhí)行 git reflog
命令查看版本號:
然后再通過 git reset --hard
命令來恢復(fù):
三捣卤、工作區(qū)和暫存區(qū)的區(qū)別
工作區(qū)和暫存區(qū)的概念其實在前面的章節(jié)里強調(diào)過了忍抽,但考慮到有些小伙伴在 git add
和 git commit
命令之間仍然有一些疑惑,我們這里就再強調(diào)一次——學習知識就是這樣董朝,只有不厭其煩地重復(fù)鸠项,才能真正地理解和掌握。
1)工作區(qū)子姜,比如說前面提到的 testgit 目錄就屬于工作區(qū)祟绊,我們操作的 readme.txt 文件就放在這個里面。
2)暫存區(qū)哥捕,隱藏目錄 .git 不屬于工作區(qū)牧抽,它(Git 倉庫)里面存了很多東西,其中最重要的就是暫存區(qū)遥赚。
Git 在提交文件的時候分兩步扬舒,第一步 git add
命令是把文件添加到暫存區(qū),第二步 git commit
才會把暫存區(qū)的所有內(nèi)容提交到 Git 倉庫中凫佛。
“為什么要先 add 才能 commit 呢呼巴?”
最直接的原因就是Linus 搞了這個“暫存區(qū)”的概念。那為什么要搞這個概念呢御蒲?沒有暫存區(qū)不行嗎衣赶?
嗯,要回答這個問題厚满,我們就需要追本溯源了府瞄。
在 Git 之前, SVN 是代碼版本管理系統(tǒng)的集大成者。SVN 比之前的 CVS 更優(yōu)秀的一點是遵馆,每次的提交可以由多個文件組成鲸郊,并且這次提交是原子性的,要么全部成功货邓,要么全部失敗弦叶。
原子性帶來的好處是顯而易見的召边,這使得我們可以把項目整體還原到某個時間點,就這一點,SVN 就完虐 CVS 這些代碼版本管理系統(tǒng)了茫舶。
Git 作為逼格最高的代碼版本管理系統(tǒng)虫埂,自然要借鑒 SVN 這個優(yōu)良特性的房资。但不同于 SVN 的是队塘,Git 一開始搞的都是命令行,沒有圖形化界面觉吭,如果想要像 SVN 那樣一次性選擇多個文件或者不選某些文件(見上圖)腾供,還真特喵的是個麻煩事。
對于像 Linus 這種天才級選手來說鲜滩,圖形化界面無疑是 low 逼伴鳖,可命令行在這種情況下又實在是麻煩~
嗯,怎么辦呢徙硅?
神之所以為神榜聂,就是他能在遇到問題的時候想到完美的解決方案——搞個暫存區(qū)不就完事了?
暫存區(qū)可以隨意地將各種文件的修改放進去闷游,只需要通過 git add
這種簡單的命令就可以精心地挑選要提交哪些文件了,然后再一次性(原子性)的 git commit
到版本庫贴汪,所有的問題都迎刃而解嘛脐往。
我們在 testgit 目錄下再新增一個文件 readyou.txt,內(nèi)容為“二哥扳埂,我要和你約飯~~~”业簿;并且在 readme.txt 文件中再追加一行內(nèi)容“點贊、在看阳懂、留言梅尤、轉(zhuǎn)發(fā)一條龍服務(wù)~”。
我們先用 git status
命令查看一下狀態(tài)岩调,再用 git add
將文件添加到暫存區(qū)巷燥,最后再用 git commit
一次性提交到 Git 倉庫。
四号枕、撤銷修改
現(xiàn)在缰揪,我在 readyou.txt 文件中追加了一行內(nèi)容:“二哥,我想和你約會~~~”葱淳。在我想要提交的時候钝腺,突然發(fā)現(xiàn)追加的內(nèi)容有誤抛姑,我得恢復(fù)到以前的版本,該怎么辦呢艳狐?
1)我知道要修改的內(nèi)容定硝,直接修改,然后 add 和 commit 覆蓋毫目。
2)我忘記要修改哪些內(nèi)容了蔬啡,通過 git reset -- hard HEAD
恢復(fù)到上一個版本。
還有其他辦法嗎蒜茴?
答案當然是有了星爪,其實在我們執(zhí)行 git status
命令查看 Git 狀態(tài)的時候,結(jié)果就提示我們可以使用 git restore
命令來撤銷這次操作的粉私。
那其實在 git version 2.23.0 版本之前顽腾,是可以通過 git checkout
命令來完成撤銷操作的。
checkout 可以創(chuàng)建分支诺核、導出分支抄肖、切換分支、從暫存區(qū)刪除文件等等窖杀,一個命令有太多功能就容易讓人產(chǎn)生混淆漓摩。2.23.0 版本改變了這種混亂局面,git switch 和 git restore 兩個新的命令應(yīng)運而生入客。
switch 專注于分支的切換管毙,restore 專注于撤銷修改。
五桌硫、遠程倉庫
Git 是一款分布式版本控制系統(tǒng)夭咬,所以同一個 Git 倉庫,可以分布到不同的機器上铆隘。一開始卓舵,只有一臺機器和一個原始版本庫,往后去膀钠,別的機器就可以從這臺機器上拷貝原始版本掏湾,就像黑客帝國里的那個特工史密斯一樣,沒有任何區(qū)別肿嘲。
這也是 Git 比集中式版本控制系統(tǒng) SVN 特別的地方之一融击。
我們可以自己搭建一臺每天 24 小時可以運轉(zhuǎn)的 Git 服務(wù)器,然后其他人就從這臺“服務(wù)器”中拷貝就行了雳窟。不過砚嘴,因為 GitHub 的存在,自主搭建 Git 服務(wù)器這個步驟就可以省了。
從名字上就可以看得出來际长,GitHub 是用來提供 Git 倉庫托管服務(wù)的耸采,我們只需要注冊一個 GitHub 賬號,就可以免費獲取一臺每天可以運轉(zhuǎn) 24 小時的 Git 遠程服務(wù)器工育。
那其實在 GitHub 上有對應(yīng)的中文幫助文檔虾宇,來介紹如何通過 SSH 協(xié)議將本機和 GitHub 鏈接起來,從而不必在每次訪問時提供用戶名和密碼如绸。
https://docs.github.com/cn/authentication/connecting-to-github-with-ssh/about-ssh
第一步嘱朽,通過 ls -al ~/.ssh
命令檢查 SSH 密鑰是否存在
如果沒有 id_rsa.pub、id_ecdsa.pub怔接、id_ed25519.pub 這 3 個文件搪泳,表示密鑰不存在。
第二步扼脐,生成新 SSH 密鑰
執(zhí)行以下命令岸军,注意替換成你的郵箱:
ssh-keygen -t ed25519 -C "your_email@example.com
然后一路回車:
記得復(fù)制一下密鑰,在 id_ed25519.pub 文件中:
第三步瓦侮,添加 SSH 密鑰到 GitHub 帳戶
在個人賬戶的 settings 菜單下找到 SSH and GPG keys艰赞,將剛剛復(fù)制的密鑰添加到 key 這一欄中,點擊「add SSH key」提交肚吏。
Title 可不填寫方妖,提交成功后會列出對應(yīng)的密鑰:
為什么 GitHub 需要 SSH 密鑰呢?
因為 GitHub 需要確認是“你本人”在往你自己的遠程倉庫上提交版本的罚攀,而不是別人冒充的党觅。
第四步,在 GitHub 上創(chuàng)建個人倉庫
點擊新建倉庫斋泄,填寫倉庫名稱等信息:
第五步杯瞻,把本地倉庫同步到 GitHub
復(fù)制遠程倉庫的地址:
在本地倉庫中執(zhí)行 git remote add
命令將 GitHub 倉庫添加到本地:
當我們第一次使用Git 的 push 命令連接 GitHub 時,會得到一個警告??:
The authenticity of host 'github.com (20.205.243.166)' can't be established.
ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
這是因為需要你手動確認是己,輸入 yes 即可又兵。
接下來任柜,我們使用 git push
命令將當前本地分支推送到 GitHub卒废。加上了 -u 參數(shù)后,Git 不但會把本地的 master 分支推送的遠程 master 分支上宙地,還會把本地的 master 分支和遠程的master 分支關(guān)聯(lián)起來摔认,在以后的推送或者拉取時就可以簡化命令(比如說 git push github master
)。
此時宅粥,我們刷一下 GitHub参袱,可以看到多了一個 master 分支,并且本地的兩個文件都推送成功了!
從現(xiàn)在開始抹蚀,只要本地做了修改剿牺,就可以通過 git push
命令推送到 GitHub 遠程倉庫了。
還可以使用 git clone
命令將遠程倉庫拷貝到本地环壤。比如說我現(xiàn)在有一個 3.4k star 的倉庫 JavaBooks晒来,
然后我使用 git clone
命令將其拷貝到本地。
好了郑现,關(guān)于 Git 的基本操作湃崩,我們就先講到這里,希望給有需要的讀者一點點幫助和啟發(fā)接箫,我們下期見~
沒有什么使我停留——除了目的攒读,縱然岸旁有玫瑰、有綠蔭辛友、有寧靜的港灣薄扁,我是不系之舟。
推薦閱讀:
參考鏈接1:https://www.zhihu.com/question/19946553
參考鏈接2:https://www.zhihu.com/question/41667536/answer/486640083