更新時間:2022-11-21 來源:黑馬程序員 瀏覽量:
一、版本控制工具
1.1.什么是版本控制系統(tǒng)?
版本控制系統(tǒng)(Version Control System):是一種記錄一個或若干文件內(nèi)容變化,以便將來查閱特定版本修訂情況的系統(tǒng)。版本控制系統(tǒng)不僅可以應用于軟件源代碼的文本文件,而且可以對任何類型的文件進行版本控制。
常見的版本控制系統(tǒng)有:cvs、svn、git
1.2.為什么要有版本控制系統(tǒng)?
1.在開發(fā)過程中,經(jīng)常需要對一個文件進行修改甚至刪除,但是我們又希望能夠保存這個文件的歷史記錄,如果通過備份,那么管理起來會非常的復雜。
2.在多人開發(fā)時,如果需要多人合作開發(fā)一個頁面,那么修改以及合并也會非常的棘手。容易出現(xiàn)沖突。
1.3.版本控制系統(tǒng)分類
[關(guān)于版本控制]
https://git-scm.com/book/zh/v1/起步-關(guān)于版本控制
**本地版本控制系統(tǒng)**
本地版本控制系統(tǒng)就是在一臺機器上,記錄版本的不同變化,保證內(nèi)容不會丟失
缺點:如果多人開發(fā),每個人都在不同的系統(tǒng)和電腦上開發(fā),沒辦法協(xié)同工作。
**集中式版本控制系統(tǒng)**
svn/cvs都是集中式的版本控制系統(tǒng)
1.需要一個中央服務器來管理代碼的的版本和備份
2.所有的用戶電腦都是從中央服務器獲取代碼或者是將本地的代碼提交到中央服務器
3.依賴與網(wǎng)絡環(huán)境,如果連不上中央服務器,就無法提交和獲取代碼。
4.如果中央服務器宕機,所有人都無法工作。
**分布式版本控制系統(tǒng)**
git是分布式的版本控制系統(tǒng)。
1.需要一臺服務器作為代碼倉庫
2.每個用戶電腦都是一個服務器(代碼倉庫),并且和代碼倉庫是鏡像的,用戶修改和獲取代碼都是提交到自己的服務器當中。
3.不需要網(wǎng)絡就可以進行工作。
4.當連接網(wǎng)絡時,用戶可以選擇將自己的服務器與代碼倉庫進行同步。
二、git
2.1.git介紹
>Git是一款免費、開源的**分布式版本控制系統(tǒng)**,用于敏捷高效地處理任何或小或大的項目。
Git是Linus Torvalds為了幫助管理Linux內(nèi)核開發(fā)而開發(fā)的一個開放源碼的版本控制軟件。
2.2.git安裝
[下載地址]https://git-scm.com/download/win
```shell
#推薦使用國內(nèi)鏡像下載http://npm.taobao.org/mirrors/git-for-windows
1.不要安裝在中文目錄
2.不要使用桌面管理軟件
```
安裝很簡單,一直下一步即可。在任意的目錄下右鍵,能夠出現(xiàn)下圖,表示安裝成功了。
git用法方式主要有兩種,
-git gui,即圖形化界面的方式
-git bash,命令行的方式
**bash是linux系統(tǒng)的命令,因此學習git前,我們先學習一下bash**
1.在任意文件夾中,都可以使用右鍵,通過git bash here打開命令行窗口,此時的路徑就是當前目錄。
2.窗口上右鍵,通過options-->Text-->select可以調(diào)整字體的大小。
#cd改變目錄(change directory) cd images#進入images文件夾 cd..#進入上一層目錄 cd~#進入用戶根目錄 #tab自動補全,當我們輸命令或者目錄很長時,可以使用tab鍵進行自動補全。 #按兩次tab,會把所有符合要求的內(nèi)容都列出來。 #pwd打印當前目錄的路徑(print work directory) pwd #ls展示當前目錄列表(list) ls#展示當前目錄 ls-a#展示全部內(nèi)容,包括隱藏文件 ls-l#以列表的形式展示內(nèi)容 ls-al#以列表的形式展示所有的內(nèi)容,包括隱藏文件。 ls--help#查看ls所有的參數(shù)。 ls-l images#展示images目錄下的文件,如果沒有寫目錄,默認展示當前目錄。 #clear reset清屏 clear#清除屏幕內(nèi)容,滾動條,保留了歷史 reset#重置,歷史記錄沒了。 #mkdir創(chuàng)建一個文件夾(make directory) mkdir css#創(chuàng)建一個css的文件夾 mkdir css img js#創(chuàng)建了三個文件夾 #rmdir刪除一個空的文件夾(沒啥用) rmdir img#刪除文件夾 #touch創(chuàng)建文件 touch index.html#創(chuàng)建了一個index.html文件 touch css/index.css#在css目錄下創(chuàng)建idnex.css文件 #rm刪除一個文件獲取文件夾 rm index.html#刪除index.html文件 rm js#刪除空的js文件夾 rm-r css#遞歸刪除一個文件夾 #mv移動文件(move) mv index.html js#將html文件移動到js文件夾中 mv index.html index2.html#將index.html重命名為index2.html #cp復制文件(cp) cp index.html index2.html#復制index.html文件,命名為index2.html cp-r css css02#如果復制的是文件夾,需要使用-r參數(shù)。 #cat查看文件全部內(nèi)容 cat index.html #less查看文件部分內(nèi)容 less index.html #q退出查看
2.3.基本操作
1.初始化git倉庫`git init`
2.查看當前git倉庫的狀態(tài)`git status`
3.將文件添加到git的暫存區(qū)`git add文件名`
4.將文件由暫存區(qū)提交到倉庫區(qū)`git commit-m'提交說明'`
5.查看提交日志`git log`
#初始化git倉庫,會在當前目錄生成一個隱藏文件夾.git不要去修改這個文件夾下的任意東西。 git init #查看git的狀態(tài),如果此時新建一個文件,那么這個文件是沒有被追蹤的,說白了git還沒有管理這個新建的文件 git status #讓git管理這個新建的文件 git add index.html #讓文件由暫存區(qū)提交到倉庫區(qū)。此時文件才真正的被git管理了。 #如果提交日志亂碼,右鍵-->options-->Text-->將編碼改成utf-8 git commit-m'第一次提交' #查看提交日志 git log
2.4.配置郵箱和用戶名
如果第一次使用git,會要求設置用戶名和郵箱
#git config user.name你的目標用戶名 #git config user.email你的目標郵箱名 #這種配置方式只有在當前倉庫生效 git config user.name shuaige git config user.email 669104343 qq.com #可以使用--global參數(shù),配置全局的用戶名和郵箱,這樣別的git倉庫就不需要重新配置了。 #如果同時配置了局部的和全局的,那么局部的用戶名和郵箱將會生效。 git config--global user.name shuaige git config--global user.email 669104343 qq.com #查看配置信息 git config--list
2.5.git的工作原理
2.6.git命令詳解
2.6.1.git add
重點
-作用:將文件由工作區(qū)添加到暫存區(qū),暫存文件
-命令:
```git
git add文件名
```
-例如:`git add index.html`
-`git add--all`或者`git add-A`或者`git add.`(簡寫)添加所有文件
-`git add a.txt b.txt`同時添加兩個文件
-`git add*.js`添加當前目錄下的所有js文件
2.6.2.git checkout文件名
-作用:暫存區(qū)的內(nèi)容恢復到工作區(qū)。
-`git checkout 1.txt`將暫存區(qū)中1.txt文件恢復到工作區(qū)
2.6.3.git commit(重點)
-作用:將文件由暫存區(qū)添加到倉庫區(qū)
-`git commit-m"提交說明"`
2.6.4.git status
-作用:查看文件的狀態(tài)
-命令:`git status`
-命令:`git stauts-s`簡化日志輸出格式
2.6.5.git log
-作用:查看提交日志
-`git log`只能查看當前head以及以前的日志
-`git log--oneline`簡潔的日志信息
-`git reflog`查看所有的提交變更日志
2.6.6.git reset
-作用:版本回退,將代碼恢復到已經(jīng)提交的某一個版本中。
-`git reset--hard版本號`將代碼回退到某個指定的版本
版本號只要有前幾位即可
-```
git reset--hard head~1
```
將版本回退到上一次提交
-~1:上一次提交
-~2:上上次提交
-~0:當前提交
2.7.git忽視文件
>在倉庫中,有些文件是不想被git管理的,比如數(shù)據(jù)的配置密碼、寫代碼的一些思路等。git可以通過配置從而達到忽視掉一些文件,這樣這些文件就可以不用提交了。
-在倉庫的根目錄創(chuàng)建一個`.gitignore`的文件,文件名是固定的。
-將不需要被git管理的文件路徑添加到`.gitignore`中
#忽視idea.txt文件 idea.txt #忽視.gitignore文件 .gitignore #忽視css下的index.js文件 css/index.js #忽視css下的所有的js文件 css/*.js #忽視css下的所有文件 css/*.* #忽視css文件夾 css
三、git分支操作
分支就是科幻電影里面的平行宇宙,當你正在電腦前努力學習Git的時候,另一個你正在另一個平行宇宙里努力學習SVN。
如果兩個平行宇宙互不干擾,那對現(xiàn)在的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合并了,結(jié)果,你既學會了Git又學會了SVN!
3.1.為什么要有分支?
-如果你要開發(fā)一個新的功能,需要2周時間,第一周你只能寫50%代碼,如果此時立即提交,代碼沒寫完,不完整的代碼會影響到別人無法工作。如果等代碼寫完再提交,代碼很容易丟失,風險很大。
-有了分支,你就可以創(chuàng)建一個屬于自己的分支,別人看不到,也不影響別人,你在自己的分支上工作,提交到自己的分支上,等到功能開發(fā)完畢,一次性的合并到原來的分支。這樣既安全,又不影響他人工作。
-在工作過程中,經(jīng)常會碰到**多任務并行開發(fā)**的情況,使用分支就能很好的避免任務之間的影響。
-其他版本工具比如svn,cvs中也有分支這個概念,但是這些工具中的分支操作非常的慢,形同擺設。
3.2.分支操作的命令
3.2.1.創(chuàng)建分支
-`git branch分支名稱`創(chuàng)建分支,分支中的代碼,在創(chuàng)建時與當前分支的內(nèi)容完全相同。
-git在第一次提交時,就有了一個叫`master`的主分支。
3.2.2.查看分支
-`git branch`可以查看所有的分支,
-在當前分支的前面會有一個`*`
3.2.3.切換分支
-`git checkout分支名稱`切換分支
-在當前分支的任何操作,都不會影響到其他的分支,除非進行了分支合并。
-切換分支之前,**必須保證代碼已經(jīng)提交了**
3.2.4.創(chuàng)建并切換分支
-`git checkout-b分支名稱`創(chuàng)建并切換分支
3.2.5.刪除分支
-`git branch-d分支名稱`可以刪除分支
-注意:不能在當前分支刪除當前分支,需要切換到其他分支才能刪除。
-注意:`master`分支是可以刪除的,但是不推薦那么做。
3.2.6.合并分支
-`git merge分支名稱`將其他分支的內(nèi)容合并到當前分支。
-在`master`分支中執(zhí)行`git merge dev`將`dev`分支中的代碼合并到`master`分支
3.3.git分支的工作原理
3.4.git合并沖突
-對于同一個文件,如果有多個分支需要合并時,容易出現(xiàn)沖突。
-合并分支時,如果出現(xiàn)沖突,只能手動處理,再次提交,一般的作法,把自己的代碼放到?jīng)_突代碼的后面即可。
四、遠程倉庫
所有的程序員都可以通過遠程倉庫來進行版本的共享,達到所有人的代碼一致的效果。
4.1.遠程倉庫相關(guān)的命令
4.1.1.git push
-作用:將本地代碼提交到遠程倉庫
-`git push倉庫地址master`在代碼提交到遠程倉庫,注意master分支必須寫,不能省略
-例子:`git push git github.com:hucongcong/test.git master`如果第一次使用,需要填寫github的用戶名和密碼
4.1.2.git pull
-作用:將遠程的代碼下載到本地
-`git pull代碼地址`將遠程的代碼中master分支下載到本地
-通常在push前,需要先pull一次。
4.1.3.git clone
-作用:克隆遠程倉庫的代碼到本地
-`git clone倉庫地址自定義本地倉庫名`將整個倉庫克隆到本地
4.1.4.git remote
每次push和pull操作都需要帶上遠程倉庫的地址,非常的麻煩,我們可以給倉庫地址設置一個別名
-```
git remote add倉庫別名倉庫地址
```
使用倉庫別名替代倉庫地址。倉庫別名相當于一個變量,倉庫地址就是對應的值。
-`git remote add hucc git github.com:hucongcong/test.git`設置了一個hucc的倉庫別名,以后push和pull都可以不用倉庫地址,而用hucc
-`git remote remove hucc`刪除hucc這個倉庫別名。
-`git remote`查看所有的倉庫別名
-如果使用了`git clone`命令從遠程倉庫獲取下來的,那么這個本地倉庫會自動添加一個origin的遠程地址,指向的就是克隆的遠程地址。
4.2.github
git與github沒有直接的關(guān)系。
-git是一個版本控制工具。
-github是一個代碼托管平臺,是git的一個遠程代碼倉庫。
-將來工作時,公司會有自己的代碼倉庫。
[github官網(wǎng)]https://github.com/
[開源中國-git碼云]https://git.oschina.net/
```bash
1.gitHub是一個面向開源及私有軟件項目的托管平臺,因為只支持git作為唯一的版本庫格式進行托管,故名gitHub。
2.github免費,代碼所有人都能看到,但是只有你自己能修改。付費的可以隱藏。
```
在github上創(chuàng)建一個項目,獲取到倉庫的地址。然后就可以將本地的代碼推送到遠程的服務器上。
4.3.SSH免密碼登陸
?。▽ΨQ加密與非對稱加密)
每次push代碼,都需要輸入用戶名跟密碼,非常的麻煩。因此我們可以配置一個SSH免密碼登陸。
-github為了賬戶的安全,需要對每一次push請求都要驗證用戶的身份,只有合法的用戶才可以push
-使用ssh可以實現(xiàn)免密碼操作(不需要使用密碼)
4.3.1.SSH免密碼登錄配置
-1創(chuàng)建SSH Key:`ssh-keygen-t rsa`
-2在文件路徑`C:\用戶\當前用戶名\`找到`.ssh`文件夾
-3文件夾中有兩個文件:
-私鑰:`id_rsa`
-公鑰:`id_rsa.pub`
-4在`github->settings->SSH and GPG keys`頁面中,新創(chuàng)建SSH key
-5粘貼公鑰`id_rsa.pub`內(nèi)容到對應文本框中
-5在github中新建倉庫或者使用現(xiàn)在倉庫,拿到`git github.com:用戶名/倉庫名.git`
-6此后,再次SSH方式與github“通信”,不用輸入密碼確認身份了
五、idea集成git
5.1.idea配置git
首先,確保本地已經(jīng)安裝過git客戶端,idea會進行自動檢測,如果沒有,或者想進行手動調(diào)整,需要在這里重新配置。配置成功之后可以通過點擊Test按鈕測試是否OK!
5.2:idea上傳項目到本地倉庫
選中指定項目右鍵,選擇Git將項目添加到版本控制,然后使用Commit Directory提交項目到本地倉庫。
5.3:將本地倉庫項目推送到遠程倉庫
**注意:如果沒有配置ssh公鑰,第一次本地推送,需要輸入GitHub或gitee遠程倉庫用戶名密碼。**
5.4:idea設置git忽略部分文件
首先安裝.ignore插件
點擊File->Settings,找到Plugins搜索ignore,然后install,OK重啟idea
1、創(chuàng)建項目,在項目中添加.gitignore文件
**建議.gitignore文件內(nèi)容**
###################################################################### #Build Tools .gradle /build/ !gradle/wrapper/gradle-wrapper.jar target/ !.mvn/wrapper/maven-wrapper.jar ###################################################################### #IDE ###STS### .apt_generated .classpath .factorypath .project .settings .springBeans ###IntelliJ IDEA### .idea *.iws *.iml *.ipr out gen ###NetBeans### nbproject/private/ build/* nbbuild/ dist/ nbdist/ .nb-gradle/ #Others *.log *.xml.versionsBackup !*/build/*.java !*/build/*.html !*/build/*.xml
#.gitignore文件內(nèi)容編寫規(guī)則 *.a#忽略所有.a結(jié)尾的文件 !lib.a#但lib.a除外 /TODO#僅僅忽略項目根目錄下的TODO文件,不包括subdir/TODO build/#忽略build/目錄下的所有文件 doc/*.txt#會忽略doc/notes.txt但不包括doc/server/arch.txt
2、創(chuàng)建本地倉庫
$git init
3、創(chuàng)建個人分支
$git checkout-b dev
4、添加文件到版本控制,提交到本地倉庫
$git add. $git commit-m"first commit"
5、推送到遠程倉庫
$git push https://gitee.com/liyunyi/ssm.git dev
6、合并分支推送到主分支
$git checkout master $git merge dev $git push https://gitee.com/liyunyi/ssm.git master
5.5:克隆遠程倉庫項目到本地
附件:命令大全
-Workspace:工作區(qū)
-Index/Stage:暫存區(qū)
-Repository:倉庫區(qū)(或本地倉庫)
-Remote:遠程倉庫
1、倉庫
#在當前目錄新建一個Git代碼庫 $git init #新建一個目錄,將其初始化為Git代碼庫 $git init[project-name] #下載一個項目和它的整個代碼歷史 $git clone[url]
2、配置
#顯示當前的Git配置 $git config--list #編輯Git配置文件 $git config-e[--global] #設置提交代碼時的用戶信息 $git config[--global]user.name"[name]" $git config[--global]user.email"[email address]"
3、增加/刪除文件
#添加指定文件到暫存區(qū) $git add[file1][file2]... #添加指定目錄到暫存區(qū),包括子目錄 $git add[dir] #添加當前目錄的所有文件到暫存區(qū) $git add. #添加每個變化前,都會要求確認 #對于同一個文件的多處變化,可以實現(xiàn)分次提交 $git add-p #刪除工作區(qū)文件,并且將這次刪除放入暫存區(qū) $git rm[file1][file2]... #停止追蹤指定文件,但該文件會保留在工作區(qū) $git rm--cached[file] #改名文件,并且將這個改名放入暫存區(qū) $git mv[file-original][file-renamed]
4、代碼提交
#提交暫存區(qū)到倉庫區(qū) $git commit-m[message] #提交暫存區(qū)的指定文件到倉庫區(qū) $git commit[file1][file2]...-m[message] #提交工作區(qū)自上次commit之后的變化,直接到倉庫區(qū) $git commit-a #提交時顯示所有diff信息 $git commit-v #使用一次新的commit,替代上一次提交 #如果代碼沒有任何新變化,則用來改寫上一次commit的提交信息 $git commit--amend-m[message] #重做上一次commit,并包括指定文件的新變化 $git commit--amend[file1][file2]...
5、分支
#列出所有本地分支 $git branch #列出所有遠程分支 $git branch-r #列出所有本地分支和遠程分支 $git branch-a #新建一個分支,但依然停留在當前分支 $git branch[branch-name] #新建一個分支,并切換到該分支 $git checkout-b[branch] #新建一個分支,指向指定commit $git branch[branch][commit] #新建一個分支,與指定的遠程分支建立追蹤關(guān)系 $git branch--track[branch][remote-branch] #切換到指定分支,并更新工作區(qū) $git checkout[branch-name] #切換到上一個分支 $git checkout- #建立追蹤關(guān)系,在現(xiàn)有分支與指定的遠程分支之間 $git branch--set-upstream[branch][remote-branch] #合并指定分支到當前分支 $git merge[branch] #選擇一個commit,合并進當前分支 $git cherry-pick[commit] #刪除分支 $git branch-d[branch-name] #刪除遠程分支 $git push origin--delete[branch-name] $git branch-dr[remote/branch]
6、標簽
#列出所有tag $git tag #新建一個tag在當前commit $git tag[tag] #新建一個tag在指定commit $git tag[tag][commit] #刪除本地tag $git tag-d[tag] #刪除遠程tag $git push origin:refs/tags/[tagName] #查看tag信息 $git show[tag] #提交指定tag $git push[remote][tag] #提交所有tag $git push[remote]--tags #新建一個分支,指向某個tag $git checkout-b[branch][tag]
7、查看信息
#顯示有變更的文件 $git status #顯示當前分支的版本歷史 $git log #顯示commit歷史,以及每次commit發(fā)生變更的文件 $git log--stat #搜索提交歷史,根據(jù)關(guān)鍵詞 $git log-S[keyword] #顯示某個commit之后的所有變動,每個commit占據(jù)一行 $git log[tag]HEAD--pretty=format:%s #顯示某個commit之后的所有變動,其"提交說明"必須符合搜索條件 $git log[tag]HEAD--grep feature #顯示某個文件的版本歷史,包括文件改名 $git log--follow[file] $git whatchanged[file] #顯示指定文件相關(guān)的每一次diff $git log-p[file] #顯示過去5次提交 $git log-5--pretty--oneline #顯示所有提交過的用戶,按提交次數(shù)排序 $git shortlog-sn #顯示指定文件是什么人在什么時間修改過 $git blame[file] #顯示暫存區(qū)和工作區(qū)的差異 $git diff #顯示暫存區(qū)和上一個commit的差異 $git diff--cached[file] #顯示工作區(qū)與當前分支最新commit之間的差異 $git diff HEAD #顯示兩次提交之間的差異 $git diff[first-branch]...[second-branch] #顯示今天你寫了多少行代碼 $git diff--shortstat" {0 day ago}" #顯示某次提交的元數(shù)據(jù)和內(nèi)容變化 $git show[commit] #顯示某次提交發(fā)生變化的文件 $git show--name-only[commit] #顯示某次提交時,某個文件的內(nèi)容 $git show[commit]:[filename] #顯示當前分支的最近幾次提交 $git reflog
8、遠程同步
#下載遠程倉庫的所有變動 $git fetch[remote] #顯示所有遠程倉庫 $git remote-v #顯示某個遠程倉庫的信息 $git remote show[remote] #增加一個新的遠程倉庫,并命名 $git remote add[shortname][url] #取回遠程倉庫的變化,并與本地分支合并 $git pull[remote][branch] #上傳本地指定分支到遠程倉庫 $git push[remote][branch] #強行推送當前分支到遠程倉庫,即使有沖突 $git push[remote]--force #推送所有分支到遠程倉庫 $git push[remote]--all
9、撤銷
#恢復暫存區(qū)的指定文件到工作區(qū) $git checkout[file] #恢復某個commit的指定文件到暫存區(qū)和工作區(qū) $git checkout[commit][file] #恢復暫存區(qū)的所有文件到工作區(qū) $git checkout. #重置暫存區(qū)的指定文件,與上一次commit保持一致,但工作區(qū)不變 $git reset[file] #重置暫存區(qū)與工作區(qū),與上一次commit保持一致 $git reset--hard #重置當前分支的指針為指定commit,同時重置暫存區(qū),但工作區(qū)不變 $git reset[commit] #重置當前分支的HEAD為指定commit,同時重置暫存區(qū)和工作區(qū),與指定commit一致 $git reset--hard[commit] #重置當前HEAD為指定commit,但保持暫存區(qū)和工作區(qū)不變 $git reset--keep[commit] #新建一個commit,用來撤銷指定commit #后者的所有變化都將被前者抵消,并且應用到當前分支 $git revert[commit] #暫時將未提交的變化移除,稍后再移入 $git stash $git stash pop
10、其他
#生成一個可供發(fā)布的壓縮包 $git archive
#參考網(wǎng)址
#git大全 https://gitee.com/all-about-git #深入淺出git教程 https://www.cnblogs.com/syp172654682/p/7689328.html #阮一峰git教程 https://www.liaoxuefeng.com/wiki/896043488029600 #idea中.ignore忽略提交文件到Git的使用 https://blog.csdn.net/byy8023/article/details/82259155?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase