(1) 分佈式,離線操做; java
(2) 每日工做備份(很是安全); git
(3) 異地協同辦公; github
(4) 現場版本控制; 數據庫
(5) 避免引入輔助目錄(好比svn總是有.svn這個隱藏目錄);git只在頂層有一個.git; windows
(6) 能夠吃後悔藥; 緩存
(7) 工做進度隨時保存(好比工做正在進行中臨時去修改bug); 安全
(8) 快。 bash
(1) 集中式協同模型(大多數公司在用的模型); 服務器
雙向箭頭表明「可讀可寫」! 網絡
(2) 社交網絡式式協同模型(Linux經典開發模型);
(3) GIT基本交互流程圖(記住)
這裏的Commit是提交到本地,而後再push到中央倉庫中,每次中央倉庫有更新,那麼其餘人就能夠作pull操做了。
Git操做步驟:
初始化倉庫後的文件下的目錄:
Head永遠都是指向當前的分支;
若是作Commit操做,都會生成一個Commit對象,這個Commit對象包括Tree對象,Tree對象包括blob對象……而且每次提交都會記下Parent(根據這些關係就能夠追溯到這些歷史過程了)。
Git操做原理:
每一次提交都是對應一個commit對象,一個commit對象包含一個ID、一個樹對象、parent、Author,這樣級級關聯。
(1) 先安裝Git,其實用這個Git已經能夠完成大部分的操做了,缺點是作任何事都要用命令行來操做;
(2) 爲了解決在命令行下操做Git不方便的問題,能夠安裝tortoiseGit,就能夠再圖形界面來操做Git了。
【注意:】
1) 使用tortoiseGit的Add後,還要在TortoiseGit的Settings中設置用戶名和郵箱(向服務器代表身份);
2) Add後就能夠Commit了(此時Commit只是添加到本地);
3) push(此時是推送到公共服務器上);
(3) 注意,在使用TortoiseGit建倉庫的時候要在目錄下建以git爲後綴的目錄:
要建立一個工做區
對話框中的選框若是不選上的話,是當作一個工做區(在這裏clone而後提交代碼的)。因此要將這個對話框選上,這樣就做爲一個空的工做區,讓別人來向這個空的工做區提交代碼(也就是說,共享倉庫必須創建成一個空的倉庫)。
上面圖中的目錄是在下圖中指定的(名字不是對應的):
(4) Git中若是user1作push操做出現「衝突」,緣由是公共倉庫中文件的內容和本地文件內容相同行的內容不同,此時若是user1作pull操做,那麼文件上就會出現「警告(歎號)」提示(此時可使用「Edit Conflics」來進行文件對比);如果user1只是在文件上添加一些內容,那麼作pull操做時就會自動合併內容。
——爲避免衝突太多,養成更新代碼的習慣(保持本地代碼是最新的)。
MyEclipse安裝方法是Help –> Configuration ->SoftWare(視頻中在Eclipse中安裝,用的也是這個方法,不是經過拷貝插件安裝的)。
下載Eclipse的git插件——EGit。下載網址http://download.eclipse.org/egit/updates-1.3/org.eclipse.egit-updatesite-1.3.0.201202151440-r-site.zip(注意我如今官網看到的最新的3.1版本myeclipse10中不能使用),把下載的插件解壓出來,刪掉XML文件。在MyEclipse的dropins目錄下新建一個egit文件夾,而後把剛纔解壓的features、plugins和另外兩個jar包全放進去。重啓MyEclipse後,進入window-preferences-team,看到Git選項,就說明安裝成功了。
實際開發中,開發者不是將代碼直接提交到中央倉庫中的,而是提交到develop分支上去,待到必定的穩定階段,纔將代碼發佈到Master中央倉庫中!
=======開發場景舉例:=======
(1) master是主分支,如今從產品的0.1版本開始,新建一個develop分支1,開始進行開發0.2版本
(2) 到了階段2的時候,原來的0.1版本在給用戶使用的過程當中發現了一個bug01,這時候就會從0.1版本上新建一個hotfixes(熱補丁分支),來對應這個bug01;
(3) bug01解決後,在master主分支上新建一個新版本(打一個Tag)Tag0.2,並將修正後的代碼,提交到Tag0.2上;——同時,將修復代碼與develop分支上的代碼進行(如階段3處)合併(develop分支上有bug01);
(4) 到了階段4,1.0版本的功能開發完成,這時候須要將代碼發佈到ReleaseBranch(發佈分支)5上。ReleaseBranch用來對代碼進一步作測試,確保代碼的安全性。這時候ReleaseBranch繼續,若是有bug就在ReleaseBranch上作修復,同時合併到develop上,與此同時1.0版本也是繼續在develop分支上繼續前進(好比從4階段開始接着開發2.0版本);
(5) ReleaseBranch的階段6發現沒什麼問題了,確實穩定了,這是纔將代碼合併到master分支上(打一個Tag1.0),同時合併到develop分支上
(6) develop左側的feature branch(特性分支),用來在develop分支的基礎上做特別開發的(好比分支A用來作高標準的安全校驗、B用來作高效數據庫查詢),其中A、B分支可能失敗可能成功,失敗就丟棄,成功就合併到develop分支上;
1.
一、 在本地模擬Git服務器:
安裝好Git後,在Git同目錄下建一個Repository,在Repository下再建一個git文件夾專門用來放git文件(之因此這樣作,是可能這個Repository下也能夠做爲svn的倉庫位置);
二、 初始化倉庫
視頻中右鍵有打開命令行的快捷鍵,個人沒有,桌面上的bash默認是在C盤下, 能夠經過cd ../../../d/ProgramFilesJava_Develop/Repository命令來到git的倉庫中(D:\ProgramFiles\……)
使用命令git init --bare shared.git建立一個文件夾名爲shared.git的文件夾(必須以.git爲結尾),這是一個空倉庫,shared.git文件結構:
【說明:】
hooks:鉤子程序,用來控制commit、update等操做,能夠定製一些操做事件;
info:有些文件或者目錄不須要作版本控制,能夠再這裏作設置(其中的exclude文件);
objects:記錄版本控制的信息;
refs:記錄頭、以及分支文件信息;
config:系統配置,好比記錄用戶名、郵箱等;
description:
HEAD:記錄主分支最新的提交;
——綜上所述,代碼提交後的全部的信息都在shared.git目錄下!
PPT內容:
三、 克隆項目
好比用戶1(user1),在本身的目錄(/user1)下可使用命令來將項目文件克隆下來。
此時就會在user1下生成一個目錄.git其中也有hooks、info等目錄,在.git同級目錄下就能夠新建文件而且將文件上傳了(先add、而後commit,還要設置username和email),以下操做:
四、 add、commit等操做原理
相關概念:工做區、暫存區、版本庫
圖形表示工做過程:
index文件就是暫存區(.git中沒有發現這個文件)index是索引,而後內容(對象 )會存在objects中。
master表明分支、head指向要提交的那個分支。master中的內容也是記錄在objects文件中。
上面都是用命令行來操做的,TortoiseGit能夠再圖形界面來操做。
一、 安裝:
將TortoiseGit安裝到D:\ProgramFiles\Java_Develop\目錄下(和Git同級目錄)
安裝過程當中:
二、
右鍵、implort、git:
、12.1. 分享一個項目
項目、右鍵、Team、share:
到此爲止,操做是在項目中建立一個.git文件目錄!
項目、右鍵、Team、Commit:
項目、右鍵、team、remote、push:
這裏必定要點擊「Force Update All Specs」!!!!
跟github大體差很少,命令行是通用的。
也要公鑰,公鑰是通用的。
版本控制:Reversion Control
(1) CVS:開啓版本控制之門;
(2) SVN:集中式版本控制之王;
(3) GIT:分佈式版本控制的偉大做品;
1.
Git是Linux的第二個偉大做品。
2005年有餘BitKeeper軟件公司對Linux社區中止了無償使用權,Linus無可奈何本身開發了一個分佈式版本控制工具,從而Git誕生了。
目前使用Git做爲版本控制的開源軟件:
LinuxKernel
Android
jQueyr
RubyOnRails
Debian
Eclipse上使用Git的數量已經超過了SVN。
l Git的最大優勢是「分佈式」!
傳統的SVN必需要連接服務器才能作提交代碼等代碼管理,好比在公司內部作開發,要鏈接公司內部的服務器,若是僅僅是內部開發,那麼用SVN仍是挺合適的。
可是,使用Git就能夠在任何地方作代碼管理,這就是「分佈式」。使用Git時,咱們每一個開發者都在本地有一個倉庫,遠程上的服務器的「倉庫」和本地的「倉庫」是同樣的。在沒有聯網的狀況下,咱們仍然能夠「提交代碼」——即提交到本地倉庫中,在能夠聯網的時候,再往服務器上push便可。
從上能夠看到,使用Git後咱們就能夠獲取到完整的源代碼——因此使用Git適合於開源軟件開發,若是軟件的安全級別很高,那麼就不適合使用Git了。(相比SVN,SVN就能夠作權限控制)。
(1) 分佈式;
(2) 每日工做備份;
(3) 異地協同工做;
(4) 現場版本控制:
——好比客戶發現了bug,工程師現場解決bug後,爲了防止後續版本有此bug,能夠從根目錄生成代碼,而後將當前bug打成補丁,帶回公司便可(這裏沒看懂……)。
(5) 避免引入輔助目錄(好比SVN中有不少的.svn目錄)
——Git只在頂層目錄有.Git目錄
(6) 能夠作「撤銷」操做;(sbash)
(7) 工做進度隨時保存:
——能夠隨時中止當前的工做並保存,而後能夠隨時從上次保存的進度再隨時開始(sbash)。
(8) 速度快(Git比SVN速度快得多)
Git的工做模型有兩種:
(1)集中式協同模型(相似SVN);
(2)社交網絡式協同模型。
1.
(SVN就是集中式協同模型)
(雙向箭頭表示可讀可寫)
從圖裏能夠看到,這裏的箭頭都是單向的,表示只讀,寫的話會有限制。
此圖也是Linux的經典開發模型,只有核心開發人員才能提交代碼,提交到核心倉庫。
【注意:】
公司裏,爲了方便和簡潔,通常都使用協同式開發模型,而不須要社交網絡式協同模型(須要一級一級的審覈)。
【圖示說明:】
開發人員使用Git的步驟:
(1) Clone:先從共享庫中將代碼複製(Clone)到本地;至關於svn的checkout
(2) 本地修改代碼後作提交(Commit),這裏的提交是提交到本地倉庫(push操做是提交到遠程服務器上);也就是書說,Git中要是提交代碼要通過兩步:1)commit提交到本地;2)push提交到服務器。
(3) 提交到本地後,就能夠作push操做(將本地代碼提交到共享庫中)。
(4) 當有人向共享庫中push代碼,那麼其餘人就可使用pull(至關於SVN的update)命令將代碼拉到本地。
(安裝步驟參考文檔)
1.
2.
3.
【步驟:】
(1) 新建一個文件夾,這裏命名爲Git_Repository;
// --bare 表示空的
git init --bare publickShare.git
建立後文件夾中的目錄:
【文件夾解釋:】
l hooks:該文件夾包含一些事件函數,如pre-commit.sample(提交前)、post-commit.sample(提交後),咱們能夠定製一些命令,好比提交後發郵件通知相關人士。
l info:能夠設置哪些文件不進行版本控制(要忽略的文件);
l objects:記錄提交的信息(好比提交時候的寫的mssage)
l refs:記錄頭和分支,標誌你的分支指向哪一個提交;
l config:系統配置,好比用戶名、密碼、郵箱等;
l description:項目的描述信息
l HEAD:指向當前分支的一個提交
在Git中,check out是切換的意思。
【經常使用命令】
// --bare 表示空的
git init --bare publickShare.git
// 查看當前目錄下文件的狀態(好比是否有未提交的)
git status
// add文件(好比要add一個a.jsp的文件)
git add a.jsp
// push 操做:將本地的master推送到遠程的UserManage中
// 咱們在config文件中能夠看到遠程服務地址有一個別名:origin
git push /reposistory/UserManage/ master
// 或者:
git push origin master
//git config命令有兩個參數
//1、--system:操做/etc/gitconfig文件包含了適用於系統全部用戶和全部庫的值
git config --system
//2、--global:操做~/.gitconfig文件:具體到用戶(這也是缺省值)
git config --gloabal
// 我的信息初始化
git config user.name="user1"
git config user.email="user1@163.com"
裝EGit:略
配置用戶:Preference》Git》Configuration》new Entry》經過配置key/Value設置用戶名和密碼。
從uriclone項目後,在項目上右鍵》import成在javaEE視圖能看到的項目。
在Eclipse中編輯時候:
(1) 一個文件修改後會有一個>符號顯示;
(2) Add後會顯示灰色星號;
(3) 有的文件提交時有衝突:
1) 先pull顯示衝突符號,而後右鍵MergeTool 》 選擇Use Head……那個選項;
2) 而後標示已經解決衝突:右鍵》Team》Add to Index(加入到緩存區)
【Team下面有兩個菜單:】
CompareWith -> Git Index:表示和暫存區中的內容(就是將文件add後)做對比。
-> HeadReversion:表示最新版本
ReplacWith -> 用指定的文件替換當前文件(可用來作恢復操做)。
(思考:團隊如何協做、代碼如何管理)
1.
2.
3.
4.
5.
6.
7.
l 中心倉庫:包含master和develop兩個分支;
l 分支的分類:
1) 主要分支有:master和develop分支;
2) 支特性分支:特性分支、發佈分支、熱補丁分支
l 經典協做圖:(見上面開始看的)
l 項目已經默認有一個master分支,可是在開發中通常不在master分支上作開發,而是新建一個develop分支,在develop分支上作開發。
l 項目的maser分支,只有有了提交動做後纔有master分支
【實例:】(在Eclipse中開發)
發佈1.0版本:
如今開發一個項目,咱們發佈第一個版本,即1.0版本,這時候,咱們能夠給咱們的項目打一個「Tag」——注意,若是一個版本是一個Tag,那麼說明這個版本就是一個穩定的成熟的版本,是一個里程碑式的版本。
l 打Tag的方法:項目》右鍵》Team》Advanced》Tag
開發2.0版本:
(1) 開始開發2.0版本:開發的時候不要直接在mastert分支上作開發,而應該新建一個分支(好比新建一個名爲dev的分支),而後在該dev上開發,切換分支:項目》右鍵》Swritch To 》new branch;
(2) 2.0版本正在開發過程當中,忽然1.0發現了一個很嚴重的Bug,須要當即修復。這時候領導找到正在開發2.0版本的員工1負責修復。因此此時,員工1結束當前2.0的開發:將代碼作commit操做,對當前2.0開發的內容進行保存;
(3) 而後切換到1.0版本:項目》右鍵》Team》switch to》選擇Tags/1.0版本,而後要基於這個1.0版本新建一個(好比名爲v1.0_fixup)新的分支(即熱補丁分支,也叫bug分支),在熱補丁分支上作開發,而後作checkout,而後就能夠在這個分支上修改代碼了;
(4) 代碼修復後,Add代碼》提交代碼(提交到本地分支上的),而後作一個1.1的Tag;(最後作push操做<另一個視頻是提交和push一塊兒作的>)
(5) 將修復的bug整合到2.0版本中:將項目切換到dev分支,而後項目》右鍵》Team》Merge》選擇Local/v1.0_fixup(視頻中開始選Tags/1.1,有問題,後來就改從Local選了)
【注意:】
同時使用TortoiseGit和TortoiseSVN會有衝突,文件顯示的圖標會不正常。解決衝突方法是卸載其中一個。
【步驟<基本操做>:】
(1) 首先建立中央倉庫:
在某個目錄下建立文件夾,做爲倉庫名:好比publicShareTortoise.git,而後在該文件夾中:右鍵 》 「Git create Repository Here」
(2) 而後在某個目錄下右鍵使用Clone命令,將項目Clone下來,新建一個文件
新建文件的上面顯示的圖標會顯示一個問號。
(3) 將新建文件先「add」,而後「commit」(這是提交到本地),而後push;
注意:push的時候,在某個文件上右鍵push是不行的,push必須是對整個項目的push,因此在空白處右鍵》push;
(4) 修改文件:修改文件後,再提交的時候,就不用Add這個 操做了,由於TortoiseGit的commit已經包含了add命令。
【解決衝突】
(1) 若是有衝突,push的時候,會提示「git did not exit cleanly(exit code 1)」
這時候,就能夠作pull操做(這時候會自動合併,有的時候會自動合併,有的時候會提示「合併失敗」);
(2) 若是「合併失敗」,那麼在合併失敗的文件上,右鍵》TortoiseGit》Edit Conflicts
這時候進入文件合併界面:黃色能夠忽略,紅色必須解決!
(3) 解決衝突後,目錄下會出現3個臨時文件:衝突前基準文件、遠程服務器上的文件、本地文件,右鍵》TortoiseGit》Resolve Finished,即標記爲「已經解決」,此時就能夠執行commit操做,同時臨時文件自動刪除。
【補丁】
(1) 用戶1修改了本地文件,而後提交到本地倉庫後(不要提交到遠程服務器),而後在空白處右鍵》Create Pach Serialization,就會在當前目錄生成一個補丁;
(2) 用戶1將生成的補丁用郵件發送給用戶2;
(3) 用戶2在項目中右鍵》應用補丁,而後提交,而後再生成補丁發送給主開發者。
(4) 注意:若是用戶2在應用補丁的時候,若是衝突、應用補丁失敗,不要點擊「Abort」關閉那個對話框,而後在衝突的文件上右鍵》Edit Conflicts