Git使用教程(帶你玩轉(zhuǎn)GitHub)
下載安裝:
按照這個(gè)博客來(lái)就好
最小配置:
在桌面右鍵點(diǎn)擊Git Bash Here進(jìn)入命令行,GUI我們不常用。

首先要設(shè)置你的用戶名稱和 e-mail 地址, 因?yàn)槊看?Git 提交都會(huì)使用該信息
開(kāi)始配置你的用戶名和郵箱,單引號(hào)中間隨便填你的信息即可,最后用 git config --system --list 查看當(dāng)前用戶配置,該指令顯示的就是 C:\Users\windows.gitconfig 內(nèi)容(后面再來(lái)說(shuō)這是什么文件)

?指令成功執(zhí)行后,在C:\Users\windows.gitconfig會(huì)生成一個(gè)文件 ,打開(kāi)之后就是你剛剛配置的玩意

OK配置完基本信息,來(lái)講一下理論知識(shí),然后再開(kāi)始教大家具體的操作。
Git 工作原理 [ 重要 ] :
四大工作區(qū)域:
Git 本地有三個(gè)工作區(qū)域:
-
工作區(qū)(Working Directory)
-
暫存區(qū)(Stage/Index)
-
倉(cāng)庫(kù)區(qū) (Repository)
-
再加上遠(yuǎn)程的 git 倉(cāng)庫(kù)(Remote Directory) 就可以分為四個(gè)工作區(qū)域
具體說(shuō)明一下:
-
工作區(qū):就是你平時(shí)存放代碼的地方
-
暫存區(qū):用于臨時(shí)存放你的改動(dòng),事實(shí)上它只是一個(gè)文件,保存即將提交到文件列表信息
-
倉(cāng)庫(kù)區(qū)(本地倉(cāng)庫(kù)):就是安全存放數(shù)據(jù)的位置,這里面有你提交到所有版本的數(shù)據(jù)
-
遠(yuǎn)程倉(cāng)庫(kù):就是托管代碼的服務(wù)器(比如 Github/Gitee),也可以簡(jiǎn)單的認(rèn)為是一臺(tái)用于遠(yuǎn)程數(shù)據(jù)交換的電腦
一圖勝千言:4個(gè)區(qū)域之間要使用到的指令

需要注意的是,clone的作用類似pull,但是還是有點(diǎn)區(qū)別的,具體文章看這里就好。(我們一般從GitHub上獲取別人的代碼用的都是clone)
實(shí)踐:
建 Git 倉(cāng)庫(kù)
-
在已經(jīng)有項(xiàng)?代碼的文件夾里建Git倉(cāng)庫(kù)
-
在已有的項(xiàng)目代碼文件夾處右鍵,點(diǎn)擊Git Bash Here進(jìn)入命令行輸入 git init ,然后就會(huì)出現(xiàn)一個(gè)隱藏的文件夾 .git
-

-
-
在不存在的代碼的文件夾中建Git倉(cāng)庫(kù)
-
前面操作相同,指令改成輸入 git init [自定義項(xiàng)目名] 即可,然后在idea新建項(xiàng)目時(shí)使用這個(gè)文件夾就好了。
-

-
克隆遠(yuǎn)程倉(cāng)庫(kù)
就是將遠(yuǎn)程服務(wù)器上的倉(cāng)庫(kù)完全鏡像一份至本地,這里我們拿JavaGuide的作為示范,如果我們想要獲取到他的開(kāi)源文件,我們只需要在你想要保存clone下來(lái)的文件的地方右鍵點(diǎn)擊Git Bash Here進(jìn)入命令行輸入 git clone [URL]

隨便找個(gè)文件夾,我們輸入git clone 加上復(fù)制下來(lái)他的URL,等進(jìn)度條到100%即可(如果沒(méi)有魔法的話可能會(huì)很慢甚至失敗)再細(xì)我就不好明說(shuō)了,如果實(shí)在不知道魔法是什么的小白,具體可以找置頂文章聯(lián)系我。

