超詳細(xì)!手把手帶你快速入門(mén) GitHub!
作者:Peter 編輯:JackTian
來(lái)源:公眾號(hào)「杰哥的IT之旅」
大家好,我是躍哥。GitHub 是平時(shí)學(xué)習(xí)優(yōu)秀代碼的途徑之一,在這里能看到世界上優(yōu)秀的開(kāi)源代碼,和世界各地的碼農(nóng)們交流,妥妥的交流圣地。
那今天,躍哥和大家分享下如何快速入門(mén) GitHub。
快速入門(mén)GitHub
GitHub在程序開(kāi)發(fā)領(lǐng)域家喻戶曉,現(xiàn)在幾乎整個(gè)互聯(lián)網(wǎng)的開(kāi)發(fā)者都將版本管理工具GitHub作為版本控制的首選,甚至像筆者這樣非開(kāi)發(fā)者,一名和每天和數(shù)據(jù)打交道的人也在使用GitHub,目的主要有:
查找資料:GitHub上有很多國(guó)內(nèi)外大神開(kāi)源的數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)的資料、代碼,筆者直接fork或者clone下來(lái)學(xué)習(xí)
技術(shù)交流:通過(guò)對(duì)開(kāi)源項(xiàng)目提出issue,能夠起到技術(shù)交流的效果
個(gè)人展示:現(xiàn)在互聯(lián)網(wǎng)領(lǐng)域中,如果一個(gè)程序員在GitHub上有一個(gè)很好的開(kāi)源項(xiàng)目,必定是會(huì)備受關(guān)注。因此GitHub實(shí)際上是一個(gè)很好的展示個(gè)人實(shí)力的舞臺(tái),或許它能夠讓你受到招聘人員的青睞
可以說(shuō),正式GitHub,讓社會(huì)化全員編程成為了現(xiàn)實(shí)。
既然好處頗多,作為互聯(lián)網(wǎng)界的一員,沒(méi)有理由不學(xué)好GitHub??本文將詳細(xì)介紹GitHub的相關(guān)基礎(chǔ)操作,帶你快速入門(mén)GitHub

版本管理
版本管理就是管理更新的歷史記錄。Git出現(xiàn)之前,人們主要是使用Subversion(簡(jiǎn)稱為SVN)作為版本控制的工具。
SVN
SVN是屬于集中型的版本管理系統(tǒng),其特點(diǎn)是將倉(cāng)庫(kù)集中存放在服務(wù)器中,所以只存在一個(gè)倉(cāng)庫(kù)。集中型將所有特點(diǎn)是方便管理,但是如果開(kāi)發(fā)者所處的環(huán)境無(wú)法聯(lián)網(wǎng),則無(wú)法獲取到最新的源碼,進(jìn)而無(wú)法進(jìn)行開(kāi)發(fā)工作。

Git
Git是分散型的版本管理系統(tǒng)。從下圖中我們可以觀察出來(lái),GitHub將倉(cāng)庫(kù)fork給每個(gè)用戶。fork的倉(cāng)庫(kù)和原始的倉(cāng)庫(kù)是兩個(gè)不同的倉(cāng)庫(kù),開(kāi)發(fā)者是可以隨意編輯的。
Fork的過(guò)程其實(shí)就是將某個(gè)倉(cāng)庫(kù)復(fù)制到自己的賬戶下

