版本控制系統(tǒng)概述
-
開發(fā)中的實際場景
場景一:代碼備份
場景二:代碼還原【版本控制】
場景三:協同開發(fā)
場景四:追溯問題代碼
-
版本控制系統(tǒng)
版本控制系統(tǒng)能追蹤項目,從開始到結束的整個過程。對編程人員而言,版本控制技術是團隊協作開發(fā)的橋梁,助力于多人協作同步進行大型項目開發(fā)。
軟件版本控制系統(tǒng)的核心任務:查閱項目歷史操作記錄、實現協同開發(fā)。
常見的兩種版本控制類型
集中式版本控制工具:集中式版本控制工具,版本倉庫是集中存放在中央服務器的,team 里每個人工作時,從中央服務器下載代碼。每個人修改后,提交到中央版本倉庫。提交(commit)代碼需要聯網。如 SVN。
分布式版本控制工具:分布式版本控制系統(tǒng)可以沒有 “中央服務器”,每個人的電腦上都是一個完整的版本倉庫,這樣工作的時候,不需要聯網。因為版本倉庫就在你自己的電腦上。多人協作只需要各自修改,開發(fā)完成即可,推送給對方,推送的時候是聯網將整個版本倉庫推過去。如 GIT。
-
Git 簡介
Git 是一個開源的分布式版本控制系統(tǒng),可以有效、高速地處理從很小到非常大的項目的版本管理。
- 速度、簡單的設計
- 對非線性開發(fā)模式的強力支持(允許成千上萬個并行開發(fā)的分支)
- 完全分布式
- 有能力高效管理類似 Linux 內核一樣的超大規(guī)模項目(速度和數據量)
Git 工作流程
Clone:克隆,從遠程倉庫中克隆代碼到本地倉庫,第一次操作
Push:推送,代碼完成后,需要和團隊成員共享代碼時,將代碼推送到遠程倉庫
Pull:拉取,從遠程庫拉代碼到本地庫,自動進行合并(merge),最后放到工作區(qū)
checkout:將本地倉庫的內容檢出到工作區(qū)
add:在提交前先將代碼提交到暫存區(qū)
commit:提交到本地倉庫
基本概念
- 本地倉庫:在本地主機上的一個代碼庫,可以獨立存在,也可以與遠程倉庫進行關聯
工作區(qū):對任何文件的修訂(增刪改),都先放在工作區(qū),工作區(qū)不與任何倉庫分支進行關聯
暫存區(qū):把修訂的文件,從工作區(qū)經過 add(添加)后與某一個倉庫分支進行關聯,只有進入暫存區(qū)的文件才能 commit(提交)到本地倉庫。
遠程倉庫:在局域網或互聯網上的一個主機,存放代碼庫的主機或平臺,比如 GitHub、Gitee
分支:代碼存放在倉庫,默認是主分支(master),可以在主分支基礎上創(chuàng)建很多子分支,比如 develop、BugFix 等。
一個文件夾包含 .git 隱藏目錄(Git 工作目錄),說明此文件目錄使用 Git 版本管理。
.git 隱藏目錄中存儲了很多配置信息、日志信息和文件版本信息、暫存區(qū)信息等。.git 文件夾中有很多文件,其中有一個 index 文件就是暫存區(qū),也可以叫做 stage。暫存區(qū)是一個臨時保存修改文件的地方。
小結
Git 是分布式的版本控制系統(tǒng)。
Git 解決的問題:代碼備份、還原;協同開發(fā);多版本同時開發(fā)、追溯問題代碼。
本地倉庫:存儲所有版本代碼
?????-- 工作區(qū):編輯代碼區(qū)
?????-- 暫存區(qū):準備提交的代碼都放這里
遠程倉庫:用于團隊之間共享代碼
分支:多個版本同時開發(fā),master 主分支,develop 開發(fā)分支,test 測試分支
遠程倉庫操作:
- clone 克隆:第一次從遠程倉庫下載代碼
- pull 拉?。韩@取團隊其他成員代碼提交變動
- push 推送:完成后的代碼上傳到遠程倉庫
本地倉庫操作:
- checkout 檢出:將本地倉庫的內容檢出到工作區(qū)
- add 添加:向暫存區(qū)添加代碼,準備提交
- commit 提交:把暫存區(qū)的代碼提交到本地倉庫
Git 的下載與安裝
下載地址: https://git-scm.com/download
Git GUI:Git 提供的圖形界面工具
Git Bash:Git 提供的命令行工具
Git 基本配置
-
基本配置
進行全局設置,如用戶名、郵箱:
#設置全局用戶名
git config --global user.name "YOUR_NAME"
#設置郵箱
git config --global user.email "YOUR_EMAIL"
通過上面的命令設置的信息會保存在 .gitconfig 文件中
其中, --global 指定為全局配置,不使用該參數,則為當前所在倉庫配置。
以上配置信息默認存儲在用戶目錄下,如果設置錯誤,可以刪除 .gitconfig 文件,重新操作以上命令即可。
#查看配置信息:
查看配置信息
git config --list
-
構建本地倉庫
要使用 Git 對代碼進行版本控制,首先需要構建本地倉庫
通常有兩種方式:
- 在本地初始化一個 Git 倉庫
- 從遠程倉庫克隆一個倉庫(遠程倉庫演示)
初始化本地 Git 倉庫
1)在電腦的任意位置創(chuàng)建一個空目錄(例如 local_repo1)作為本地 Git 倉庫
2)進入這個目錄中,點擊右鍵打開 Git bash 窗口
3)執(zhí)行命令 Git init 如果在當前目錄中看到 .git 文件夾(此文件夾為隱藏文件夾)則說明 Git 倉庫創(chuàng)建成功
-
本地倉庫的操作
創(chuàng)建 Git 版本庫
在本地創(chuàng)建 Git 版本庫,需要使用 git init 命令。
新建一個存放版本庫的目錄,進入到該目錄所在路徑,然后執(zhí)行:
git init
查看目錄結構中,就可以看到包含有 .git 子目錄,這就說明創(chuàng)建版本庫成功了
查看當前文件狀態(tài)
# 命令形式:
git status
# 更簡潔的信息命令形式:
git status -s
將文件添加(修改)到版本庫
要將一個文件納入到版本庫管理,首先要將其添加到暫存區(qū),然后才能提交到倉庫中。
將文件添加到暫存區(qū),使用的是 git add:
# 添加單個文件到暫存區(qū)
git add Readme.txt
# 將當前目錄下所有修改添加到暫存區(qū),除按照規(guī)則忽略的之外
git add .
注意:空文件夾是不會被添加到暫存區(qū)中的。
將暫存區(qū)中的文件,提交到倉庫中。需要使用 git commit:
# 如果暫存區(qū)有文件,則將其中的文件提交到倉庫
git commit
# 帶評論提交,用于說明提交內容、變更、作用等
git commit -m 'YOUR_COMMENTS'
注意:直接用 git commit 提交會彈出添加評論的頁面。
查看提交歷史記錄
需要查看自己做過哪些提交,來回顧自己完成的部分;或者需要尋找某個具體的提交來查看當時的代碼:
# 顯示所有提交的歷史記錄
git log
# 單行顯示提交歷史記錄的內容
git log --pretty=oneline
在 git log 的輸出內容中,可以看到每次提交的 ID 是一個 40 位的字符串。
版本回退
有了 git log 來查看提交的歷史記錄,就可以通過 git reset --hard 來回退到需要的特定版本,然后使用當時的代碼進行各種操作。
# 回退到 commit_id 指定的提交版本
git reset --hard 'COMMIT_ID'
當退回到某個提交的版本以后,再通過 git log 是無法顯示在這之后的提交信息的。但是,通過 git reflog 可以獲取到操作命令的歷史。
因此,想要回到未來的某個提交,先通過 git reflog 從歷史命令中找到想要回到的提交版本的 ID,然后通過 git reset --hard 來切換。
git reflog
git reset --hard 'COMMIT_ID'
刪除文件
在文件未添加到暫存區(qū)之前,對想刪除文件可以直接物理刪除。如果文件已經被提交,則需要 git rm 來刪除:
# 刪除已經被提交過的 Readme.md
git rm Readme.md
注意:git rm 只能刪除已經提交到版本庫中的文件,其他狀態(tài)的文件直接用這個命令操作是出錯的。
添加文件至忽略列表
一般在工作區(qū)中,并不是所有文件都需要納入版本控制的
這種不需要進行版本控制的通常都是些自動生成的文件。比如:IDEA 工程文件(springmvc.iml)、編譯后文件 target、系統(tǒng)上傳的圖片 img。
在這種情況下可以在工作目錄中創(chuàng)建一個名為 .gitignore 的文件(文件名稱固定),列出要忽略的文件。
一般在工程初始化時,提前準備好需要忽略的文件列表。
分支管理
幾乎所有的版本控制系統(tǒng)都以某種形式支持分支。 使用分支意味著可以把工作從開發(fā)主線上分離開來進行重大的 Bug 修改、開發(fā)新的功能,以免影響開發(fā)主線。
在開發(fā)中,一般有如下分支使用原則與流程
master 生產分支:線上分支,主分支,中小規(guī)模項目作為線上運行的應用對應的分支。
test 測試分支:從 master 創(chuàng)建的分支,一般作為測試部門的測試分支,進行預發(fā)測試;測試完成后,需要合并到 master 分支,進行上線,中小規(guī)模項目可省略此分支。
develop 開發(fā)分支:從 test 創(chuàng)建分支,如果開發(fā)沒有 test 分支,是從 master 創(chuàng)建的分支,一般作為開發(fā)部門的主要開發(fā)分支;如果沒有其他并行開發(fā)不同期上線要求,都可以在此版本進行開發(fā);階段開發(fā)完成后,需要是合并到 test 分支繼續(xù)測試,如果沒有 test 分支,可直接合并到 master 分支。
hotfix(bugfix) 分支:從 master 派生的分支,一般作為線上 bug 修復使用,修復完成后需要合并到 master、test、develop 分支。
-
查看分支
查看分支使用 git branch:
# 查看本地分支信息
git branch
# 查看相對詳細的本地分支信息
git branch -v
# 查看包括遠程倉庫在內的分支信息
git branch -av
注意:在 git branch 的輸出內容中,有一個分支前面帶有 * 號,這標識當前所在的分支
-
創(chuàng)建分支
當要修復一個 Bug 或者開發(fā)一個新特性,甚至是怕打亂原來的代碼,都可以新建一個分支來避免對原來代碼的影響。
# 新建一個名稱為 dev 的分支
git branch dev
-
切換分支
當創(chuàng)建完分支以后,需要切換到新建的分支,否則,所有的修改,還是在原來的分支上。所有的改動,只能影響到當前所在的分支。
# 新建完 dev 分支以后,通過該命令切換到 dev 分支
git checkout dev
-
創(chuàng)建并切換分支
# 新建 dev 分支,并切換到該分支上
git checkout -b dev
這個命令合并了前兩個獨立的命令,平常使用中一般這樣使用。
-
合并分支
當修復完成一個 Bug,或者開發(fā)完成一個新特性,就會把相關的 Bug 或者特性的上修改合并回原來的主分支上,這時候就需要 git merge 來做分支的合并。
首先需要切換回最終要合并到的分支,如 master:
# 切換回 master 分支
git checkout master
# 將 dev 分鐘中的修改合并回 master 分支
git merge dev
合并回主分支的時候,可能會面臨到沖突的問題 git add ./
-
刪除分支
當之前創(chuàng)建的分支,完成了它的使命,如 Bug 修復完,分支合并以后,這個分支就不在需要了,就可以刪除它。
# 刪除 dev 分支
git branch -d dev
Git 遠程倉庫
-
添加遠程庫
現在已經在本地創(chuàng)建了一個 Git 倉庫,又想讓其他人來協作開發(fā),此時就可以把本地倉庫同步到遠程倉庫,同時還增加了本地倉庫的一個備份。
那么如何搭建 Git 遠程倉庫呢?可以借助互聯網上提供的一些代碼托管服務平臺來實現,其中比較常用的有 GitHub、碼云等。
GitHub(https://github.com/)是一個面向開源及私有軟件項目的托管平臺,因為只支持 Git 作為唯一的版本倉庫格式進行托管,故名 GitHub。
碼云(https://gitee.com/ )是國內的一個代碼托管平臺,由于服務器在國內,所以相比于 GitHub,碼云速度會更快。
-
注冊 GitHub
第一步:登錄網址,點擊 sign up 注冊賬號
第二步:填寫信息,注意郵箱要真實有效
第三步:直接點擊 join a free plan
第四步:直接劃到最下面點擊 complete setup
第五步:郵箱需要驗證,驗證完成后登陸進 GitHub
驗證郵箱:進入郵箱后點擊按鈕,進行頁面跳轉
跳轉頁面后:點擊 skip this for now
第六步:登錄
-
創(chuàng)建遠程倉庫
點擊 create repository 按鈕倉庫就創(chuàng)建成功了。
-
同步遠程倉庫
GitHub 支持兩種同步方式 https 和 ssh。如果使用 https 很簡單基本不需要配置就可以使用,但是每次提交代碼和下載代碼時都需要輸入用戶名和密碼。而且如果是公司配置的私有 Git 服務器一般不提供 https 方式訪問,所以要來著重演示 ssh 方式。
SSH 協議
什么是 SSH?
SSH - Secure Shell 的簡寫形式。通過使用 SSH,可以把所有傳輸的數據進行加密,這樣"中間人"這種攻擊方式就不可能實現了,而且也能夠防止 DNS 欺騙和 IP 欺騙。使用 SSH,還有一個額外的好處就是傳輸的數據是經過壓縮的,所以可以加快傳輸的速度。
注:使用 SSH 同步方式需要先生成密鑰并在 GitHub 配置公鑰
SSH 密鑰生成
在 windows 下我們可以使用 Git 的 Bash.exe 來生成密鑰,右鍵菜單打開 Git Bash
git bash 執(zhí)行命令生成公鑰和私鑰:
ssh-keygen -t rsa
執(zhí)行命令完成后,在 window 本地用戶 .ssh 目錄 C:\Users\用戶名.ssh 下面生成如下名稱的私鑰文件和公鑰文件:
id_rsa
id_rsa.pub
SSH 密鑰配置
密鑰生成后需要在 GitHub 上配置密鑰,本地才可以順利訪問。
在 key 部分將 id_rsa.pub 文件內容添加進去,然后點擊 Add SSH key 按鈕完成配置。
遠程倉庫的操作
-
查看遠程倉庫
如果想查看已經配置的遠程倉庫服務器,可以運行 git remote 命令。 它會列出指定的每一個遠程服務器的簡寫。 如果已經克隆了遠程倉庫,那么至少應該能看到 origin ,這是 Git 克隆的倉庫服務器的默認名字。
# 命令形式:
git remote -v
# origin ——倉庫服務器的默認名稱
-
添加遠程倉庫
如果已經有了一個本地倉庫,然后打算將它發(fā)布到遠程,供其他人協作。那么使用:
# 為本地倉庫添加遠程倉庫
git remote add origin your_remote_git_repo
-
推送本地的內容到遠程倉庫
當本地倉庫中,代碼完成提交,就需要將代碼等推送到遠程倉庫,這樣其他協作人員可以從遠程倉庫同步內容。
# 第一次推送時使用,可以簡化后面的推送或者拉取命令使用
git push -u origin master
# 將本地 master 分支推送到 origin 遠程分支
git push origin master
注意:
git push -u origin master,第一次使用時,帶上 -u 參數,在將本地的 master 分支推送到遠程新的 master 分支的同時,還會把本地的 master 分支和遠程的 master 分支關聯起來。
推送之前,需要先 pull 遠端倉庫,如果發(fā)現提交版本不一致,會出現錯誤
-
從遠程倉庫獲取最新內容
在多人協作過程中,當自己完成了本地倉庫中的提交,想要向遠程倉庫推送前,需要先獲取到遠程倉庫的最新內容。
可以通過 git fetch 和 git pull 來獲取遠程倉庫的內容。
git fetch origin master
git pull origin master
git fetch 和 git pull 之間的區(qū)別:
- git fetch 是僅僅獲取遠程倉庫的更新內容,并不會自動做合并。
- git pull 在獲取遠程倉庫的內容后,會自動做合并,可以看成 git fetch 之后 git merge。
-
移除無效的遠程倉庫
如果因為一些原因想要移除一個遠程倉庫
# 命令形式
git remote rm <shortname>
注意:此命令只是從本地移除遠程倉庫的記錄,并不會真正影響到遠程倉庫
-
從遠程倉庫克隆
如果想獲得一份已經存在了的 Git 倉庫的拷貝,這時就要用到 git clone 命令。 Git 克隆的是該 Git 倉庫服務器上的幾乎所有數據(包括日志信息、歷史記錄等),而不僅僅是復制工作所需要的文件。 當執(zhí)行 git clone 命令的時候,默認配置下遠程 Git 倉庫中的每一個文件的每一個版本都將被拉取下來。
如果本地沒有倉庫,希望從已有的遠程倉庫上復制一份代碼,那么就需要 git clone。
# 通過 https 協議,克隆 Github 上 git 倉庫的源碼
git clone https://github.com/zm/repo1.git
# 通過 ssh 協議,克隆 Github 上 git 倉庫的源碼
git clone git@github.com:zm/repo1.git
注意:git clone 后面的倉庫地址,可以支持多種協議,如 https,ssh 等。
-
從遠程倉庫中拉取
拉取 pull
# 命令形式
git pull [遠程倉庫名稱] [分支名稱]
-
解決合并沖突
在一段時間,A、B 用戶修改了同一個文件,且修改了同一行位置的代碼,此時會發(fā)生合并沖突。
A 用戶在本地修改代碼后優(yōu)先推送到遠程倉庫,此時 B 用戶在本地修訂代碼,提交到本地倉庫后,也需要推送到遠程倉庫,此時 B 用戶晚于 A 用戶推送,故需要先拉取遠程倉庫代碼,經過合并后才能推送代碼。在 B 用戶拉取代碼時,因為 A、B 用戶同一段時間修改了同一個文件的相同位置代碼,故會發(fā)生合并沖突。
A 用戶:修改 a.java 代碼推送到遠程倉庫
B 用戶:修改 a.java 同一行代碼,提交之后,合并碼出現沖突
解決方法:
- 先拉取代碼
- 然后打開代碼解決沖突
- 再提交
小結
遠程倉庫操作常用命令:
# 查看所有遠程倉庫名稱
git remote
# 查看遠程倉庫縮略信息
git remote -v
# 將本地倉庫代碼推送到遠程倉庫
git push origin master
# 克隆遠程倉庫代碼到本地
git clone https://github.com/zm/repo1.git
# 拉取遠程倉庫代碼到本地(fetch+merge)
git pull origin master
在 IDEA 中使用 Git
-
在 IDEA 中配置 Git
安裝好 IntelliJ IDEA 后,如果 Git 安裝在默認路徑下,那么 idea 會自動找到 Git 的位置,如果更改了 Git 的安裝位置則需要手動配置下 Git 的路徑。選擇 File → Settings 打開設置窗口,找到Version Control 下的 Git 選項,輸入 git.exe 的路徑,點擊 Test 按鈕,現在執(zhí)行成功,配置完成。
-
開發(fā)中 IDEA 的 Git 常見操作
初始化并提交項目到遠程倉庫【項目 Leader 操作】
執(zhí)行步驟:
- 在 GitHub / 碼云中創(chuàng)建遠程倉庫
- 將 maven 工程交給 Git 管理
- 配置忽略文件
- 提交到本地倉庫
- 推送到遠程倉庫
克隆遠程倉庫到本地【開發(fā)人員】
啟動 IDEA,從遠程倉庫克隆項目
本地倉庫推送Push至遠程倉庫
操作步驟:
- 推送前一定要先拉取遠程倉庫對應分支
- 如果有沖突,先解決沖突,并提交到本地倉庫
- 推送當前分支到遠程倉庫
分支操作
操作步驟:
- 創(chuàng)建分支
- 切換分支執(zhí)行操作
- 執(zhí)行合并操作,master 合并 dev,并推送到遠程倉庫
傻瓜追蹤器:版本比較
對代碼修改后,可以點擊 Show History 按鈕,對比差異