1 版本控制工具應該具備的功能
- 協同修改
- 多人並行不悖的修改服務器端的同一個文件。
- 數據備份
- 不僅保存目錄和文件的當前狀態,還能夠保存每一個提交過的歷史狀態。
- 版本管理。
- 在保存每一個版本的文件信息的時候要做到不保存重復數據,以節約存儲空間,提高運行效率。這方面 SVN 采用的是增量式管理的方式,而 Git 采取了文件系統快照的方式。
- 權限控制
- 對團隊中參與開發的人員進行權限控制。
- 對團隊外開發者貢獻的代碼進行審核 -> Git 獨有。
- 歷史記錄
- 查看修改人、修改時間、修改內容、日志信息。
- 將本地文件恢復到某一個歷史狀態。
- 分支管理
- 允許開發團隊在工作過程中多條生產線同時推進任務,進一步提高效率。
2 版本控制簡介
2.1 版本控制
工程設計領域中使用版本控制管理工程藍圖的設計過程。在 IT 開發過程中也可以使用版本控制思想管理代碼的版本迭代。
2.2 版本控制工具
思想:版本控制
實現:版本控制工具
集中式版本控制工具:
CVS、SVN、VSS ……
分布式版本控制工具:
Git、Mercurial、Bazaar、Darcs ……
3 Git 簡介
3.1 Git 的簡史
3.2 Git 官網和 Logo
官網地址:https://git-scm.com/
3.3 Git 的優勢
- 大部分操作在本地完成,不需要聯網
- 完整性保證
- 盡可能添加數據而不是刪除或修改數據
- 分支操作非常快捷流暢
- 與 Linux 命令全面兼容
3.4 Git 的安裝
參考鏈接文章:https://www.cnblogs.com/chenmingjun/p/10160410.html注:
1、安裝到一個沒有中文和沒有空格的目錄
2、Git的默認編輯器:建議使用Vim編輯器
3.5 Git 的本地結構
3.6 Git 和代碼托管中心
代碼托管中心的任務:維護遠程倉庫。
- 局域網環境下
- GitLab 服務器
- 外網環境下
- GitHub
- 碼雲
- Coding
3.7 本地倉庫和遠程倉庫
3.7.1 團隊內部協作
3.7.2 跨團隊協作
4 Git 命令行操作
4.1 本地倉庫初始化
命令:git init
效果:
注:.git目錄中存放的是本地庫相關的子目錄和文件,不要刪除,也不要胡亂修改。
4.2 設置簽名
形式:
用戶名:tom
Email地址:goodMorning@atguigu.com
作用:區分不同開發人員的身份。
辨析:這里設置的簽名和登錄遠程庫(代碼托管中心)的賬號、密碼沒有任何關系。
命令:
項目級別/倉庫級別:僅在當前本地庫范圍內有效
git config user.name tom_pro
git config user.email goodMorning_pro@atguigu.com
設置的信息保存位置:./.git/config 文件
系統用戶級別:登錄當前操作系統的用戶范圍
git config --global user.name tom_glb
git config --global user.email goodMorning_glb@atguigu.com
設置的信息保存位置:
~/.gitconfig 文件
級別優先級:
就近原則:項目級別優先於系統用戶級別,二者都有時采用項目級別的簽名。
如果只有系統用戶級別的簽名,就以系統用戶級別的簽名為准。
二者都沒有不允許。
實際開發中我們設置的是系統用戶級別較多。
4.3 基本操作
4.3.1 狀態查看
git status
查看工作區、暫存區狀態
4.3.2 添加
git add [filename]
將工作區的“新建/修改”添加到暫存區
4.3.3 提交
git commit -m "commit message" [filename]
將暫存區的內容提交到本地倉庫
以上三個命令的實際操作圖解如下:
4.3.4 查看歷史記錄
git log
多屏顯示控制方式:
空格向下翻頁
b 向上翻頁
q 退出
git log --pretty=oneline
git log --oneline
git reflog
HEAD@{移動到當前版本需要多少步}
4.3.5 版本的前進后退
本質:
基於索引值操作[推薦]
git reset --hard [局部索引值]
git reset --hard c433284
使用^符號:只能后退
git reset --hard HEAD^
注:一個^表示后退一步,n個^表示后退n步
使用~符號:只能后退
git reset --hard HEAD~n
注:表示后退n步
查看文件的最后3行數據:
tail -n 3 good.txt
4.3.6 reset命令的三個參數對比
打開Git命令的本地幫助文檔:
$ git help reset
注:打開的是本地的幫助文檔
--soft 參數
表示僅僅在本地庫中移動HEAD指針
--mixed 參數
表示在本地庫移動HEAD指針
且重置暫存區(修改)
--hard 參數
表示在本地庫移動HEAD指針
且重置暫存區(index file)
且重置工作區(working tree)
4.3.7 刪除文件並找回
演示前提:刪除前,文件存在的狀態是已提交到了本地庫后再進行刪除操作。
操作:git reset --hard [指針位置]
刪除操作已經提交到本地庫:指針位置指向歷史記錄
刪除操作尚未提交到本地庫:指針位置使用HEAD
任何一個已經提交的版本操作,就會在本地版本庫中有一個確定的記錄,記錄着該文件的操作,即便我們做的是提交刪除的操作,那么該記錄也是不可磨滅的。
Git只會增加版本,而不會把任何一個版本刪除。
本地庫 == 本地倉庫 == 本地版本庫
[刪除操作已經提交到本地庫]完整截圖如下:
找回[刪除操作已經提交到本地庫]完整截圖如下:
[刪除操作尚未提交到本地庫]完整截圖如下:
找回[刪除操作尚未提交到本地庫]完整截圖如下:
4.3.8 比較文件差異
git 是以行為單位進行文件管理的。
git diff [文件名]
將工作區中的文件和暫存區中的文件進行比較
git diff [本地庫中某一歷史版本] [文件名]
將工作區中的文件和本地庫歷史記錄進行比較
注:不指定具體文件名時候表示比較多個文件。
4.4 分支管理
4.4.1 什么是分支
在版本控制過程中,使用多條線同時推進多個任務。
4.4.2 分支的好處
1、同時並行推進多個功能開發,提高開發效率。
2、各個分支在開發過程中,如果某一個分支開發失敗,不會對其他分支有任何影響。失敗的分支刪除重新開始即可。
4.4.3 分支的具體操作
創建分支
git branch [分支名]
查看分支
git branch -v
切換分支
git checkout [分支名]
合並分支
第一步:切換到接受修改的分支(即被合並,增加新內容的分支)上
git checkout [被合並的分支名]
第二步:執行merge命令
git merge [有新內容的分支名]
解決沖突
沖突的表現
沖突的解決
第一步:編輯文件,刪除特殊符號
第二步:把文件修改到滿意的程度(
需要與他人溝通或者自己決定),保存退出
第三步:git add [文件名]
第四步:git commit -m "日志信息"
注意:此時commit一定不能帶具體文件名
5 Git 的基本原理
5.1 哈希
哈希是一個系列的加密算法,各個不同的哈希算法雖然加密強度不同,但是有以下幾個共同點:
① 不管輸入數據的數據量有多大,輸入同一個哈希算法,得到的加密結果長度固定。
② 哈希算法確定,輸入數據確定,輸出數據能夠保證不變。
③ 哈希算法確定,輸入數據有變化,輸出數據一定有變化,而且通常變化很大。
④ 哈希算法不可逆。(但可以窮舉)
Git底層采用的是SHA-1算法。哈希算法可以被用來驗證文件。原理如下圖所示:
Git就是靠這種機制來從根本上保證數據完整性的。
5.2 Git 保存版本的機制
5.2.1 集中式版本控制工具的文件管理機制
以文件變更列表的方式存儲信息。這類系統將它們保存的信息看作是一組基本文件和每個文件隨時間逐步累積的差異。
5.2.2 Git的文件管理機制
Git把數據看作是小型文件系統的一組快照。每次提交更新時Git都會對當前的全部文件制作一個快照並保存這個快照的索引。為了高效,如果文件沒有修改,Git不再重新存儲該文件,而是只保留一個鏈接指向之前存儲的文件。所以Git的工作方式可以稱之為快照流。
5.2.3 Git 文件管理機制細節
Git的“提交對象”:
提交對象及其父對象形成的鏈條
類似於比特幣:比特幣內部管理交易和Git里面管理文件有很大的相似點,Git里面的每一個文件,相當於比特幣內部管理的一個交易。
比特幣是把所有的交易(包括交易本身)兩兩做哈希運算,一直歸並為最后的一個哈希,這就成了一個區塊,每一個區塊還要保存上一個區塊里面的哈希和下一個區塊里面的哈希。所以通過哈希算法就構成一個嚴密嚴謹的數據鏈條,其中的任何一個數據,只要做過哈希了,區塊確認過了,就不能被修改了。
5.3 Git 的分支管理機制
5.3.1 分支的創建
5.3.2 分支的切換
1、
2、
3、
4、
6 GitHub
6.1 創建GitHub賬號
GitHub首頁就是注冊頁面:https://github.com/
為了演示方便,注冊了3個人github的賬號:
以下演示,本博主只有一個GitHub遠程倉庫。
6.2 創建遠程倉庫
本地庫先做一個准備工作,如下圖所示:
創建以一個遠程倉庫
輸入一些信息后,點擊創建
遠程倉庫創建成功后的截圖
6.3 在本地創建遠程倉庫地址別名
git remote -v 查看當前所有遠程地址別名
git remote add [別名] [遠程倉庫地址]
注:別名起什么都可以!
6.4 本地倉庫推送到遠程倉庫
git push [別名] [分支名]注:首次推送需要填寫GitHub賬號和密碼。
6.5 克隆
git clone https://github.com/heizemingjun/huashan.git
效果:
1、完整的把遠程庫下載到本地
2、創建origin作為遠程倉庫地址別名
3、初始化本地庫
6.6 邀請團隊成員
注:以下演示,使用的是“6.1 創建GitHub賬號”中的三個GitHub賬號為准!
以“岳不群”的身份去邀請“令狐沖”加入團隊:
“岳不群”通過其他方式把邀請鏈接發送給“令狐沖”,“令狐沖”登錄自己的GitHub賬號,訪問邀請鏈接。即可加入團隊!
我們發現輸入GItHub的賬戶和密碼之后,下次就不用再輸入了,為什么呢?
答:對於http連接來說,Git本身沒有記住賬戶名和密碼的功能,是因為我們Win10系統有一個【憑據管理器】記住了GitHub的賬戶名和密碼。
打開【控制面板】-->【類別】-->【小圖標】
點擊【憑據管理器】
再點擊【Windows憑據】
如果下次我們想切換別的GitHub賬號和密碼進行登錄的話,就將該選項刪除掉。點擊【刪除】選項即可。
6.7 拉取
pull=fetch+merge
git fetch [遠程庫地址別名] [遠程分支名] 該操作只是把遠程倉庫的內容下載到本地,但並沒有修改本地工作區的文件,該命令的作用是:先抓取下來查看下,沒有問題才去合並。這樣保險!
git merge [遠程庫地址別名/遠程分支名]
git pull [遠程庫地址別名] [遠程分支名]注:fetch和pull屬於讀操作,不需要登錄賬號和密碼!補:
git checkout orgin/master 切換到遠程倉庫的主分支
git checkout master 切換到本地倉庫的主分支
6.8 解決沖突
要點:
如果不是基於GitHub遠程庫的最新版所做的修改,不能直接推送,必須先拉取。
拉取下來后如果進入沖突狀態,則按照【分支沖突的解決】操作解決即可。
類比:
債權人:老王(發債的人)
債務人:小劉(欠債的人)
老王說:10天后歸還。小劉接受,雙方達成一致。
老王媳婦說:5天后歸還。小劉不能接受。老王媳婦需要找老王確認后再執行。
6.9 跨團隊協作
Fork
正在Forking……請稍等!
Fork成功后的截圖:
“東方不敗”將遠程倉庫的內容克隆到本地倉庫后,進行修改,然后推送到“自己的遠程倉庫”。
“東方不敗”將“自己的遠程倉庫”推送到“岳不群的遠程倉庫”的操作:
點擊【Pull requests】
再點擊【New pull request】
再點擊【Create pull request】
填寫此次修改的【標題】和【修改說明】后,再點擊【Create pull request】
創建拉取請求成功后的頁面:
岳不群這邊點擊【Pull requests】按鈕
岳不群可以查看東方不敗發過來的消息
消息詳情如下:
對話/評論
對話細節:
審核代碼
經過一番唇槍舌戰之后,岳不群要合並代碼了,合並代碼前需要先審核代碼:
合並代碼
岳不群審核代碼沒有問題,就可以進行代碼合並了!點擊【Conversation】
填寫本次操作的日志信息:
岳不群再將遠程倉庫的修改拉取到本地倉庫,遠程團隊協作完成。
6.10 SSH登錄
如果Windows系統沒有憑據管理器為我們保存GitHub的賬號和密碼,那么我們
基於Http地址的方式進行push操作的時候,就需要每次輸入GitHub的賬號和密碼,比較麻煩,有沒有別的方法呢?
答:答案是肯定的!使用SSH方式登錄。缺點:這種方式只能為一個賬號和密碼進行設置,實際開發中,我們有一個GitHub賬號已經夠用了。
演示SSH登錄
進入當前用戶的家目錄
$ cd ~
刪除.ssh目錄
$ rm -rvf .ssh
運行命令生成.ssh密鑰目錄
$ ssh-keygen -t rsa -C heizemingjun@gmail.com
注意:這里-C這個參數是大寫的C。
需要確認幾個信息,我們點擊幾下回車即可。回車表示使用默認值。
進入.ssh目錄查看文件列表
$ cd .ssh
$ ls -lF
查看id_rsa.pub文件內容
$ cat id_rsa.pub
復制id_rsa.pub文件內容,登錄GitHub,點擊用戶頭像 -> Settings -> SSH and GPG keys -> New SSH Key
輸入復制的密鑰信息,隨意起一個“Title”名稱。再點擊【And SSH key】。
再回到客戶端Gitbash創建遠程地址別名
git remote add orgin_ssh git@github.com:heizemingjun/huashan.git
推送文件進行測試,沒有問題
7 Eclipse操作
7.1 將Maven工程初始化為本地倉庫
工程 -> 右鍵 -> Team -> Share Project -> Git
選中項目后點擊【Create Repository】
就會在該項目目錄下創建.git目錄,點擊【Finish】
查看該工程的配置
在Eclipse中設置本地倉庫的范圍簽名
點擊【And Entry…】,輸入用戶名
輸入郵箱,同理。
設置好后的效果:
在Eclipse中Git圖標的介紹
7.2 Eclipse中忽略文件
概念:Eclipse特定文件
這些都是Eclipse為了管理我們創建的工程而維護的文件,和開發的代碼沒有直接關系。最好不要在Git中進行追蹤,也就是把它們忽略。
.classpath 文件
.project 文件
.settings 目錄下所有文件
為什么要忽略Eclipse特定文件呢?
同一個團隊中很難保證大家使用相同的IDE工具,而IDE工具不同時,相關工程特定文件就有可能不同。如果這些文件加入版本控制,那么開發時很可能需要為了這些文件解決沖突。
GitHub官網樣例文件
https://github.com/github/gitignore
https://github.com/github/gitignore/blob/master/Java.gitignore
編輯本地忽略配置文件,文件名任意
Java.gitignore
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
推薦放置忽略文件的目錄:C:\Users\bruce目錄下
在~/.gitconfig文件中引入上述文件
[core]
excludesfile = C:/Users/bruce/Java.gitignore
注意:這里路徑中一定要使用“/”,不能使用“\”,linux中只識別正斜杠。
Eclipse中查看忽略文件是否被讀取成功
效果:
Eclipse中本地倉庫的基本操作
1、將工程添加至本地暫存區
效果:
2、將工程提交至本地倉庫
效果:
3、填寫提交的日志信息后點擊【提交】按鈕
角標變為小金桶
7.3 推送到遠程倉庫
0、准備工作:先在GitHub上新建一個與Eclipse工程名相同的遠程倉庫TestGit。
1、然后在Eclipse上進行操作
2、填寫相關信息:
3、點擊【Add All Branches Spec】
4、填寫特定的日志信息,一般我們使用默認的即可
5、操作成功后的截圖
7.4 Oxygen Eclipse 克隆工程操作
1、Import…導入工程
2、Clone URI
3、到遠程庫復制工程(倉庫)地址
4、粘貼
5、選擇分支
6、指定工程的保存位置
7、指定工程導入方式,這里只能用:Import as general project
8、填寫工程名,點擊【Finish】
9、轉換工程類型
10、最終效果
7.5 KeplerEclipse 克隆工程操作
其余步驟同上。
問題:不能保存到當前Eclipse工作區目錄
正確做法:保存到工作區以外的目錄中
7.6 解決沖突
沖突文件 -> 右鍵 -> Team -> Merge Tool
修改完成后正常執行add/commit操作即可。
8 Git 的工作流
8.1 概念
在項目開發過程中使用Git的方式。
8.2 分類
8.2.1 集中式工作流
像SVN一樣,集中式工作流以中央倉庫作為項目所有修改的單點實體。所有修改都提交到Master這個分支上。
這種方式與SVN的主要區別就是開發人員有本地庫。Git很多特性並沒有用到。
8.2.2 GitFlow工作流
Gitflow工作流通過為功能開發、發布准備和維護設立了獨立的分支,讓發布迭代過程更流暢。嚴格的分支模型也為大型項目提供了一些非常必要的結構。
8.2.3 Forking工作流
Forking工作流是在GitFlow基礎上,充分利用了Git的Fork和pull request的功能以達到
代碼審核的目的。更適合安全可靠地管理大團隊的開發者,而且能接受不信任貢獻者的提交。
8.3 詳解
8.3.1 分支種類
主干分支 master
主要負責管理正在運行的生產環境代碼。永遠保持與正在運行的生產環境完全一致。
開發分支 develop
主要負責管理正在開發過程中的代碼。一般情況下應該是最新的代碼。
bug修理分支 hotfix
主要負責管理生產環境下出現的緊急修復的代碼。從主干分支分出,修理完畢並測試上線后,並回主干分支。並回后,視情況可以刪除該分支。
准生產分支(預發布分支) release
較大的版本上線前,會從開發分支中分出准生產分支,進行最后階段的集成測試。該版本上線后,會合並到主干分支。生產環境運行一段階段較穩定后可以視情況刪除。
功能分支 feature
為了不影響較短周期的開發工作,一般把中長期開發模塊,會從開發分支中獨立出來。開發完成后會合並到開發分支。
8.3.2 GitFlow工作流舉例
8.3.3 分支實戰
注:創建分支、審查代碼、合並分支這些操作都在本地做,不在遠程做。而且往master上去合並代碼時,一定是有經驗的程序員(比如項目經理、架構師等)去合並,這樣有保障!
8.3.4 具體操作
對於令狐沖來說:
創建分支
給分支起名字
完成后會自動切換到
hot_fix分支,我們在
本地hot_fix分支上做一些修改,再將該分支上的修改提交到本地倉庫(快捷鍵方式[Ctrl + #]),然后將hot_fix分支上的修改推送到遠程倉庫。
對於岳不群來說:
執行拉取操作后,切換到分支審查代碼
選擇遠程的分支
點擊【Check out as New Local Branch】(檢出為本地的新的分支)
點擊【Finish】即可
這樣就檢出遠程的新的分支了!
岳老板發現代碼有的地方寫的不夠好,需要小沖繼續修改,就發微信給小沖讓他如何如何改,小沖在本地hot_fix分支繼續修改后,再將該分支上的修改提交到本地倉庫(快捷鍵方式[Ctrl + #]),然后將hot_fix分支上的修改推送到遠程倉庫。岳老板重新進行拉取,切換分支,審查代碼……如此反復,直到沒有問題了,這時候岳老板就在本地將hot_fix分支合並到主分支master上,操作如下:
先要從hot_fix分支切換回master分支
再進行合並分支操作
使用本地的
hot_fix分支
合並結果
本地合並成功后,需要把master推送到遠程。
9 GitLab 服務器搭建過程
GitLab是局域網環境內的代碼托管中心。
准備工作:
VMware10.0 && VMware12.0 Pro && VMware14.0 Pro && VMware 15.0 Pro 的安裝與破解
VMware12.0 Pro 中安裝 CentOS-7.5(桌面版)
虛擬機CentOS 7.5 如何固定IP地址
使用終端工具鏈接遠程服務器:推薦使用全能終端:MobaXterm_Personal_11.0.exe,此乃神器中的神器!!!比SecureCRT、Xsheel要好!!!
9.1 官網地址
首頁:https://about.gitlab.com/
安裝說明:https://about.gitlab.com/installation/
9.2 安裝命令摘錄
sudo yum install -y curl policycoreutils-python openssh-server cronie
sudo lokkit -s http -s ssh
sudo yum install postfix
sudo service postfix start
sudo chkconfig postfix on
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ee
實際問題:yum安裝gitlab-ee(或ce)時,需要聯網下載幾百M的安裝文件,非常耗時,所以應提前把所需RPM包下載並安裝好。
下載地址為:
https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm
9.3 調整后的安裝過程
sudo rpm -ivh /opt/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm
sudo yum install -y curl policycoreutils-python openssh-server cronie
sudo lokkit -s http -s ssh
sudo yum install postfix
sudo service postfix start
sudo chkconfig postfix on
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com"
安裝過程中的截圖:
當前步驟完成后重啟虛擬機,命令:reboot。
9.4 gitlab服務操作
初始化配置gitlab
gitlab-ctl reconfigure
啟動gitlab服務
gitlab-ctl start
查看gitlab服務運行狀態
gitlab-ctl status
停止gitlab服務
gitlab-ctl stop
9.5 瀏覽器訪問
訪問Linux服務器IP地址即可,如果想訪問EXTERNAL_URL指定的域名還需要配置域名服務器nginx和本地hosts文件。
初次登錄時需要為gitlab的root用戶設置密碼。
用戶名:root
密碼:root1234
注:CenOS7需要停止防火牆服務:service firewalld stop,實際生產環境中需要設置相應的防火牆策略,用什么端口打開即可,不用的端口一律屏蔽;端口使用多少時間,也要設定。我們學習的時候,建議關閉虛擬機的防火牆。
登陸成功的界面:
后續操作同GitHub上的操作,大同小異,例如:創建一個項目(倉庫),點擊Create a project:
補:
Git遠程服務器搭建: https://www.cnblogs.com/chenmingjun/p/10164296.html#_label2
10 總結
11 資料附錄
最新尚硅谷Git&GitHup視頻
鏈接:https://pan.baidu.com/s/1JDQKVDtdK7_Tiw3Tejottg
密碼:2mvj
