概念相關(guān)
Git概念
- Git 是目前業(yè)界最流行的分布式版本控制系統(tǒng)(Version Control System)岔擂,本質(zhì)上來(lái)說(shuō)Git是個(gè)軟件
- 分布式
- 客戶端并不只提取最新版本的文件快照位喂, 而是把代碼倉(cāng)庫(kù)完整地鏡像下來(lái),包括完整的歷史記錄乱灵。 這么一來(lái)塑崖,任何一處協(xié)同工作用的服務(wù)器發(fā)生故障,事后都可以用任何一個(gè)鏡像出來(lái)的本地倉(cāng)庫(kù)恢復(fù)
- 版本控制
- 版本控制是一種記錄一個(gè)或若干文件內(nèi)容變化痛倚,以便將來(lái)查閱特定版本修訂情況的系統(tǒng)
- 分布式
Git概念的理解
這里用大學(xué)生寫(xiě)論文這個(gè)事做比對(duì)规婆,加深理解
- 你準(zhǔn)備寫(xiě)論文蝉稳,先立題抒蚜,然后開(kāi)始收集資料,最后開(kāi)始動(dòng)筆耘戚。這個(gè)過(guò)程就可以看作使用git軟件在本地創(chuàng)建倉(cāng)庫(kù)(或者是從github/gitlab上拉代碼下來(lái))嗡髓,準(zhǔn)備完成項(xiàng)目的初始版本
- 論文初稿寫(xiě)好了,要仔細(xì)檢查一遍收津,然后提交給老師器贩。這個(gè)過(guò)程可以理解為使用git將寫(xiě)好的項(xiàng)目發(fā)送到github/gitlab,準(zhǔn)備接下來(lái)的測(cè)試朋截,需求對(duì)接,以及找bug
- 然后在接下來(lái)的2個(gè)月內(nèi)吧黄,老師來(lái)來(lái)回回的給你提出了10多個(gè)甚至更多的問(wèn)題部服,你就來(lái)來(lái)回回的改。這個(gè)過(guò)程就可以理解為每當(dāng)你發(fā)現(xiàn)了代碼有問(wèn)題拗慨,就使用git用你的修改后的代碼更新github/gitlab上的代碼廓八,每次更新負(fù)責(zé)檢查你的代碼的人都看得到奉芦,并且還會(huì)提過(guò)新的問(wèn)題
- 老師說(shuō)OK了,可以提交論文剧蹂,算你過(guò)了声功。這個(gè)過(guò)程就可以理解為你的本地代碼經(jīng)過(guò)了無(wú)數(shù)的更改后,終于穩(wěn)定了宠叼,可以拿給客戶用了先巴,更新最終版本到github/gitlab上,部署上線···
GitHub
- GitHub 本質(zhì)上是一個(gè)代碼托管平臺(tái)冒冬,它提供的是基于 Git 的代碼托管服務(wù)伸蚯。
- 對(duì)于一個(gè)團(tuán)隊(duì)來(lái)說(shuō),即使不使用 GitHub简烤,他們也可以通過(guò)自己搭建和管理 Git 服務(wù)器來(lái)進(jìn)行代碼庫(kù)的管理
Git三大區(qū)域
- 工作區(qū)
- 就是你寫(xiě)代碼的地方剂邮,代碼在哪個(gè)文件夾下
- 暫存區(qū)
- 暫存區(qū)是用來(lái)存放你使用git軟件跟蹤文件具體變化的區(qū)域。要注意的是横侦,工作區(qū)的代碼在沒(méi)有使用git軟件管理前挥萌,和版本庫(kù)沒(méi)有任何關(guān)系
- 版本庫(kù)
- 是指代碼托管平臺(tái),存儲(chǔ)你上傳的每次更改結(jié)果枉侧,當(dāng)然也可以拉取遠(yuǎn)程代碼到本地
分支
- 一般每個(gè)代碼都有master分支引瀑,master分支包含了上線版本的完整代碼。
- 在開(kāi)發(fā)測(cè)試階段棵逊,有可能master分支代碼有問(wèn)題伤疙,那么就可以基于master代碼做出代碼更改,但是代碼更改又不是全部更改辆影,可能指更改幾行徒像,或者添加新的文件等等,那么此時(shí)就要?jiǎng)?chuàng)建新的分支(粗俗的理解為復(fù)制master代碼一份蛙讥,(但是真實(shí)情況锯蛀,是用指針指向?qū)崿F(xiàn)的,不是復(fù)制)次慢,指針同時(shí)指向新創(chuàng)建的分支以及master旁涤,此時(shí)還沒(méi)有做任何更改),然后更改新分支內(nèi)容的文件迫像,修改好沒(méi)有問(wèn)題劈愚,就可以提交新分支到代碼托管平臺(tái),此時(shí)遠(yuǎn)端就可以看得到新的一個(gè)分支的產(chǎn)生闻妓,再?zèng)Q定是否需要合并到master分支
Git準(zhǔn)備
安裝Git
# Ubuntu上安裝
sudo apt install git-all
# mac會(huì)提示你進(jìn)行安裝
git --version
設(shè)置Git的user信息
三個(gè)不同的作用域菌羽,默認(rèn)為local
-
git config --local user.name
- 如果在本地環(huán)境中需要管理多個(gè)git用戶,一般在某個(gè)你需要管理的本地git倉(cāng)庫(kù)內(nèi)設(shè)置(局部倉(cāng)庫(kù)生效)
-
git config --global user.email
- 一般來(lái)講第一次設(shè)置或者是只有一個(gè)賬戶需要管理的話由缆,設(shè)置全局用戶信息即可注祖,完整命令如下
- git config --global user.email your_email@domain.com
- git config --global user.name your_name
-
git config --system
- 針對(duì)系統(tǒng)所有登錄的用戶都有效猾蒂,用的不多
-
顯示git 本機(jī)的配置
git config --list --local
git config --list --global
git config --list --system
配置優(yōu)先級(jí)
local > global
- 如果全局配置已經(jīng)配置好,那么在當(dāng)前倉(cāng)庫(kù)下可以重新設(shè)置本地的user.name和user.email是晨,那么之后的提交(commit)都以本地的user.name 和user.email為準(zhǔn)
基本命令
初始化倉(cāng)庫(kù)
創(chuàng)建本地版本庫(kù)
創(chuàng)建一個(gè)準(zhǔn)備放完整項(xiàng)目的文件夾(mkdir your_project_name)
cd 到新創(chuàng)建的文件夾 (cd your_project_name)
在文件夾里面初始化倉(cāng)庫(kù) (git init)
-
將本地所有內(nèi)容(包括不同分支)推送到遠(yuǎn)程倉(cāng)庫(kù)
git remote add origin https://github.com/user/repo.git git push --all
克隆遠(yuǎn)端版本庫(kù)
- 從遠(yuǎn)程拉取master代碼肚菠,建立本地庫(kù)和遠(yuǎn)端的連接(git clone gitlab/github倉(cāng)庫(kù)地址)
- https方式
- ssh方式
- 需要配置密鑰
- cd your_project_name
- 可以進(jìn)行新建分支,更改代碼等操作了
管理分支
理解
舉例來(lái)說(shuō)罩缴,從遠(yuǎn)端第一次clone代碼下來(lái)蚊逢,默認(rèn)是master分支,那么在本地就會(huì)生成遠(yuǎn)端master的鏡像靴庆,此時(shí)本地分支的名稱也是master时捌,一般來(lái)講不推薦在本地的master分支上做協(xié)同開(kāi)發(fā),而是要基于master創(chuàng)建一個(gè)新的分支炉抒,在此分支上進(jìn)行相應(yīng)的開(kāi)發(fā)工作
查看分支
- git branch -a
- 查看所有分支
- git branch -v
- 查看本地分支
- git branch -r
- 查看所有遠(yuǎn)程分支
- git branch -vv
- 查看本地分支和遠(yuǎn)程分支的關(guān)系以及版本情況
創(chuàng)建本地新分支(基于當(dāng)前所在分支)
以下這幾個(gè)命令都可以達(dá)成目的
- git checkout -b branch_name
- 創(chuàng)建分支branch_name奢讨,并切換到branch_name分支
- git switch -c branch_name
- 創(chuàng)建分支branch_name,并切換到branch_name分支
- git branch branch_name
- 創(chuàng)建分支
- git checkout branch_name
- 切換分支
拉取最新代碼
一般在改動(dòng)前焰薄,都要先更新下最新代碼(將遠(yuǎn)端代碼拉下來(lái)拿诸,避免別人修改過(guò)和你的版本有沖突)
- git pull
- 一般不指定的情況下,將當(dāng)前工作區(qū)的分支名稱的最新版本代碼拉取下來(lái)
- git pull origin branch_name
- 拉取遠(yuǎn)端指定分支代碼塞茅,更新本地
- git checkout -b new_branch origin/new_branch
- 基于遠(yuǎn)端分支創(chuàng)建本地分支并切換到本地分支
- git fetch + git merge
- 基于遠(yuǎn)端同一個(gè)分支做更改亩码,可能會(huì)產(chǎn)生沖突,先f(wàn)etch看下和本地當(dāng)前分支有哪些不同野瘦,沒(méi)有問(wèn)題就將遠(yuǎn)程修改合并到我當(dāng)前的本地分支
- 對(duì)于不同人對(duì)不同文件在遠(yuǎn)端內(nèi)容的修改描沟,git會(huì)自動(dòng)檢測(cè)合并,不會(huì)發(fā)生沖突
修改工作區(qū)內(nèi)容并提交
工作區(qū)的內(nèi)容變更需要先提交到暫存區(qū)鞭光,然后確認(rèn)無(wú)誤后可以確認(rèn)并推送到遠(yuǎn)端進(jìn)行版本的更新吏廉,如果有問(wèn)題,也可以撤銷修改等
- git add 你修改的文件/新添加的文件
- add的作用就是將工作區(qū)(你修改的內(nèi)容)內(nèi)容的變動(dòng)提交到暫存區(qū)惰许,后面可以提交席覆,也可以撤銷,如果是新文件汹买,則是將此文件開(kāi)始納入被git跟蹤版本的范圍
- -u
- 參數(shù)佩伤,如果一次修改了多個(gè)文件,不需要帶文件名晦毙,可以將已經(jīng)被git管理的文件一次性添加到暫存區(qū)
- git commit -m "你本次提交對(duì)于版本內(nèi)容變更的描述生巡,越詳細(xì)越好"
- 將暫存區(qū)的變動(dòng)確認(rèn),生成新的版本號(hào)信息见妒,本地新版本生成孤荣,之后就可以推送到遠(yuǎn)端了
- git commit -am "你本次提交對(duì)于版本內(nèi)容變更的描述,越詳細(xì)越好"
- 這是上面add + commit命令的合并,這一條命令即可生成一個(gè)新的版本號(hào)垃环,之后可以推送到遠(yuǎn)端版本庫(kù)
推送分支到遠(yuǎn)端倉(cāng)庫(kù)
本地版本生成后(有了commit ID之后),雖然你本地的代碼已經(jīng)更新了返敬,但是遠(yuǎn)端并不知道遂庄,別人也就看不到,這時(shí)候可以選擇推送到遠(yuǎn)端進(jìn)行合并操作劲赠,推送過(guò)去別人就能看到你的代碼更新內(nèi)容了
- git push
- 推送當(dāng)前分支版本內(nèi)容到遠(yuǎn)程分支(遠(yuǎn)程如果有此分支涛目,則是更新操作,如果沒(méi)有此分支凛澎,則會(huì)創(chuàng)建一個(gè)新的分支霹肝,名稱和你本地的當(dāng)前分支名稱一樣)
- git branch --set-upstream-to origin/分支名
- 如果當(dāng)前分支和云端分支沒(méi)有關(guān)系的情況下(一般來(lái)講第一次,會(huì)有提示)塑煎,那么這樣可以建立關(guān)系
- git branch --unset-upstream
- 刪除本地當(dāng)前分支和遠(yuǎn)程分支的映射關(guān)系
合并其他分支代碼到master分支
一般來(lái)講沫换,其他分支的修改都是會(huì)最終合并到一個(gè)分支上的(這里以master為例)
- git merge branch_name
- 將branch_name的分支合并到當(dāng)前所在分支
刪除分支
刪除分支要注意的是,不能在當(dāng)前分支刪除當(dāng)前分支最铁,至少先要切換到別的分支
- git checkout -d branch_name
- 在本地修改完了分支內(nèi)容之后讯赏,可對(duì)分支進(jìn)行刪除操作
- git branch -D branch_name
- 強(qiáng)制刪除一個(gè)還沒(méi)有合并的分支
- git push origin --delete <branch_name>
- 刪除遠(yuǎn)程分支,按照分支名稱刪除
- git push origin --delete tag <tag_name>
- 刪除遠(yuǎn)程分支(按照標(biāo)簽)
工作區(qū)/暫存區(qū)撤銷
-
git reset HEAD -- filename
- HEAD表示拉取最新代碼下來(lái)沒(méi)有做改動(dòng)的版本(最新版本)
- 暫存區(qū)內(nèi)容都不要了冷尉,恢復(fù)到和HEAD版本一樣
-
git reset HEAD
- 將暫存區(qū)所有改動(dòng)清空漱挎,返回當(dāng)前指向的HEAD版本內(nèi)容
-
git checkout -- filename
- 將工作區(qū)內(nèi)容和暫存區(qū)內(nèi)容同步(j舉例來(lái)說(shuō),暫存區(qū)已經(jīng)保存了一次修改(add)雀哨,然后工作區(qū)對(duì)相同的代碼做更改磕谅,但是覺(jué)得還沒(méi)有保存在暫存區(qū)的內(nèi)容好,那么就可能要將工作區(qū)的內(nèi)容恢復(fù)到和暫存區(qū)一致)
版本回退
想要回退版本雾棺,一般都是本地先回退版本到某個(gè)分支膊夹,然后再推到遠(yuǎn)程,再合并
- git reset --hard HEAD^
- 將當(dāng)前分支回退一個(gè)版本
- git reset --hard HEAD^^
- 回退到上上個(gè)版本垢村, 版本號(hào)可以回退的版本為head-100
- git reset --hard 版本號(hào)
- 回退到具體某個(gè)版本
查看版本號(hào)
各種分支的每一次commit都會(huì)生成一個(gè)版本號(hào)
- git log
- 只顯示當(dāng)前分支的 版本變化
- git log --oneline
- 顯示版本號(hào)以及每次commit的變動(dòng)內(nèi)容(commit -m "變動(dòng)信息")割疾,列表的形式展示
- git log -n4
- 代表著最近4個(gè)記錄
- git log -n4 --oneline
- 最近4次記錄,列表的形式展示
- git log --all
- 列出本地所有分支的歷史版本
- git log --all --graph
- 以樹(shù)形圖的方式展示所有版本歷史信息
- git log --pretty=oneline
- 查看版本信息嘉栓,比較美觀宏榕,列表形式展示
其他基礎(chǔ)命令
查看每次更改內(nèi)容及版本差異
- git diff
- 還沒(méi)有add之前,可以通過(guò)這個(gè)命令看到對(duì)哪些文件做了更改
- git diff 版本號(hào)1 版本號(hào)2
- 可以查看兩個(gè)版本有哪些不同
- git diff -- filename
- 只比較工作區(qū)和暫存區(qū)某個(gè)文件的差異
- 可以比較多個(gè)指定文件侵佃,空格分開(kāi)文件名
- git diff --cached
- 暫存區(qū)和HEAD之間的差異(add命令之后)
- git status
- 查看當(dāng)前工作區(qū)內(nèi)容和暫存區(qū)內(nèi)容情況
刪除git管理的文件
- git rm filename
- 從git 版本庫(kù)刪除文件
重命名git管理的文件
- git mv filename new_filename
- 將文件重命名