什麼是版本控制
版本控制(Revision control)是一種在開發的過程中用于管理我們對檔案、目錄或工程等内容的修改曆史,友善檢視更改曆史記錄,備份以便恢複以前的版本的軟體工程技術。
- 實作跨區域多人協同開發
- 追蹤和記載一個或者多個檔案的曆史記錄
- 組織和保護你的源代碼和文檔
- 統計工作量
- 并行開發、提高開發效率
- 跟蹤記錄整個軟體的開發過程
- 減輕開發人員的負擔,節省時間,同時降低人為錯誤
簡單說就是用于管理多人協同開發項目的技術。
沒有進行版本控制或者版本控制本身缺乏正确的流程管理,在軟體開發過程中将會引入很多問題,如軟體代碼的一緻性、軟體内容的備援、軟體過程的事物性、軟體開發過程中的并發性、軟體源代碼的安全性,以及軟體的整合等問題。
無論是工作還是學習,或者是自己做筆記,都經曆過這樣一個階段!我們就迫切需要一個版本控制工具!
多人開發就必須要使用版本控制!
常見的版本控制工具
我們學習的東西,一定是當下最流行的!
主流的版本控制器有如下這些:
- Git
- SVN(Subversion)
- CVS(Concurrent Versions System)
- VSS(Micorosoft Visual SourceSafe)
- TFS(Team Foundation Server)
- Visual Studio Online
版本控制産品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),現在影響力最大且使用最廣泛的是Git與SVN
版本控制分類
1、本地版本控制
記錄檔案每次的更新,可以對每個版本做一個快照,或是記錄更新檔檔案,适合個人用,如RCS。