文件操作指令
先來(lái)介紹文件的4大狀態(tài):
-
Untracked: 未跟蹤,在文件夾中,,但并沒(méi)有加入到 git 庫(kù),,不參與版本控制,需要通過(guò) git add 狀態(tài)變?yōu)?Staged
-
Unmodify: 未修改,文件已經(jīng)入庫(kù),而且與工作區(qū)的內(nèi)容相同。
-
如果想要把他移出版本庫(kù),可以使用 git rm 移出去不再同步
-
如果被修改了,就會(huì)變成 Modified 已修改狀態(tài)
-
-
Modified: 已修改,這種文件有兩個(gè)去處
-
可以使用 git add 將其加入暫存區(qū)
-
也可以使用 git checkout 丟棄修改過(guò)的內(nèi)容,返回到剛剛 未修改 的狀態(tài)(即從庫(kù)中取出文件,覆蓋當(dāng)前已修改的文件)
-
-
Staged: 暫存狀態(tài),同樣,也有兩個(gè)去處
-
執(zhí)行 git commit 則將其同步到庫(kù)中,此時(shí)版本庫(kù)與工作區(qū)一致,變成未修改狀態(tài)
-
執(zhí)行 git reset HEAD filename 取消暫存, 文件狀態(tài)變?yōu)橐研薷臓顟B(tài)
-
實(shí)踐一下吧
找到剛剛建好git倉(cāng)庫(kù)的文件夾,還是打開(kāi)git bash here 輸入git status [文件名] ,可以先寫(xiě)個(gè)幾個(gè)字母然后按tab鍵一鍵補(bǔ)全文件名。比如說(shuō)這里就是先寫(xiě)個(gè) s 然后按 tab 就會(huì)自動(dòng)出來(lái) src/ 了

用 git add 加入暫存區(qū)

然后就可以開(kāi)始提交至本地倉(cāng)庫(kù)了,使用 git commit -m "自定義一些需要攜帶的信息"

可以看到如果我們?cè)儆?git status 來(lái)查看狀態(tài)的話,會(huì)提示沒(méi)有什么需要提交的了。
忽略文件
實(shí)際需求:我們不想把某些文件納入版本控制中, 如何處理?
這塊內(nèi)容都是一些配置,可以直接看這篇文章就好了
具體這個(gè)文件在哪呢,一般在idea文件夾下


打開(kāi)之后可以打開(kāi)上面的網(wǎng)址對(duì)照的文件學(xué)一下每一行是什么意思,這里我就不再細(xì)說(shuō)了。

創(chuàng)建自己的遠(yuǎn)程倉(cāng)庫(kù)
這里我們使用GitHub,如果沒(méi)有魔法也可以使用Gitee,但是Gitee還要實(shí)名認(rèn)證什么的也挺麻煩。實(shí)際兩個(gè)都差不多操作,這里就用GitHub進(jìn)行講解。
首先是打開(kāi)GitHub官網(wǎng)注冊(cè)一個(gè)自己的賬號(hào)好吧,這里就是正常注冊(cè)賬號(hào)的流程,自己跟著官方指導(dǎo)鼓搗鼓搗就好了。當(dāng)然,這里為了照顧一些看到英文就頭大的同學(xué),還是貼個(gè)教程給你們吧。
之后就可以在右上角開(kāi)始創(chuàng)建我們自己的倉(cāng)庫(kù)了,這里借用官方文檔的配圖

為倉(cāng)庫(kù)寫(xiě)一個(gè)簡(jiǎn)短好記的名稱

設(shè)置為開(kāi)源還是私有

勾選自動(dòng)創(chuàng)建readme文件,.gitignore我們一般使用的是Java就用Java類型即可

那么到這里,一個(gè)基本的倉(cāng)庫(kù)就建好了。
上傳文件至遠(yuǎn)程倉(cāng)庫(kù)
這里我就順便把我目前做的所有筆記上傳至GitHub玩一玩好了
首先是把剛剛新建好的倉(cāng)庫(kù)clone到本地某個(gè)文件夾先

把當(dāng)前的文件夾和遠(yuǎn)程倉(cāng)庫(kù)綁定 git remote add origin [遠(yuǎn)程倉(cāng)庫(kù)URL地址]