什么GitHub
GitHub是一個(gè)基于Git的代碼托管平臺(tái)。如果是付費(fèi)用戶可以建立自己的私人倉(cāng)庫(kù),一般用戶的話只能建立公用倉(cāng)庫(kù),也就是說(shuō)倉(cāng)庫(kù)的代碼必須是公開(kāi)的。到底Git和GitHub有什么區(qū)別呢?
在Git中,開(kāi)發(fā)者將源代碼存入名叫“Git倉(cāng)庫(kù)”的資料庫(kù)中,方便使用;而GitHub則是在網(wǎng)絡(luò)上提供Git倉(cāng)庫(kù)的一項(xiàng)服務(wù)
GitHub上公開(kāi)的源代碼都是通過(guò)Git進(jìn)行管理的。
安裝與配置Git
安裝
現(xiàn)在筆者使用的MacOS系統(tǒng),是自帶Git的。關(guān)于Windows系統(tǒng)下安裝,請(qǐng)參考如下文章,講解的非常詳細(xì)。
Windows系統(tǒng)Git安裝教程(詳解Git安裝過(guò)程):
https://www.cnblogs.com/xueweisuoyong/p/11914045.html
配置
首先需要設(shè)置使用Git時(shí)候的名字和郵箱,名字需要使用英文
git config --global user.name "Firstname Lastname" # 名稱
git config --global user.email "[email protected]" # 郵箱
# ~/.gitconfig中以如下形式輸出文件
[user]
name = Firstname Lastname
email = [email protected]
需要注意的是:
GitHub上公開(kāi)倉(cāng)庫(kù)的時(shí)候,名字和郵箱會(huì)一同被公開(kāi),所以請(qǐng)不要使用不便公開(kāi)的隱私信息
程序員來(lái)自世界各地,請(qǐng)使用英文,不要使用漢字;如果不想使用真名,可以使用網(wǎng)站的昵稱
如何提高命令輸出的可讀性?
git config --global color.ui auto # 將color.ui 設(shè)置成auto
創(chuàng)建賬戶
進(jìn)入創(chuàng)建用戶的頁(yè)面:http://github.com/join,填寫(xiě)如下的信息在點(diǎn)擊Create an accout即可

配置SSH
GitHub上連接現(xiàn)有倉(cāng)庫(kù)的認(rèn)證,是通過(guò)使用了SSH的公開(kāi)密鑰認(rèn)證方式進(jìn)行的?,F(xiàn)在我們需要?jiǎng)?chuàng)建公開(kāi)密鑰所需的SSH Key,并將其添加到GitHub。
ssh-keygen -t rsa -C # 創(chuàng)建SSH Key
接下來(lái)需要輸入兩次密碼,最終會(huì)生成兩個(gè)文件:
id_rsa:私有密鑰
id_rsa.pub:公開(kāi)密鑰
下面我們需要在GitHub中添加公開(kāi)密鑰,今后就可以使用私有密鑰進(jìn)行認(rèn)證。點(diǎn)擊右上角的賬戶設(shè)定按鈕:

進(jìn)入settings之后,添加新的SSH Key

接下來(lái)會(huì)出現(xiàn)Title和Key兩個(gè)輸入框,在Title中輸入適當(dāng)?shù)拿荑€名稱,Key部分復(fù)制上面id_rsa.pub文件中的內(nèi)容
cat ~/.ssh/id_rsa.pub # 查看內(nèi)容
添加完成之后,會(huì)在我們的郵箱中收到一封提示“公開(kāi)密鑰添加完成”的郵件,確認(rèn)即可。這樣便完成了整個(gè)手中的私人密鑰和GitHub的認(rèn)證和通信問(wèn)題,驗(yàn)證一下:
ssh -T [email protected]
在接下來(lái)的頁(yè)面中輸入密碼和yes即可完成驗(yàn)證。
建立倉(cāng)庫(kù)
首先我們必須明白一點(diǎn):倉(cāng)庫(kù)有兩種
遠(yuǎn)程在GitHub上的倉(cāng)庫(kù):遠(yuǎn)程倉(cāng)庫(kù)
在自己本地的倉(cāng)庫(kù):本地倉(cāng)庫(kù)
本文是以MacOS系統(tǒng)為例,基于Linux;如果是想學(xué)習(xí)Windows下的倉(cāng)庫(kù)創(chuàng)建,請(qǐng)參考下文,講解的很詳細(xì):
Git使用(10分鐘入門(mén)):
https://www.jianshu.com/p/09f243768cf6
遠(yuǎn)程倉(cāng)庫(kù)
1、建立遠(yuǎn)程倉(cāng)庫(kù)需要我們先登陸自己的GitHub賬號(hào),再進(jìn)行建倉(cāng)。

2、我們創(chuàng)建一個(gè)git_start的倉(cāng)庫(kù)
倉(cāng)庫(kù)的名字
倉(cāng)庫(kù)的簡(jiǎn)單描述
不要在遠(yuǎn)程倉(cāng)庫(kù)添加README.md文件。我們使用手動(dòng)push的方式來(lái)添加