2、集中版本控制 SVN
所有的版本資料都儲存在伺服器上,協同開發者從伺服器上同步更新或上傳自己的修改
所有的版本資料都存在伺服器上,使用者的本地隻有自己以前所同步的版本,如果不連網的話,使用者就看不到曆史版本,也無法切換版本驗證問題,或在不同分支工作。而且,所有資料都儲存在單一的伺服器上,有很大的風險這個伺服器會損壞,這樣就會丢失所有的資料,當然可以定期備份。代表産品:SVN、CVS、VSS
3、分布式版本控制 Git
每個人都擁有全部的代碼!安全隐患!
所有版本資訊倉庫全部同步到本地的每個使用者,這樣就可以在本地檢視所有版本曆史,可以離線在本地送出,隻需在連網時push到相應的伺服器或其他使用者那裡。由于每個使用者那裡儲存的都是所有的版本資料,隻要有一個使用者的裝置沒有問題就可以恢複所有的資料,但這增加了本地存儲空間的占用。
不會因為伺服器損壞或者網絡問題,造成不能工作的情況!
Git與SVN的主要差別
SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的,而工作的時候,用的都是自己的電腦,是以首先要從中央伺服器得到最新的版本,然後工作,完成工作後,需要把自己做完的活推送到中央伺服器。集中式版本控制系統是必須聯網才能工作,對網絡帶寬要求較高。
Git是分布式版本控制系統,沒有中央伺服器,每個人的電腦就是一個完整的版本庫,工作的時候不需要聯網了,因為版本都在自己電腦上。協同的方法是這樣的:比如說自己在電腦上改了檔案A,其他人也在電腦上改了檔案A,這時,你們兩之間隻需把各自的修改推送給對方,就可以互相看到對方的修改了。Git可以直接看到更新了哪些代碼和檔案!
Git是目前世界上最先進的分布式版本控制系統。
聊聊Git的曆史
同生活中的許多偉大事物一樣,Git 誕生于一個極富紛争大舉創新的年代。
Linux 核心開源項目有着為數衆廣的參與者。絕大多數的 Linux 核心維護工作都花在了送出更新檔和儲存歸檔的繁瑣事務上(1991-2002年間)。到 2002 年,整個項目組開始啟用一個專有的分布式版本控制系統 BitKeeper 來管理和維護代碼。
Linux社群中存在很多的大佬!破解研究 BitKeeper !
到了 2005 年,開發 BitKeeper 的商業公司同 Linux 核心開源社群的合作關系結束,他們收回了 Linux 核心社群免費使用 BitKeeper 的權力。這就迫使 Linux 開源社群(特别是 Linux 的締造者 Linus Torvalds)基于使用 BitKeeper 時的經驗教訓,開發出自己的版本系統。(2周左右!) 也就是後來的 Git!
Git是免費、開源的,最初Git是為輔助 Linux 核心開發的,來替代 BitKeeper!
Linux和Git之父李納斯·托沃茲(Linus Benedic Torvalds)1969、芬蘭
Git環境配置
軟體下載下傳
打開 [git官網] https://git-scm.com/,下載下傳git對應作業系統的版本。
所有東西下載下傳慢的話就可以去找鏡像!
官網下載下傳太慢,我們可以使用淘寶鏡像下載下傳:http://npm.taobao.org/mirrors/git-for-windows/
下載下傳對應的版本即可安裝!
安裝:無腦下一步即可!安裝完畢就可以使用了!
啟動Git
安裝成功後在開始菜單中會有Git項,菜單下有3個程式:任意檔案夾下右鍵也可以看到對應的程式!
Git Bash:Unix與Linux風格的指令行,使用最多,推薦最多
Git CMD:Windows風格的指令行
Git GUI:圖形界面的Git,不建議初學者使用,盡量先熟悉常用指令
常用的Linux指令
平時一定要多使用這些基礎的指令!
1)、cd : 改變目錄。
2)、cd . . 回退到上一個目錄,直接cd進入預設目錄
3)、pwd : 顯示目前所在的目錄路徑。
4)、ls(ll): 都是列出目前目錄中的所有檔案,隻不過ll(兩個ll)列出的内容更為詳細。
5)、touch : 建立一個檔案 如 touch index.js 就會在目前目錄下建立一個index.js檔案。
6)、rm: 删除一個檔案, rm index.js 就會把index.js檔案删除。
7)、mkdir: 建立一個目錄,就是建立一個檔案夾。
8)、rm -r : 删除一個檔案夾, rm -r src 删除src目錄
rm -rf / 切勿在Linux中嘗試!删除電腦中全部檔案!
9)、mv 移動檔案, mv index.html src index.html 是我們要移動的檔案, src 是目标檔案夾,當然, 這樣寫,必須保證檔案和目标檔案夾在同一目錄下。
10)、reset 重新初始化終端/清屏。
11)、clear 清屏。
12)、history 檢視指令曆史。
13)、help 幫助。
14)、exit 退出。
15)、#表示注釋
Git配置
所有的配置檔案,其實都儲存在本地!
檢視配置 git config -l
檢視不同級别的配置檔案:
#檢視系統config
git config --system --list
#檢視目前使用者(global)配置
git config --global --list
Git相關的配置檔案:
1)、Git\etc\gitconfig :Git 安裝目錄下的 gitconfig --system 系統級
2)、C:\Users\Administrator\ .gitconfig 隻适用于目前登入使用者的配置 --global 全局
這裡可以直接編輯配置檔案,通過指令設定後會響應到這裡。
設定使用者名與郵箱(使用者辨別,必要)
當你安裝Git後首先要做的事情是設定你的使用者名稱和e-mail位址。這是非常重要的,因為每次Git送出都會使用該資訊。它被永遠的嵌入到了你的送出中:
git config --global user.name "kuangshen" #名稱
git config --global user.email [email protected] #郵箱
隻需要做一次這個設定,如果你傳遞了--global 選項,因為Git将總是會使用該資訊來處理你在系統中所做的一切操作。如果你希望在一個特定的項目中使用不同的名稱或e-mail位址,你可以在該項目中運作該指令而不要--global選項。總之--global為全局配置,不加為某個項目的特定配置。
Git基本理論(重要)
三個區域
Git本地有三個工作區域:工作目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)。如果在加上遠端的git倉庫(Remote Directory)就可以分為四個工作區域。檔案在這四個區域之間的轉換關系如下:
- Workspace:工作區,就是你平時存放項目代碼的地方
- Index / Stage:暫存區,用于臨時存放你的改動,事實上它隻是一個檔案,儲存即将送出到檔案清單資訊
- Repository:倉庫區(或本地倉庫),就是安全存放資料的位置,這裡面有你送出到所有版本的資料。其中HEAD指向最新放入倉庫的版本
- Remote:遠端倉庫,托管代碼的伺服器,可以簡單的認為是你項目組中的一台電腦用于遠端資料交換
本地的三個區域确切的說應該是git倉庫中HEAD指向的版本:
- Directory:使用Git管理的一個目錄,也就是一個倉庫,包含我們的工作空間和Git的管理空間。
- WorkSpace:需要通過Git進行版本控制的目錄和檔案,這些目錄和檔案組成了工作空間。
- .git:存放Git管理資訊的目錄,初始化倉庫的時候自動建立。
- Index/Stage:暫存區,或者叫待送出更新區,在送出進入repo之前,我們可以把所有的更新放在暫存區。
- Local Repo:本地倉庫,一個存放在本地的版本庫;HEAD會隻是目前的開發分支(branch)。
- Stash:隐藏,是一個工作狀态儲存棧,用于儲存/恢複WorkSpace中的臨時狀态。
工作流程
git的工作流程一般是這樣的:
1、在工作目錄中添加、修改檔案;
2、将需要進行版本管理的檔案放入暫存區域;
3、将暫存區域的檔案送出到git倉庫。
是以,git管理的檔案有三種狀态:已修改(modified),已暫存(staged),已送出(committed)
Git項目搭建
建立工作目錄與常用指令
工作目錄(WorkSpace)一般就是你希望Git幫助你管理的檔案夾,可以是你項目的目錄,也可以是一個空目錄,建議不要有中文。
日常使用隻要記住下圖6個指令:
本地倉庫搭建
建立本地倉庫的方法有兩種:一種是建立全新的倉庫,另一種是克隆遠端倉庫。
1、建立全新的倉庫,需要用GIT管理的項目的根目錄執行:
# 在目前目錄建立一個Git代碼庫
$ git init
2、執行後可以看到,僅僅在項目目錄多出了一個.git目錄,關于版本等的所有資訊都在這個目錄裡面。
克隆遠端倉庫
1、另一種方式是克隆遠端目錄,由于是将遠端伺服器上的倉庫完全鏡像一份至本地!
# 克隆一個項目和它的整個代碼曆史(版本資訊)
$ git clone [url] # https://gitee.com/kuangstudy/openclass.git
2、去 gitee 或者 github 上克隆一個測試!
Git檔案操作
檔案的四種狀态
版本控制就是對檔案的版本控制,要對檔案進行修改、送出等操作,首先要知道檔案目前在什麼狀态,不然可能會送出了現在還不想送出的檔案,或者要送出的檔案沒送出上。
- Untracked: 未跟蹤, 此檔案在檔案夾中, 但并沒有加入到git庫, 不參與版本控制. 通過git add 狀态變為Staged.
- Unmodify: 檔案已經入庫, 未修改, 即版本庫中的檔案快照内容與檔案夾中完全一緻. 這種類型的檔案有兩種去處, 如果它被修改, 而變為Modified. 如果使用git rm移出版本庫, 則成為Untracked檔案
- Modified: 檔案已修改, 僅僅是修改, 并沒有進行其他的操作. 這個檔案也有兩個去處, 通過git add可進入暫存staged狀态, 使用git checkout 則丢棄修改過, 傳回到unmodify狀态, 這個git checkout即從庫中取出檔案, 覆寫目前修改 !
- Staged: 暫存狀态. 執行git commit則将修改同步到庫中, 這時庫中的檔案和本地檔案又變為一緻, 檔案為Unmodify狀态. 執行git reset HEAD filename取消暫存, 檔案狀态為Modified
檢視檔案狀态
上面說檔案有4種狀态,通過如下指令可以檢視到檔案的狀态:
#檢視指定檔案狀态
git status [filename]
#檢視所有檔案狀态
git status
# git add . 添加所有檔案到暫存區
# git commit -m "消息内容" 送出暫存區中的内容到本地倉庫 -m 送出資訊
忽略檔案
有些時候我們不想把某些檔案納入版本控制中,比如資料庫檔案,臨時檔案,設計檔案等
在主目錄下建立".gitignore"檔案,此檔案有如下規則:
- 忽略檔案中的空行或以井号(#)開始的行将會被忽略。
- 可以使用Linux通配符。例如:星号(*)代表任意多個字元,問号(?)代表一個字元,方括号([abc])代表可選字元範圍,大括号({string1,string2,...})代表可選的字元串等。
- 如果名稱的最前面有一個感歎号(!),表示例外規則,将不被忽略。
- 如果名稱的最前面是一個路徑分隔符(/),表示要忽略的檔案在此目錄下,而子目錄中的檔案不忽略。
- 如果名稱的最後面是一個路徑分隔符(/),表示要忽略的是此目錄下該名稱的子目錄,而非檔案(預設檔案或目錄都忽略)。
#為注釋
*.txt #忽略所有 .txt結尾的檔案,這樣的話上傳就不會被選中!
!lib.txt #但lib.txt除外
/temp #僅忽略項目根目錄下的TODO檔案,不包括其它目錄temp
build/ #忽略build/目錄下的所有檔案
doc/*.txt #會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
使用碼雲
github 是有牆的,比較慢,在國内的話,我們一般使用 gitee ,公司中有時候會搭建自己的gitlab伺服器
這個其實可以作為大家未來找工作的一個重要資訊!
1、注冊登入碼雲,完善個人資訊
2、設定本機綁定SSH公鑰,實作免密碼登入!(免密碼登入,這一步挺重要的,碼雲是遠端倉庫,我們是平時工作在本地倉庫!)
# 進入 C:\Users\Administrator\.ssh 目錄
# 生成公鑰
ssh-keygen
3、将公鑰資訊public key 添加到碼雲賬戶中即可!
4、使用碼雲建立一個自己的倉庫!
許可證:開源是否可以随意轉載,開源但是不能商業使用,不能轉載,... 限制!
克隆到本地!
IDEA中內建Git
1、建立項目,綁定git。
注意觀察idea中的變化
2、修改檔案,使用IDEA操作git。
- 添加到暫存區
- commit 送出
- push到遠端倉庫
3、送出測試
這些都是單個人的操作!
學習的方式最重要!學會學習!我上課的更多時候都是在教大家去學習一種理念和思想(學習方式)
有道無術、術尚可求。有術無道、止于術!
真正的教學,授人以漁!
說明:GIT分支
分支在GIT中相對較難,分支就是科幻電影裡面的平行宇宙,如果兩個平行宇宙互不幹擾,那對現在的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合并了,我們就需要處理一些問題了!
git分支中常用指令:
# 列出所有本地分支
git branch
# 列出所有遠端分支
git branch -r
# 建立一個分支,但依然停留在目前分支
git branch [branch-name]
# 建立一個分支,并切換到該分支
git checkout -b [branch]
# 合并指定分支到目前分支
$ git merge [branch]
# 删除分支
$ git branch -d [branch-name]
# 删除遠端分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
IDEA中操作
.gitignore
*.class
*.log
*.lock
# Package Files #
*.jar
*.war
*.ear
target/
# idea
.idea/
*.iml/
*velocity.log*
### STS ###
.apt_generated
.factorypath
.springBeans
### IntelliJ IDEA ###
*.iml
*.ipr
*.iws
.idea
.classpath
.project
.settings/
bin/
tmp/
#rebel
*rebel.xml*
如果同一個檔案在合并分支時都被修改了則會引起沖突:解決的辦法是我們可以修改沖突檔案後重新送出!選擇要保留他的代碼還是你的代碼!
master主分支應該非常穩定,用來釋出新版本,一般情況下不允許在上面工作,工作一般情況下在建立的dev分支上工作,工作完後,比如上要釋出,或者說dev分支代碼穩定後可以合并到主分支master上來。
b站搜尋狂神說Java,講的非常好!