把咱們的筆記放進(jìn)去之后,輸入 git add . 將筆記加入到暫存區(qū)

檢查一下我們的倉(cāng)庫(kù)分支是什么,這個(gè)是一開(kāi)始新建倉(cāng)庫(kù)時(shí)可以指定的,比如main或者master,剛剛在GitHub建倉(cāng)庫(kù)的時(shí)候默認(rèn)是main了

調(diào)用push指令將其更新到遠(yuǎn)程倉(cāng)庫(kù),指令是 git push -u origin [倉(cāng)庫(kù)分支]

大功告成哈哈哈 ,成品地址

總結(jié):
第一次創(chuàng)建倉(cāng)庫(kù)時(shí)
1.clone到本地
git clone [遠(yuǎn)程倉(cāng)庫(kù)URL地址]
?
2.把當(dāng)前的文件夾和遠(yuǎn)程倉(cāng)庫(kù)綁定
git remote add origin [遠(yuǎn)程倉(cāng)庫(kù)URL地址]
?
3.更改一系列文件后
git add . 將所有更改后的文件加入到暫存區(qū)
?
4.調(diào)用push指令將其更新到遠(yuǎn)程倉(cāng)庫(kù)
git push origin [倉(cāng)庫(kù)分支]
?
以后再需要更新修改文件只要使用后2個(gè)指令即可
?
有時(shí)候會(huì)顯示這樣一句話導(dǎo)致push失敗,原因是本地倉(cāng)庫(kù)相對(duì)于遠(yuǎn)程倉(cāng)庫(kù)不是最新,先pull更新本地,再把自己的push上去
Updates were rejected because the remote contains work that you do
這個(gè)時(shí)候有兩個(gè)解決方法,一是強(qiáng)推,二就是pull一下再更新
如果確保本地沒(méi)問(wèn)題的話,可直接用強(qiáng)推 git push -f origin [倉(cāng)庫(kù)分支]即可
最后,實(shí)際情況可能還會(huì)有很多原因?qū)е履悴荒軐⒈镜卮a推送到倉(cāng)庫(kù)中,不過(guò)git這方面也沒(méi)啥太多bug,只需要把報(bào)錯(cuò)復(fù)制到谷歌上搜一下就有結(jié)果了,這里不再贅述太多。
分支與合并:
實(shí)際開(kāi)發(fā)過(guò)程中,有可能一個(gè)項(xiàng)目會(huì)有多個(gè)版本的需求,比如說(shuō)我們QQ有什么國(guó)際版,HD版,精簡(jiǎn)版之類的。所以這里就需要分支的概念了,分支出來(lái)的版本有可能是與主版本平行的永遠(yuǎn)不會(huì)相交,也有可能某一天需要將他與主版本合并。畫(huà)一張圖大概長(zhǎng)這樣:
當(dāng)然,合并不一定是跟主分支,也可以跟其他分支合并。
列一下指令先,簡(jiǎn)單看看就好,等會(huì)我們?cè)偈痉兑幌略趺词褂?/span>
# 列出所有本地分支
$ git branch
?
# 列出所有遠(yuǎn)程分支
$ git branch -r
?
# 列出所有本地分支和遠(yuǎn)程分支
$ git branch -a
?
# 新建一個(gè)本地分支,但依然停留在當(dāng)前分支
$ git branch [分支名]
?
# 切換到該分支
$ git checkout [分支名]
?
#新建一個(gè)遠(yuǎn)程分支,將冒號(hào)左右兩邊的分支綁定,并將本地分支提交至新建的遠(yuǎn)程分支
$ git push origin 本地分支名:新建的遠(yuǎn)程分支名
實(shí)戰(zhàn)一下:


看看我們的倉(cāng)庫(kù)有沒(méi)有變化,這里為什么我又使用了Gitee了,因?yàn)橛捎谀Хǔ隽它c(diǎn)問(wèn)題搞得GitHub提交老是超時(shí),懶得弄了,換成了國(guó)內(nèi)的Gitee,不過(guò)也不影響講解,問(wèn)題不大好吧。
master分支我在創(chuàng)建的時(shí)候忘記截圖了,就是把readme文件內(nèi)容改成了test1而已。