3、倉(cāng)庫(kù)解釋
打開(kāi)上面我們創(chuàng)建好的倉(cāng)庫(kù),會(huì)出現(xiàn)如下的內(nèi)容(先寫(xiě)上注釋?zhuān)竺媛忉專(zhuān)?/p>
echo "# git_start" >> README.md # 往README.md中寫(xiě)入內(nèi)容
git init # 初始化
git add README.md # 添加文件
git commit -m "first commit" # 提交并注釋
git branch -M main # 提交分支
git remote add origin [email protected]:pidada/git_start.git # 建立遠(yuǎn)程倉(cāng)庫(kù)與本地倉(cāng)庫(kù)的連接
git push -u origin main # 推送

本地倉(cāng)庫(kù)
1、建立本地倉(cāng)庫(kù)
所謂的本地倉(cāng)庫(kù),就是你自己電腦客戶端的倉(cāng)庫(kù)。同樣地,筆者在本地建立了同樣名字的本地倉(cāng)庫(kù)
git_start,其實(shí)就是個(gè)文件夾
本地倉(cāng)庫(kù)要和遠(yuǎn)程倉(cāng)庫(kù)保持一致
mkdir git_start # 創(chuàng)建文件夾,即倉(cāng)庫(kù)
cd git_start # 切換到倉(cāng)庫(kù)中
ls # 查看內(nèi)容,目前是沒(méi)有任何內(nèi)容

2、初始化操作
echo "學(xué)習(xí)GitHub的使用,快速入門(mén)" >> README.md # 往文件中寫(xiě)入內(nèi)容,后面可以更改
git init # 初始化

初始化之后會(huì)在當(dāng)前目錄下自動(dòng)生成一個(gè).git的文件。這個(gè)文件下存儲(chǔ)著管理當(dāng)前目錄內(nèi)容所需要的倉(cāng)庫(kù)數(shù)據(jù)
3、查看待提交文檔
通過(guò)ls查看已經(jīng)有了README.md文檔
git status # 查看待提交的文檔

4、提交文檔
我們將上面的README.md文檔和生成的.git文檔一并提交
git add . # 提交全部文件
git add README.md # 單獨(dú)提交一個(gè)文件
git commmit -m "2021-1-1" # commit提交,同時(shí)寫(xiě)上備注:2021-1-1
# add 和 commit的同步操作
git commit -am "2021-1-1"
注意:執(zhí)行了add操作,文件還沒(méi)有被上傳到Git遠(yuǎn)程倉(cāng)庫(kù)中,只是提交到了緩存區(qū)域
git commit -m "2021-1-1"才是真正地提交內(nèi)容,同時(shí)寫(xiě)上備注:將文件從緩存區(qū)提交到遠(yuǎn)程
5、建立遠(yuǎn)程倉(cāng)庫(kù)連接并推送
git remote add origin [email protected]:peter/git_start.git # 建立連接
git push -u origin master # 推送到master分支

6、檢查
此時(shí)我們刷新遠(yuǎn)程倉(cāng)庫(kù)的頁(yè)面,會(huì)發(fā)現(xiàn)頁(yè)面更新了,也有了內(nèi)容:

7、查看提交日志
git log # 查看提交日志
git log --pretty=short # 只顯示一行簡(jiǎn)述信息
git log README.md # 只顯示指定目錄、文件的日志
git log -p README.md # 只顯示指定目錄、文件的日志修改前后的改動(dòng)
commit欄旁邊顯示的是指向這個(gè)提交的哈希值。Git的其他命令中,在指向提交時(shí)會(huì)用到這個(gè)哈希值
Author欄旁邊是Git設(shè)置的用戶名和郵箱地址
Date欄顯示的是執(zhí)行日期和時(shí)間
最下面是提交信息,-m 參數(shù)后面的信息

8、修改README.md文件
通過(guò)vim編輯器修改內(nèi)容如下:

上面使用了Markdown語(yǔ)法,然后我們重新按照上面的命令執(zhí)行一遍:
git status # 狀態(tài)是紅色
git add . # 提交到緩存區(qū)
git commit -m "修改README.md" # 記錄提交信息
# git remote add origin [email protected]:peter/git_start.git # 已經(jīng)建立了連接,所以不必在執(zhí)行此命令
git push -u origin master # 推到master分支

