崩潰恬口!實習生把小組的代碼倉庫搞得一團糟校读。。祖能。

大家好歉秫,我是二哥呀!

這篇文章的靈感來源于阿秀的一篇關(guān)于 Git 倉庫的文章养铸,當時看完后挺感慨的雁芙。阿秀是我河南老鄉(xiāng),目前在字節(jié)工作钞螟,他的成長經(jīng)歷非常的勵志兔甘。

對于新手來說,Git 操作確實容易給代碼的版本庫帶來一些不必要的混亂鳞滨,畢竟大學的時候洞焙,學習的重點在編程語言上,在計算機基礎(chǔ)上拯啦∶龌蓿可一旦參加了工作,就必須得在代碼版本庫上狠下一番功夫了提岔,畢竟要多人運動啊仙蛉,不,多人協(xié)作啊碱蒙。

恰好二哥最近在連載 Git 方面的一系列文章荠瘪,這篇就來手把手地教大家重溫一下 Git 的基本使用。嗯赛惩,我聞到了收藏夾吃灰的味道~

為了能在一周內(nèi)把 Git 這條線學好哀墓,我勸你最好把前面 4 個章節(jié)回顧一下:

由于公眾號的文章發(fā)布后不能修改,也沒辦法加個統(tǒng)一的目錄作為索引頁季惯,所以二哥就把《Java 程序員進階之路》的系列文章開源到了 GitHub(點擊閱讀原文可以直接跳轉(zhuǎn)):

https://github.com/itwanger/toBeBetterJavaer

每天看著 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 addgit 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 addgit 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驼修,一起剝皮案震驚了整個濱河市殿遂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乙各,老刑警劉巖墨礁,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耳峦,居然都是意外死亡恩静,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門蹲坷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驶乾,“玉大人,你說我怎么就攤上這事循签〖独郑” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵县匠,是天一觀的道長风科。 經(jīng)常有香客問我撒轮,道長,這世上最難降的妖魔是什么贼穆? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任题山,我火速辦了婚禮,結(jié)果婚禮上故痊,老公的妹妹穿的比我還像新娘臀蛛。我一直安慰自己,他們只是感情好崖蜜,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布浊仆。 她就那樣靜靜地躺著,像睡著了一般豫领。 火紅的嫁衣襯著肌膚如雪抡柿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天等恐,我揣著相機與錄音洲劣,去河邊找鬼。 笑死课蔬,一個胖子當著我的面吹牛囱稽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播二跋,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼战惊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扎即?” 一聲冷哼從身側(cè)響起吞获,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谚鄙,沒想到半個月后各拷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡闷营,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年烤黍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傻盟。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡速蕊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莫杈,到底是詐尸還是另有隱情互例,我是刑警寧澤奢入,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布筝闹,位于F島的核電站媳叨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏关顷。R本人自食惡果不足惜糊秆,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望议双。 院中可真熱鬧痘番,春花似錦、人聲如沸平痰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宗雇。三九已至昂芜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赔蒲,已是汗流浹背泌神。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舞虱,地道東北人欢际。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像矾兜,于是被迫代替她去往敵國和親损趋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容