那么分支講解完畢,我們來(lái)看看合并吧。
在 Git 中,進(jìn)行合并是非常簡(jiǎn)單方便的。它只需要兩個(gè)步驟:
-
(1) 切換到那個(gè)需要接收改動(dòng)的分支上。
-
(2) 執(zhí)行 “git merge” 命令,并且在后面加上那個(gè)將要合并進(jìn)來(lái)的分支的名稱。
來(lái)讓我們把 “master2” 分支的改動(dòng)合并到 “master” 中去:
$ git checkout master
$ git merge master2
當(dāng)然,為了以示區(qū)別,我們新建一個(gè)Merge文件,并將它同步到mater2分支上去,過(guò)程我就不演示了,上面已經(jīng)使用過(guò)很多次了。


然后我們開(kāi)始執(zhí)行合并分支操作,誒,出問(wèn)題了???合并沖突,想一想為什么。

因?yàn)槲覀僲aster的readme文件中第一行的內(nèi)容是 test1,而master2中的文件內(nèi)容為 master2 ,在合并的時(shí)候計(jì)算機(jī)不知道你要保留master還是master2的內(nèi)容,所以引發(fā)了合并沖突。如何解決呢?就是把Git合并失敗的文件手動(dòng)編輯為我們希望的內(nèi)容,再提交。
打開(kāi)我們的Readme文件,可以看到Git自動(dòng)加些東西進(jìn)去,差不多就長(zhǎng)這樣的一個(gè)提示,什么意思不重要,反正一下就讓我們看到問(wèn)題出在第一行了,我們修改一下就好。(不過(guò)正常的提示不長(zhǎng)這樣,可能因?yàn)槭莔d文件格式出了點(diǎn)小問(wèn)題,不過(guò)問(wèn)題不大,等會(huì)我們講講正常的提示)

那么我們把master分支的文件中的 test1修改成 和master2分支的文件中一樣的 master2 ,解決好沖突之后,我們?cè)龠M(jìn)行一次 add、commit、merge操作,發(fā)現(xiàn)這次不再報(bào)錯(cuò)了,然后我們push到遠(yuǎn)程倉(cāng)庫(kù)看看效果。

可以看到將 master2 合并到 master 過(guò)后確實(shí)多了一個(gè)Merge.txt文件了

再來(lái)講講剛剛挖的坑,所謂的正常提示是什么,有什么用?
正常的提示:
當(dāng) Git 無(wú)法執(zhí)行自動(dòng)合并時(shí),因?yàn)楦脑谕粎^(qū)域,它會(huì)用特殊字符來(lái)表示沖突的區(qū)域。這些字符序列是這樣的:
-
<<<<<<< -
======= -
>>>>>>>
<<<<<<<和=======之間的所有內(nèi)容都是你的本地修改。 這些修改還沒(méi)有在遠(yuǎn)程版本庫(kù)中。=======和>>>>>>>之間的所有行都是來(lái)自遠(yuǎn)程版本庫(kù)或另一個(gè)分支的修改。現(xiàn)在你需要研究這兩個(gè)部分并做出決定。
下面的圖片顯示了一個(gè)文件的內(nèi)容,表明自動(dòng)合并沒(méi)有發(fā)生,有一個(gè)沖突。沖突發(fā)生在我們?cè)诒镜匦薷牧宋募黾恿艘恍?/span>- Sleep。但與此同時(shí),其他人在同一區(qū)域添加了 - Gym 行,從而推送了一個(gè)修改。
因此,- Sleep行被標(biāo)記為本地修改,- Gym行被標(biāo)記為從遠(yuǎn)程倉(cāng)庫(kù)或其他分支傳入的修改。

所以這個(gè)時(shí)候就得去找你的同事扯皮了,到底是用你的sleep還是用他的gym,亦或是新建一行而不是在同一行添加。

浙公網(wǎng)安備 33010602011771號(hào)