更新時間:2022-11-21 來源:黑馬程序員 瀏覽量:
一、版本控制工具
1.1.什么是版本控制系統?
版本控制系統(Version Control System):是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。版本控制系統不僅可以應用于軟件源代碼的文本文件,而且可以對任何類型的文件進行版本控制。
常見的版本控制系統有:cvs、svn、git
1.2.為什么要有版本控制系統?
1.在開發過程中,經常需要對一個文件進行修改甚至刪除,但是我們又希望能夠保存這個文件的歷史記錄,如果通過備份,那么管理起來會非常的復雜。
2.在多人開發時,如果需要多人合作開發一個頁面,那么修改以及合并也會非常的棘手。容易出現沖突。
1.3.版本控制系統分類
[關于版本控制]
https://git-scm.com/book/zh/v1/起步-關于版本控制
**本地版本控制系統**
本地版本控制系統就是在一臺機器上,記錄版本的不同變化,保證內容不會丟失
缺點:如果多人開發,每個人都在不同的系統和電腦上開發,沒辦法協同工作。
**集中式版本控制系統**
svn/cvs都是集中式的版本控制系統
1.需要一個中央服務器來管理代碼的的版本和備份
2.所有的用戶電腦都是從中央服務器獲取代碼或者是將本地的代碼提交到中央服務器
3.依賴與網絡環境,如果連不上中央服務器,就無法提交和獲取代碼。
4.如果中央服務器宕機,所有人都無法工作。
**分布式版本控制系統**
git是分布式的版本控制系統。
1.需要一臺服務器作為代碼倉庫
2.每個用戶電腦都是一個服務器(代碼倉庫),并且和代碼倉庫是鏡像的,用戶修改和獲取代碼都是提交到自己的服務器當中。
3.不需要網絡就可以進行工作。
4.當連接網絡時,用戶可以選擇將自己的服務器與代碼倉庫進行同步。
二、git
2.1.git介紹
>Git是一款免費、開源的**分布式版本控制系統**,用于敏捷高效地處理任何或小或大的項目。
Git是Linus Torvalds為了幫助管理Linux內核開發而開發的一個開放源碼的版本控制軟件。
2.2.git安裝
[下載地址]https://git-scm.com/download/win
```shell
#推薦使用國內鏡像下載http://npm.taobao.org/mirrors/git-for-windows
1.不要安裝在中文目錄
2.不要使用桌面管理軟件
```
安裝很簡單,一直下一步即可。在任意的目錄下右鍵,能夠出現下圖,表示安裝成功了。
git用法方式主要有兩種,
-git gui,即圖形化界面的方式
-git bash,命令行的方式
**bash是linux系統的命令,因此學習git前,我們先學習一下bash**
1.在任意文件夾中,都可以使用右鍵,通過git bash here打開命令行窗口,此時的路徑就是當前目錄。
2.窗口上右鍵,通過options-->Text-->select可以調整字體的大小。
#cd改變目錄(change directory) cd images#進入images文件夾 cd..#進入上一層目錄 cd~#進入用戶根目錄 #tab自動補全,當我們輸命令或者目錄很長時,可以使用tab鍵進行自動補全。 #按兩次tab,會把所有符合要求的內容都列出來。 #pwd打印當前目錄的路徑(print work directory) pwd #ls展示當前目錄列表(list) ls#展示當前目錄 ls-a#展示全部內容,包括隱藏文件 ls-l#以列表的形式展示內容 ls-al#以列表的形式展示所有的內容,包括隱藏文件。 ls--help#查看ls所有的參數。 ls-l images#展示images目錄下的文件,如果沒有寫目錄,默認展示當前目錄。 #clear reset清屏 clear#清除屏幕內容,滾動條,保留了歷史 reset#重置,歷史記錄沒了。 #mkdir創建一個文件夾(make directory) mkdir css#創建一個css的文件夾 mkdir css img js#創建了三個文件夾 #rmdir刪除一個空的文件夾(沒啥用) rmdir img#刪除文件夾 #touch創建文件 touch index.html#創建了一個index.html文件 touch css/index.css#在css目錄下創建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參數。 #cat查看文件全部內容 cat index.html #less查看文件部分內容 less index.html #q退出查看
2.3.基本操作
1.初始化git倉庫`git init`
2.查看當前git倉庫的狀態`git status`
3.將文件添加到git的暫存區`git add文件名`
4.將文件由暫存區提交到倉庫區`git commit-m'提交說明'`
5.查看提交日志`git log`
#初始化git倉庫,會在當前目錄生成一個隱藏文件夾.git不要去修改這個文件夾下的任意東西。 git init #查看git的狀態,如果此時新建一個文件,那么這個文件是沒有被追蹤的,說白了git還沒有管理這個新建的文件 git status #讓git管理這個新建的文件 git add index.html #讓文件由暫存區提交到倉庫區。此時文件才真正的被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參數,配置全局的用戶名和郵箱,這樣別的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
重點
-作用:將文件由工作區添加到暫存區,暫存文件
-命令:
```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文件名
-作用:暫存區的內容恢復到工作區。
-`git checkout 1.txt`將暫存區中1.txt文件恢復到工作區
2.6.3.git commit(重點)
-作用:將文件由暫存區添加到倉庫區
-`git commit-m"提交說明"`
2.6.4.git status
-作用:查看文件的狀態
-命令:`git status`
-命令:`git stauts-s`簡化日志輸出格式
2.6.5.git log
-作用:查看提交日志
-`git log`只能查看當前head以及以前的日志
-`git log--oneline`簡潔的日志信息
-`git reflog`查看所有的提交變更日志
2.6.6.git reset
-作用:版本回退,將代碼恢復到已經提交的某一個版本中。
-`git reset--hard版本號`將代碼回退到某個指定的版本
版本號只要有前幾位即可
-```
git reset--hard head~1
```
將版本回退到上一次提交
-~1:上一次提交
-~2:上上次提交
-~0:當前提交
2.7.git忽視文件
>在倉庫中,有些文件是不想被git管理的,比如數據的配置密碼、寫代碼的一些思路等。git可以通過配置從而達到忽視掉一些文件,這樣這些文件就可以不用提交了。
-在倉庫的根目錄創建一個`.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。
如果兩個平行宇宙互不干擾,那對現在的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合并了,結果,你既學會了Git又學會了SVN!
3.1.為什么要有分支?
-如果你要開發一個新的功能,需要2周時間,第一周你只能寫50%代碼,如果此時立即提交,代碼沒寫完,不完整的代碼會影響到別人無法工作。如果等代碼寫完再提交,代碼很容易丟失,風險很大。
-有了分支,你就可以創建一個屬于自己的分支,別人看不到,也不影響別人,你在自己的分支上工作,提交到自己的分支上,等到功能開發完畢,一次性的合并到原來的分支。這樣既安全,又不影響他人工作。
-在工作過程中,經常會碰到**多任務并行開發**的情況,使用分支就能很好的避免任務之間的影響。
-其他版本工具比如svn,cvs中也有分支這個概念,但是這些工具中的分支操作非常的慢,形同擺設。
3.2.分支操作的命令
3.2.1.創建分支
-`git branch分支名稱`創建分支,分支中的代碼,在創建時與當前分支的內容完全相同。
-git在第一次提交時,就有了一個叫`master`的主分支。
3.2.2.查看分支
-`git branch`可以查看所有的分支,
-在當前分支的前面會有一個`*`
3.2.3.切換分支
-`git checkout分支名稱`切換分支
-在當前分支的任何操作,都不會影響到其他的分支,除非進行了分支合并。
-切換分支之前,**必須保證代碼已經提交了**
3.2.4.創建并切換分支
-`git checkout-b分支名稱`創建并切換分支
3.2.5.刪除分支
-`git branch-d分支名稱`可以刪除分支
-注意:不能在當前分支刪除當前分支,需要切換到其他分支才能刪除。
-注意:`master`分支是可以刪除的,但是不推薦那么做。
3.2.6.合并分支
-`git merge分支名稱`將其他分支的內容合并到當前分支。
-在`master`分支中執行`git merge dev`將`dev`分支中的代碼合并到`master`分支
3.3.git分支的工作原理
3.4.git合并沖突
-對于同一個文件,如果有多個分支需要合并時,容易出現沖突。
-合并分支時,如果出現沖突,只能手動處理,再次提交,一般的作法,把自己的代碼放到沖突代碼的后面即可。
四、遠程倉庫
所有的程序員都可以通過遠程倉庫來進行版本的共享,達到所有人的代碼一致的效果。
4.1.遠程倉庫相關的命令
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沒有直接的關系。
-git是一個版本控制工具。
-github是一個代碼托管平臺,是git的一個遠程代碼倉庫。
-將來工作時,公司會有自己的代碼倉庫。
[github官網]https://github.com/
[開源中國-git碼云]https://git.oschina.net/
```bash
1.gitHub是一個面向開源及私有軟件項目的托管平臺,因為只支持git作為唯一的版本庫格式進行托管,故名gitHub。
2.github免費,代碼所有人都能看到,但是只有你自己能修改。付費的可以隱藏。
```
在github上創建一個項目,獲取到倉庫的地址。然后就可以將本地的代碼推送到遠程的服務器上。
4.3.SSH免密碼登陸
(對稱加密與非對稱加密)
每次push代碼,都需要輸入用戶名跟密碼,非常的麻煩。因此我們可以配置一個SSH免密碼登陸。
-github為了賬戶的安全,需要對每一次push請求都要驗證用戶的身份,只有合法的用戶才可以push
-使用ssh可以實現免密碼操作(不需要使用密碼)
4.3.1.SSH免密碼登錄配置
-1創建SSH Key:`ssh-keygen-t rsa`
-2在文件路徑`C:\用戶\當前用戶名\`找到`.ssh`文件夾
-3文件夾中有兩個文件:
-私鑰:`id_rsa`
-公鑰:`id_rsa.pub`
-4在`github->settings->SSH and GPG keys`頁面中,新創建SSH key
-5粘貼公鑰`id_rsa.pub`內容到對應文本框中
-5在github中新建倉庫或者使用現在倉庫,拿到`git github.com:用戶名/倉庫名.git`
-6此后,再次SSH方式與github“通信”,不用輸入密碼確認身份了
五、idea集成git
5.1.idea配置git
首先,確保本地已經安裝過git客戶端,idea會進行自動檢測,如果沒有,或者想進行手動調整,需要在這里重新配置。配置成功之后可以通過點擊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、創建項目,在項目中添加.gitignore文件
**建議.gitignore文件內容**
###################################################################### #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文件內容編寫規則 *.a#忽略所有.a結尾的文件 !lib.a#但lib.a除外 /TODO#僅僅忽略項目根目錄下的TODO文件,不包括subdir/TODO build/#忽略build/目錄下的所有文件 doc/*.txt#會忽略doc/notes.txt但不包括doc/server/arch.txt
2、創建本地倉庫
$git init
3、創建個人分支
$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:工作區
-Index/Stage:暫存區
-Repository:倉庫區(或本地倉庫)
-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、增加/刪除文件
#添加指定文件到暫存區 $git add[file1][file2]... #添加指定目錄到暫存區,包括子目錄 $git add[dir] #添加當前目錄的所有文件到暫存區 $git add. #添加每個變化前,都會要求確認 #對于同一個文件的多處變化,可以實現分次提交 $git add-p #刪除工作區文件,并且將這次刪除放入暫存區 $git rm[file1][file2]... #停止追蹤指定文件,但該文件會保留在工作區 $git rm--cached[file] #改名文件,并且將這個改名放入暫存區 $git mv[file-original][file-renamed]
4、代碼提交
#提交暫存區到倉庫區 $git commit-m[message] #提交暫存區的指定文件到倉庫區 $git commit[file1][file2]...-m[message] #提交工作區自上次commit之后的變化,直接到倉庫區 $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] #新建一個分支,與指定的遠程分支建立追蹤關系 $git branch--track[branch][remote-branch] #切換到指定分支,并更新工作區 $git checkout[branch-name] #切換到上一個分支 $git checkout- #建立追蹤關系,在現有分支與指定的遠程分支之間 $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發生變更的文件 $git log--stat #搜索提交歷史,根據關鍵詞 $git log-S[keyword] #顯示某個commit之后的所有變動,每個commit占據一行 $git log[tag]HEAD--pretty=format:%s #顯示某個commit之后的所有變動,其"提交說明"必須符合搜索條件 $git log[tag]HEAD--grep feature #顯示某個文件的版本歷史,包括文件改名 $git log--follow[file] $git whatchanged[file] #顯示指定文件相關的每一次diff $git log-p[file] #顯示過去5次提交 $git log-5--pretty--oneline #顯示所有提交過的用戶,按提交次數排序 $git shortlog-sn #顯示指定文件是什么人在什么時間修改過 $git blame[file] #顯示暫存區和工作區的差異 $git diff #顯示暫存區和上一個commit的差異 $git diff--cached[file] #顯示工作區與當前分支最新commit之間的差異 $git diff HEAD #顯示兩次提交之間的差異 $git diff[first-branch]...[second-branch] #顯示今天你寫了多少行代碼 $git diff--shortstat" {0 day ago}" #顯示某次提交的元數據和內容變化 $git show[commit] #顯示某次提交發生變化的文件 $git show--name-only[commit] #顯示某次提交時,某個文件的內容 $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、撤銷
#恢復暫存區的指定文件到工作區 $git checkout[file] #恢復某個commit的指定文件到暫存區和工作區 $git checkout[commit][file] #恢復暫存區的所有文件到工作區 $git checkout. #重置暫存區的指定文件,與上一次commit保持一致,但工作區不變 $git reset[file] #重置暫存區與工作區,與上一次commit保持一致 $git reset--hard #重置當前分支的指針為指定commit,同時重置暫存區,但工作區不變 $git reset[commit] #重置當前分支的HEAD為指定commit,同時重置暫存區和工作區,與指定commit一致 $git reset--hard[commit] #重置當前HEAD為指定commit,但保持暫存區和工作區不變 $git reset--keep[commit] #新建一個commit,用來撤銷指定commit #后者的所有變化都將被前者抵消,并且應用到當前分支 $git revert[commit] #暫時將未提交的變化移除,稍后再移入 $git stash $git stash pop
10、其他
#生成一個可供發布的壓縮包 $git archive
#參考網址
#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