歷史
git是一個(gè)分布式版本控制軟件,最初由林納斯·托瓦茲創(chuàng)作萌壳,于2005年以GPL發(fā)布璧诵。最初目的是為更好地管理Linux內(nèi)核開(kāi)發(fā)而設(shè)計(jì)。林納斯·托瓦茲在編寫(xiě)第一個(gè)版本時(shí)就使用了“git”這個(gè)名稱嵌莉, 他將工具描述為“愚蠢的內(nèi)容跟蹤器”。
Git和SVN使用的區(qū)別
??差異?? | svn | git |
---|---|---|
系統(tǒng)特點(diǎn) | 1.集中式版本控制系統(tǒng)(文檔管理很方便) 2.克隆一個(gè)擁有將近一萬(wàn)個(gè)提交(commit),五個(gè)分支,每個(gè)分支有大約1500個(gè)文件捻脖,用時(shí)將近一個(gè)小時(shí) |
1.分布式系統(tǒng)(代碼管理很方便) 2.克隆一個(gè)擁有將近一萬(wàn)個(gè)提交(commit),五個(gè)分支,每個(gè)分支有大約1500個(gè)文件锐峭,用時(shí)1分鐘 |
靈活性 | 1.搭載svn的服務(wù)器出現(xiàn)故障中鼠,無(wú)法與服務(wù)器進(jìn)行交互 2.所有的svn操作都需要中央倉(cāng)庫(kù)交互(例:拉分支,看日志等) |
1.可以單機(jī)操作沿癞,git服務(wù)器故障也可以在本地git倉(cāng)庫(kù)工作 2.除了push和pull(或fetch)操作援雇,其他都可以在本地操作 3.根據(jù)自己開(kāi)發(fā)任務(wù)任意在本地創(chuàng)建分支 4.日志都是在本地查看,效率較高 |
安全性 | 較差椎扬,定期備份惫搏,并且是整個(gè)svn都得備份 | 較高,每個(gè)開(kāi)發(fā)者的本地就是一套完整版本庫(kù)蚕涤,記錄著版本庫(kù)的所有信息 |
分支方面 | 1.拉分支更像是copy一個(gè)路徑 2.可針對(duì)任何子目錄進(jìn)行branch 3.拉分支的時(shí)間較慢筐赔,因?yàn)槔种喈?dāng)于copy 4.創(chuàng)建完分支后,影響全部成員揖铜,每個(gè)人都會(huì)擁有這個(gè)分支 5.多分支并行開(kāi)發(fā)較重(工作較多而且繁瑣) |
1.可以在Git的任意一個(gè)提交點(diǎn)開(kāi)啟新分支 2.拉分支時(shí)間較快茴丰,因?yàn)槔种е皇莿?chuàng)建文件的指針和HEAD 3.自己本地創(chuàng)建的分支不會(huì)影響其他人 4.比較適合多分支并行開(kāi)發(fā) |
版本控制 | 1.保存前后變化的差異數(shù)據(jù),作為版本控制 2.版本號(hào)進(jìn)行控制天吓,每次操作都會(huì)產(chǎn)生一個(gè)高版本號(hào)(svn的全局版本號(hào)贿肩,這是svn一個(gè)較大的特點(diǎn),git是hash值) |
1.git只關(guān)心文件數(shù)據(jù)的整體發(fā)生變化失仁,更像是把文件做快照,文件沒(méi)有改變時(shí)们何,分支指向這個(gè)文件的指針不會(huì)改變萄焦,文件發(fā)生改變,指針指向新版本 2. 40 位長(zhǎng)的哈希值作為版本號(hào)冤竹,沒(méi)有先后之分 |
工作流程 | 1.每次更改文件之前都得update操作拂封,有的時(shí)候修改過(guò)程中這個(gè)文件有更新,commit不會(huì)成功 2.有沖突鹦蠕,會(huì)打斷提交動(dòng)作 |
1.開(kāi)始工作前進(jìn)行fetch操作冒签,完成開(kāi)發(fā)工作后push操作,有沖突解決沖突? 2.git的提交過(guò)程不會(huì)被打斷钟病,有沖突會(huì)標(biāo)記沖突文件 3.gitflow流程(經(jīng)典) |
內(nèi)容管理 | svn對(duì)中文支持好萧恕,操作簡(jiǎn)單,適用于大眾 | 對(duì)程序的源代碼管理方便肠阱,代碼庫(kù)占用的空間少票唆,易于分支化管理 |
權(quán)限管理 | svn的權(quán)限管理相當(dāng)嚴(yán)格,可以按組屹徘、個(gè)人針對(duì)某個(gè)子目錄的權(quán)限控制(每個(gè)目錄下都會(huì)有個(gè).svn的隱藏文件) | git沒(méi)有嚴(yán)格的權(quán)限管理控制走趋,只有賬號(hào)角色劃分(在項(xiàng)目的home文件下有且只有一個(gè).git目錄) |
Git工作流程
[圖片上傳失敗...(image-c23291-1619063471664)]
四個(gè)專有名詞:
Workspace:工作區(qū)
Index / Stage:暫存區(qū)
Repository:倉(cāng)庫(kù)區(qū)(或本地倉(cāng)庫(kù))
Remote:遠(yuǎn)程倉(cāng)庫(kù)
????關(guān)鍵詞 | 解釋 |
---|---|
工作區(qū) | 程序員進(jìn)行開(kāi)發(fā)改動(dòng)的地方,是你當(dāng)前看到的噪伊,也是最新的簿煌。 平常我們開(kāi)發(fā)就是拷貝遠(yuǎn)程倉(cāng)庫(kù)中的一個(gè)分支氮唯,基于該分支進(jìn)行開(kāi)發(fā)。在開(kāi)發(fā)過(guò)程中就是對(duì)工作區(qū)的操作姨伟。 |
暫存區(qū) | .git目錄下的index文件, 暫存區(qū)會(huì)記錄git add添加文件的相關(guān)信息(文件名惩琉、大小、timestamp...) 授滓×账可以使用git status查看暫存區(qū)的狀態(tài)。暫存區(qū)標(biāo)記了你當(dāng)前工作區(qū)中般堆,哪些內(nèi)容是被git管理的在孝。 |
本地倉(cāng)庫(kù) | 保存了對(duì)象被提交過(guò)的各個(gè)版本,比起工作區(qū)和暫存區(qū)的內(nèi)容淮摔,它要更舊一些私沮。 git commit后同步目錄樹(shù)到本地倉(cāng)庫(kù),方便下一步通過(guò)git push同步本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)和橙。 |
遠(yuǎn)程倉(cāng)庫(kù) | 遠(yuǎn)程倉(cāng)庫(kù)的內(nèi)容可能被分布在多個(gè)地點(diǎn)的處于協(xié)作關(guān)系的本地倉(cāng)庫(kù)進(jìn)行修改仔燕,因此它可能與本地倉(cāng)庫(kù)同步,也可能不同步魔招,但是它的內(nèi)容是最舊的晰搀。 |
Git常用命令
Git常用命令速查表
初始化倉(cāng)庫(kù)
命令 | 解釋 |
---|---|
git clone <url> | #克隆遠(yuǎn)程版本庫(kù),生成.git隱藏文件 |
打開(kāi)本地生成的.git隱藏文件
文件夾 | 解釋 |
---|---|
hooks | 存儲(chǔ)鉤子的文件夾 |
logs | 存儲(chǔ)日志的文件夾 |
refs | 存儲(chǔ)指向各個(gè)分支的指針(SHA-1標(biāo)識(shí))文件 |
objects | 存放git對(duì)象 |
config | 存放各種設(shè)置文檔 |
HEAD | 指向當(dāng)前所在分支的指針文件路徑,一般指向refs下的某文件 |
創(chuàng)建和添加
創(chuàng)建新項(xiàng)目gittest
創(chuàng)建新文件test.txt
git add <file>
git status顯示有變更的文件
git restore <file> 撤回文件修改內(nèi)容
git commit –m “注釋”
修改內(nèi)容-> 執(zhí)行g(shù)it diff工作區(qū)和本地倉(cāng)庫(kù)的差異
git log顯示當(dāng)前分支的版本歷史
版本回退
git reset --hard HEAD^ 當(dāng)前版本回退到上一個(gè)版本
git reset --hard HEAD^ ^ 當(dāng)前版本回退到上上一個(gè)版本
git reset --hard HEAD~100 回退到前100個(gè)版本
恢復(fù)已經(jīng)刪除的版本
git reflog 展示所有的提交記錄
git reset --hard <版本號(hào)> 回退到指定版本
推送至遠(yuǎn)程分支
git push origin master 將本地master分支推送到遠(yuǎn)程master分支办斑,相當(dāng)于創(chuàng)建遠(yuǎn)程分支
創(chuàng)建與合并分支
git checkout -b dev = git branch dev + git checkout dev 創(chuàng)建并切換分支
git branch 不帶參數(shù)外恕,會(huì)列出所有本地的分支;帶參數(shù)表示創(chuàng)建分支
git branch –d name 刪除本地分支(-D表示強(qiáng)制刪除)
git branch –r 不帶參數(shù)乡翅,會(huì)列出所有遠(yuǎn)程的分支
git branch --set-upstream-to=origin/<branch本地> 本地和遠(yuǎn)程分支關(guān)聯(lián)
git push origin –delete <branch> 刪除遠(yuǎn)程分支
合并分支
git merge release用于合并指定分支到當(dāng)前分支上
注:Fast-forward表示的合并是“快進(jìn)模式”鳞疲,也就是直接把master指向dev的當(dāng)前提交,所以合并速度非橙溲粒快尚洽。在這種模式下,刪除分支后靶累,會(huì)丟掉分支日志信息腺毫。可以使用帶參數(shù) --no-ff來(lái)禁用”Fast forward”模式挣柬。
git merge --no-ff -m “注釋”dev
解決沖突
git checkout release 切換release分支
vim test.txt 修改某條內(nèi)容
git commit test.txt -m “release修改某條內(nèi)容”
git checkout master 切換master分支
vim test.txt 修改某條同release內(nèi)容
git commit test.txt -m “master修改某條內(nèi)容”
git merge release 顯示沖突
git status 顯示沖突提示
Git用<<<<<<<拴曲,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容凛忿,其中>>>>release 是指release上修改的內(nèi)容
vim test.txt 修改內(nèi)容
git add test.txt
git commit -a -m “fix conflict”
暫儲(chǔ)stash功能
當(dāng)前分支有沒(méi)有提交但也不合適現(xiàn)在就提交的內(nèi)容澈灼,Git提供了暫儲(chǔ)功能stash
1.產(chǎn)生場(chǎng)景
git checkout release
vim test.txt 修改test.txt內(nèi)容
git checkout develop 此時(shí)會(huì)提示Aborting
2.解決方式
Please commit your changes or stash them before you switch branches
git stash
git status 查看當(dāng)前狀態(tài)
Git stash list 查看所有暫儲(chǔ)列表
3.還原暫儲(chǔ)
git stash apply恢復(fù),恢復(fù)后stash內(nèi)容并不刪除,你需要使用命令git stash drop來(lái)刪除叁熔;
另一種方式是使用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪除了
Git Tag功能
創(chuàng)建Git Tag并推送遠(yuǎn)程服務(wù)器
git tag -a V1.0.0 –m“注釋” //創(chuàng)建TAG
git push origin V1.0.0 //推送到遠(yuǎn)程服務(wù)器
git push origin --tag //提交所有tag至服務(wù)器
git tag -d V1.0.0 //刪除本地標(biāo)簽
git push origin --delete tag <tagname> //刪除遠(yuǎn)程標(biāo)簽
HEAD的理解
HEAD委乌,它始終指向當(dāng)前所處分支的最新的提交點(diǎn)。你所處的分支變化了荣回,或者產(chǎn)生了新的提交點(diǎn)遭贸,HEAD就會(huì)跟著改變
Add的理解
add相關(guān)命令很簡(jiǎn)單,主要實(shí)現(xiàn)將工作區(qū)修改的內(nèi)容提交到暫存區(qū)心软,交由git管理壕吹。
git add .添加當(dāng)前目錄的所有文件到暫存區(qū)
git add 添加指定目錄到暫存區(qū),包括子目錄
git add 添加指定文件到暫存區(qū)
Commit的理解
commit相關(guān)命令也很簡(jiǎn)單删铃,主要實(shí)現(xiàn)將暫存區(qū)的內(nèi)容提交到本地倉(cāng)庫(kù)耳贬,并使得當(dāng)前分支的HEAD向后移動(dòng)一個(gè)提交點(diǎn)。
git commit -m 提交暫存區(qū)到本地倉(cāng)庫(kù),message代表說(shuō)明信息
git commit --amend -m 使用一次新的commit猎唁,替代上一次提交
Push的理解
上傳本地倉(cāng)庫(kù)分支到遠(yuǎn)程倉(cāng)庫(kù)分支咒劲,實(shí)現(xiàn)同步。
git push 上傳本地指定分支到遠(yuǎn)程倉(cāng)庫(kù)
git push --force強(qiáng)行推送當(dāng)前分支到遠(yuǎn)程倉(cāng)庫(kù)诫隅,即使有沖突
git push --all推送所有分支到遠(yuǎn)程倉(cāng)庫(kù)
Branch的理解
關(guān)于分支腐魂,大概有展示分支,切換分支逐纬,創(chuàng)建分支蛔屹,刪除分支這四種操作。
git branch列出所有本地分支
git branch -r列出所有遠(yuǎn)程分支
git branch -a列出所有本地分支和遠(yuǎn)程分支
git branch 新建一個(gè)分支豁生,但依然停留在當(dāng)前分支
git checkout -b 新建一個(gè)分支兔毒,并切換到該分支
git checkout 切換到指定分支,并更新工作區(qū)
git branch -d 刪除分支
git push origin --delete 刪除遠(yuǎn)程分支
關(guān)于分支的操作雖然比較多沛硅,但都比較簡(jiǎn)單好記
Merge的理解
merge命令把不同的分支合并起來(lái)眼刃。在實(shí)際開(kāi)放中绕辖,我們可能從master分支中切出一個(gè)分支摇肌,然后進(jìn)行開(kāi)發(fā)完成需求,中間經(jīng)過(guò)R3,R4,R5的commit記錄仪际,最后開(kāi)發(fā)完成需要合入master中围小,這便用到了merge。
git merge 合并指定分支到當(dāng)前分支
注:如果在merge之后树碱,出現(xiàn)conflict肯适,主要是因?yàn)閮蓚€(gè)用戶修改了同一文件的同一塊區(qū)域。需要針對(duì)沖突情況成榜,手動(dòng)解除沖突框舔。
Rebase的理解
rebase又稱為衍合,是合并的另外一種選擇。
在開(kāi)始階段刘绣,我們處于new分支上樱溉,執(zhí)行g(shù)it rebase dev,那么new分支上新的commit都在dev分支上重演一遍纬凤,最后checkout切換回到new分支福贞。這一點(diǎn)與merge是一樣的,合并前后所處的分支并沒(méi)有改變停士。
git rebase dev挖帘,通俗的解釋就是new分支想站在dev的肩膀上繼續(xù)下去。
rebase操作不會(huì)生成新的節(jié)點(diǎn)恋技,是將兩個(gè)分支融合成一個(gè)線性的提交拇舀。
rebase也需要手動(dòng)解決沖突。
Merge和Rebase的比較
1.如果你想要一個(gè)干凈的猖任,沒(méi)有merge commit的線性歷史樹(shù)你稚,那么你應(yīng)該選擇git rebase
2.如果你想保留完整的歷史記錄,并且想要避免重寫(xiě)commit history的風(fēng)險(xiǎn)朱躺,你應(yīng)該選擇使用git merge
Reset的理解
reset命令把當(dāng)前分支指向另一個(gè)位置掸刊,并且相應(yīng)的變動(dòng)工作區(qū)和暫存區(qū)。
git reset —soft 只改變提交點(diǎn)雨女,暫存區(qū)和工作目錄的內(nèi)容都不改變
git reset —mixed 改變提交點(diǎn)匿辩,同時(shí)改變暫存區(qū)的內(nèi)容
git reset —hard 暫存區(qū)、工作區(qū)的內(nèi)容都會(huì)被修改到與提交點(diǎn)完全一致的狀態(tài)
Revert的理解
git revert用一個(gè)新提交來(lái)消除一個(gè)歷史提交所做的任何修改源请。
Revert與Reset的區(qū)別
在回滾這一操作上看枪芒,效果差不多。git revert是用一次新的commit來(lái)回滾之前的commit谁尸,git reset是直接刪除指定的commit舅踪。
Gitignore 忽略
1.創(chuàng)建gitignore文件
在 Git工作區(qū)的根目錄創(chuàng)建一個(gè)特殊的.gitignore文件。
在.gitignore文件中良蛮,添加需要忽略的文件抽碌。
2.更新gitignore文件
git rm -r --cached . //將倉(cāng)庫(kù)中的index遞歸刪除
git add . //重新添加倉(cāng)庫(kù)索引
git commit -m “update git.ignore” //提交
git branch --set-upstream-to=origin/<branch> <branch> //重現(xiàn)將本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)
常用Git建立分支結(jié)構(gòu)
最后,如果此篇博文對(duì)你有所幫助决瞳,別忘了點(diǎn)個(gè)贊喲~