回顧下整個(gè)操作的過(guò)程:
建立遠(yuǎn)程倉(cāng)庫(kù)
建立本地倉(cāng)庫(kù)
初始化本地倉(cāng)庫(kù)
文檔提交到緩存區(qū)
緩存區(qū)推送到遠(yuǎn)程倉(cāng)庫(kù)
重要命令
我們總結(jié)一下上面操作中幾個(gè)重要的命令:
1、git status
查看倉(cāng)庫(kù)中文件的狀態(tài)。如果有新的文件或者原來(lái)的文件有修改過(guò),會(huì)出現(xiàn)紅色
2、git add
向緩存區(qū)中添加內(nèi)容,緩存區(qū)是提交之前的一個(gè)臨時(shí)區(qū)域(Stage或者Index)
3、git commit [-m]
將暫存區(qū)中的文件保存?zhèn)}庫(kù)的歷史記錄中;-m參數(shù)后面跟上提交信息:git commit -m "第一次提交"
4、git log
查看以往提交日志信息:什么人在什么時(shí)候進(jìn)行了提交或者合并等,以及操作前后有怎樣的差別
git log # 查看日志
git log --pretty=short # 只顯示提交信息的第一行
git log README.md # 查看某個(gè)文件的提交信息
git log -p README.md # -p參數(shù)只查看提交的改動(dòng)部分
5、git diff
查看工作樹(shù)、暫存區(qū)、最新提交之間的差別。
git diff # 查看當(dāng)前工作樹(shù)和暫存區(qū)的差別
git diff HEAD # 查看本次提交和上次提交的差別;HEAD指向當(dāng)前分支中的最新一次提交的指針
養(yǎng)成習(xí)慣:git commit之前先執(zhí)行g(shù)it diff HEAD命令來(lái)查看本次提交與上次提交之間的差別;HEAD指向當(dāng)前分支中最新的一次提交的指針。
6、倉(cāng)庫(kù)操作
-u作用:將來(lái)運(yùn)行g(shù)it pull命令從遠(yuǎn)程倉(cāng)庫(kù)獲取內(nèi)容時(shí),本地倉(cāng)庫(kù)就可以直接從origin的master分支中獲取內(nèi)容,不需要添加其他的參數(shù)
git remote add origin [email protected]:github/peter/git_start.git # 添加遠(yuǎn)程倉(cāng)庫(kù)
git push # 推送到遠(yuǎn)程倉(cāng)庫(kù)
git push -u origin master # 推送到master分支下
git push -u origin feature_A # 推送到分支A
git clone 倉(cāng)庫(kù)地址 # 將某個(gè)遠(yuǎn)程倉(cāng)庫(kù)的內(nèi)容復(fù)制到本地
git push # 推送
git pull # 獲取最新的遠(yuǎn)程分支內(nèi)容
分支
master分支
master分支是Git默認(rèn)創(chuàng)建的分支,其他所有的分支都是在這個(gè)分支的基礎(chǔ)上進(jìn)行的。
不同的分支單獨(dú)進(jìn)行各自的作業(yè)
該分支的作業(yè)完成之后再和master分支合并

進(jìn)行完作業(yè)之后的合并操作:

分支相關(guān)命令
1、git branch-顯示分支
顯示分支一覽表:將分支名列表顯示出來(lái),同時(shí)確認(rèn)當(dāng)前所在的分支;標(biāo)有星號(hào)*表示當(dāng)前分支
git branch -a # 查看當(dāng)前分支的相關(guān)信息
2、git branch feature-創(chuàng)建分支
git branch feature
3、git checkout feature-切換分支
git checkout feature
git checkout master # 切換到master分支
git checkout - # 切換到上一個(gè)分支
上面兩個(gè)命令的合并,創(chuàng)建新的分支并切換到新的分支:
git checkout -b feature # 切換到創(chuàng)建的新分支
4、git merge-合并分支
假設(shè)某個(gè)分支已經(jīng)完成了作業(yè)需要和主分支master合并,使用如下語(yǔ)句:
git checkout master # 切到主分支
git merge --no-off feature-A # 合并分支
5、git log —graph-圖的形式查看分支
通過(guò)圖表的形式查看提交的內(nèi)容
git log --graph

版本回溯
既然是版本控制系統(tǒng),那么對(duì)于不同版本的管理肯定是至關(guān)重要的。GitHub的另一個(gè)特征便是可以靈活地操作不同的歷史版本。借助分散倉(cāng)庫(kù)的優(yōu)勢(shì),可以在不影響其他倉(cāng)庫(kù)的前提下對(duì)歷史版本進(jìn)行操作。
1、回溯到指定狀態(tài)
哈希值只要輸入4位以上就可以執(zhí)行了
git reset --hard [哈希值] # 添加指定的哈希值,代表某個(gè)時(shí)間點(diǎn)的狀態(tài)
2、查看當(dāng)前倉(cāng)庫(kù)的全部執(zhí)行過(guò)的操作日志
記錄我們操作的每次命令
git reflog # 針對(duì)當(dāng)前倉(cāng)庫(kù)
git log # 查看以當(dāng)前狀態(tài)為終點(diǎn)的歷史日志

所以我們可以先通過(guò)git reflog來(lái)查看哈希值,再通過(guò)git reset —hard [哈希值]回到某個(gè)狀態(tài)
3、修改上一條提交信息
使用git commit --amend命令
git commit --amend
4、壓縮歷史
在合并特性分支之前,如果發(fā)現(xiàn)已經(jīng)提交的內(nèi)容中有拼寫(xiě)等錯(cuò)誤,可以先提交一個(gè)修改,然后將這個(gè)修改包含到前一個(gè)提交之中,壓縮成一個(gè)歷史記錄
git rebase -i
git rebase -i HEAD~2 # 當(dāng)前分支下的兩個(gè)最新歷史記錄進(jìn)行壓縮
5、添加提交一次完成
git commit -am "add和commit同時(shí)完成"
git reset詳解
命令
對(duì)版本回溯命令的詳解。git reset 命令用于回退版本,可以指定回退到某個(gè)具體的歷史版本。
git reset 命令語(yǔ)法格式具體如下:
git reset [--soft | --mixed | --hard] [HEAD]
--mixed是默認(rèn)參數(shù),可以不帶,用于重置暫存區(qū)的文件與上一次的提交(commit)保持一致,工作區(qū)文件內(nèi)容保持不變
soft
--soft參數(shù)用于回退到某個(gè)版本
git reset --soft HEAD # 回退到上個(gè)版本
git reset --soft HEAD~3 # 回退到上上上個(gè)版本
hard??
?。。??謹(jǐn)慎使用--hard 參數(shù),它會(huì)刪除回退點(diǎn)之前的所有信息
git reset --hard HEAD~3 # 回退到上上上個(gè)版本
git reset --hard 1de43 # 回退到指定版本
git reset --hard origin/master # 本地狀態(tài)回退到和遠(yuǎn)程相同
HEAD
git reset HEAD^ # 回退到所有內(nèi)容的上一個(gè)版本
git reset HEAD^ Git入門(mén).md # 回退到Git入門(mén).md文件的版本的上一個(gè)版本(指定版本的上個(gè)版本)
git reset 01b42 # 回退到指定版本,需要至少哈希值的前4位;可以通過(guò)git reflog命令先查看我們要回退的版本號(hào)的哈希值
git reset HEAD還能取消已緩存的內(nèi)容。當(dāng)我們對(duì)某個(gè)文件的內(nèi)容進(jìn)行了修改并且已經(jīng)執(zhí)行git add之后,我們想取消緩存區(qū)的內(nèi)容,使用如下命令:
git reset HEAD [filename]

關(guān)于HEAD 說(shuō)明:
HEAD 表示當(dāng)前版本
HEAD^ 上一個(gè)版本
HEAD^^ 上上一個(gè)版本
HEAD^^^ 上上上一個(gè)版本
以此類(lèi)推…
可以使用 ~數(shù)字表示
HEAD~0 表示當(dāng)前版本
HEAD~1 上一個(gè)版本
HEAD^2 上上一個(gè)版本
HEAD^3 上上上一個(gè)版本
以此類(lèi)推…
總結(jié)
HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們?cè)诎姹镜臍v史之間穿梭,使用命令git reset --hard commit_id。穿梭前,用
git log可以查看提交歷史,以便確定要回退到哪個(gè)版本。要重返未來(lái),用
git reflog查看命令歷史,以便確定要回到未來(lái)的哪個(gè)版本。

0、重磅!兩萬(wàn)字長(zhǎng)文總結(jié),梳理 Java 入門(mén)進(jìn)階哪些事(推薦收藏)

