Git學習

 

1.   Git的好處

(1)       分佈式,離線操做; java

(2)       每日工做備份(很是安全) git

(3)       異地協同辦公 github

(4)       現場版本控制; 數據庫

(5)       避免引入輔助目錄(好比svn總是有.svn這個隱藏目錄);git只在頂層有一個.git windows

(6)       能夠吃後悔藥; 緩存

(7)       工做進度隨時保存(好比工做正在進行中臨時去修改bug); 安全

(8)       快。 bash

2.   Git簡介

3.   Git工做模型

(1)      集中式協同模型(大多數公司在用的模型); 服務器

雙向箭頭表明「可讀可寫」! 網絡

(2)      社交網絡式式協同模型(Linux經典開發模型);

(3)      GIT基本交互流程圖(記住

這裏的Commit是提交到本地而後再push到中央倉庫中,每次中央倉庫有更新,那麼其餘人就能夠作pull操做了。

4.   Git倉庫初始化

5.   Git的原理

Git操做步驟:

初始化倉庫後的文件下的目錄:

Head永遠都是指向當前的分支;

若是作Commit操做,都會生成一個Commit對象,這個Commit對象包括Tree對象,Tree對象包括blob對象……而且每次提交都會記下Parent(根據這些關係就能夠追溯到這些歷史過程了)。

 

Git操做原理:

每一次提交都是對應一個commit對象,一個commit對象包含一個ID、一個樹對象、parentAuthor,這樣級級關聯。

6.   TortoiseGit和Git

(1)       先安裝Git,其實用這個Git已經能夠完成大部分的操做了,缺點是作任何事都要用命令行來操做;

(2)       爲了解決在命令行下操做Git不方便的問題,能夠安裝tortoiseGit,就能夠再圖形界面來操做Git了。

【注意:】

1)  使用tortoiseGitAdd後,還要在TortoiseGitSettings中設置用戶名和郵箱(向服務器代表身份);

2)  Add後就能夠Commit了(此時Commit只是添加到本地);

3)  push(此時是推送到公共服務器上);

(3)       注意,在使用TortoiseGit建倉庫的時候要在目錄下建以git爲後綴的目錄

要建立一個工做區

對話框中的選框若是不選上的話,是當作一個工做區(在這裏clone而後提交代碼的)。因此要將這個對話框選上,這樣就做爲一個空的工做區,讓別人來向這個空的工做區提交代碼(也就是說,共享倉庫必須創建成一個空的倉庫)。

上面圖中的目錄是在下圖中指定的(名字不是對應的):

(4)      Git中若是user1push操做出現「衝突」,緣由是公共倉庫中文件的內容和本地文件內容相同行的內容不同,此時若是user1pull操做,那麼文件上就會出現「警告(歎號)」提示(此時可使用「Edit Conflics」來進行文件對比);如user1只是在文件上添加一些內容,那麼作pull操做時就會自動合併內容。

——爲避免衝突太多,養成更新代碼的習慣(保持本地代碼是最新的)。

7.   GitEclipse整合

MyEclipse安裝方法Help  –> Configuration ->SoftWare(視頻中在Eclipse中安裝,用的也是這個方法,不是經過拷貝插件安裝的)。

 下載Eclipsegit插件——EGit。下載網址http://download.eclipse.org/egit/updates-1.3/org.eclipse.egit-updatesite-1.3.0.201202151440-r-site.zip(注意我如今官網看到的最新的3.1版本myeclipse10中不能使用),把下載的插件解壓出來,刪掉XML文件。在MyEclipsedropins目錄下新建一個egit文件夾,而後把剛纔解壓的featuresplugins和另外兩個jar包全放進去。重啓MyEclipse後,進入window-preferences-team,看到Git選項,就說明安裝成功了。

8.   CopSSH

9.   Git經典協同模型

實際開發中,開發者不是將代碼直接提交到中央倉庫中的,而是提交到develop分支上去,待到必定的穩定階段,纔將代碼發佈到Master中央倉庫中!

=======開發場景舉例:=======

(1)       master是主分支如今從產品的0.1版本開始,新建一個develop分支1,開始進行開發0.2版本

(2)       到了階段2的時候原來的0.1版本在給用戶使用的過程當中發現了一個bug01,這時候就會從0.1版本上新建一個hotfixes(熱補丁分支),來對應這個bug01

(3)       bug01解決後,在master主分支上新建一個新版本(打一個TagTag0.2,並將修正後的代碼,提交到Tag0.2上;——同時,將修復代碼與develop分支上的代碼進行(如階段3處)合併develop分支上有bug01);

(4)       到了階段41.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用來作高效數據庫查詢),其中AB分支可能失敗可能成功,失敗就丟棄,成功就合併到develop分支上;

10.         使用Git

1.

10.1.     本地模擬Git服務器:

一、             在本地模擬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鉤子程序,用來控制commitupdate等操做,能夠定製一些操做事件;

info有些文件或者目錄不須要作版本控制,能夠再這裏作設置(其中的exclude文件);

objects記錄版本控制的信息;

refs記錄頭、以及分支文件信息;

config系統配置,好比記錄用戶名、郵箱等;

description

HEAD記錄主分支最新的提交;

—綜上所述,代碼提交後的全部的信息都在shared.git目錄下!

PPT內容:

三、             克隆項目

好比用戶1user1),在本身的目錄(/user1)下可使用命令來將項目文件克隆下來。

此時就會在user1下生成一個目錄.git其中也有hooksinfo等目錄,在.git同級目錄下就能夠新建文件而且將文件上傳了(先add、而後commit,還要設置usernameemail),以下操做:

四、             addcommit等操做原理

相關概念:工做區、暫存區、版本庫

圖形表示工做過程:

index文件就是暫存區(.git中沒有發現這個文件)index是索引,而後內容(對象 )會存在objects中。

master表明分支、head指向要提交的那個分支。master中的內容也是記錄在objects文件中。

10.2.     TortoiseGit

上面都是用命令行來操做的,TortoiseGit能夠再圖形界面來操做。

一、  安裝:

TortoiseGit安裝到D:\ProgramFiles\Java_Develop\目錄下(和Git同級目錄)

安裝過程當中:

二、 

11.         GitGitHub

1.1.  Eclipse克隆Github中的項目

右鍵、implortgit

 

12.1.     分享一個項目

項目、右鍵、Teamshare

到此爲止,操做是在項目中建立一個.git文件目錄!

項目、右鍵、TeamCommit

項目、右鍵、teamremotepush

 

這裏必定要點擊「Force Update All Specs」!!!!

12.         GitOS

github大體差很少,命令行是通用的。

也要公鑰,公鑰是通用的。

=========Again=========

版本控制:Reversion Control

1.   版本控制工具都有哪些

(1)       CVS:開啓版本控制之門;

(2)       SVN:集中式版本控制之王;

(3)       GIT:分佈式版本控制的偉大做品;

2.   GIT簡介

1.

2.1.  簡介:

GitLinux的第二個偉大做品。

2005年有餘BitKeeper軟件公司對Linux社區中止了無償使用權,Linus無可奈何本身開發了一個分佈式版本控制工具,從而Git誕生了。

目前使用Git做爲版本控制的開源軟件:

LinuxKernel

Android

jQueyr

RubyOnRails

Debian

Eclipse上使用Git的數量已經超過了SVN

l Git的最大優勢是「分佈式」!

傳統的SVN必需要連接服務器才能作提交代碼等代碼管理,好比在公司內部作開發,要鏈接公司內部的服務器,若是僅僅是內部開發,那麼用SVN仍是挺合適的。

         可是,使用Git就能夠在任何地方作代碼管理,這就是「分佈式」。使用Git時,咱們每一個開發者都在本地有一個倉庫,遠程上的服務器的「倉庫」和本地的「倉庫」是同樣的。在沒有聯網的狀況下,咱們仍然能夠「提交代碼」——即提交到本地倉庫中,在能夠聯網的時候,再往服務器上push便可。

         從上能夠看到,使用Git後咱們就能夠獲取到完整的源代碼——因此使用Git適合於開源軟件開發,若是軟件的安全級別很高,那麼就不適合使用Git了。(相比SVNSVN就能夠作權限控制)。

2.2.  使用Git的好處

(1)      分佈式;

(2)      每日工做備份;

(3)      異地協同工做;

(4)      現場版本控制:

——好比客戶發現了bug,工程師現場解決bug後,爲了防止後續版本有此bug,能夠從根目錄生成代碼,而後將當前bug打成補丁,帶回公司便可(這裏沒看懂……)。

(5)      避免引入輔助目錄(好比SVN中有不少的.svn目錄)

——Git只在頂層目錄有.Git目錄

(6)      能夠作「撤銷」操做;(sbash

(7)      工做進度隨時保存:

——能夠隨時中止當前的工做並保存,而後能夠隨時從上次保存的進度再隨時開始(sbash)。

(8)      速度快(GitSVN速度快得多)

2.3.  Git的工做模型

Git的工做模型有兩種:

1)集中式協同模型(相似SVN);

2)社交網絡式協同模型。

1.  

2.3.1.   集中式協同模型:

SVN就是集中式協同模型)

(雙向箭頭表示可讀可寫)

2.3.2.   社交網絡式協同模型

從圖裏能夠看到,這裏的箭頭都是單向的,表示只讀,寫的話會有限制。

此圖也是Linux的經典開發模型,只有核心開發人員才能提交代碼,提交到核心倉庫。

【注意:】

公司裏,爲了方便和簡潔,通常都使用協同式開發模型,而不須要社交網絡式協同模型(須要一級一級的審覈)。

2.4.  Git的基本交互流程圖

【圖示說明:】

開發人員使用Git的步驟:

(1)       Clone:先從共享庫中將代碼複製(Clone)到本地;至關於svncheckout

(2)       本地修改代碼後作提交(Commit),這裏的提交是提交到本地倉庫push操做是提交到遠程服務器上)也就是書說,Git中要是提交代碼要通過兩步:1commit提交到本地;2push提交到服務器。

(3)       提交到本地後,就能夠作push操做(將本地代碼提交到共享庫中)。

(4)       當有人向共享庫中push代碼,那麼其餘人就可使用pull(至關於SVNupdate命令將代碼拉到本地。

2.5.  開源項目工做流程圖

3.   GITwindows上的安裝與使用

(安裝步驟參考文檔)

1. 

2. 

3. 

3.1.  倉庫的初始化(模擬中央倉庫)

【步驟:】

(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:指向當前分支的一個提交

3.2.  一些命令

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"

4.   客戶端TortoiseGit的安裝與使用

5.   GITEclipse整合

EGit:略

配置用戶:PreferenceGitConfigurationnew Entry》經過配置key/Value設置用戶名和密碼。

uriclone項目後,在項目上右鍵》import成在javaEE視圖能看到的項目。

Eclipse中編輯時候:

(1)       一個文件修改後會有一個>符號顯示;

(2)       Add會顯示灰色星號;

(3)      有的文件提交時有衝突:

1)  pull顯示衝突符號,而後右鍵MergeTool 選擇Use Head……那個選項;

2)  而後標示已經解決衝突:右鍵》TeamAdd to Index(加入到緩存區)

Team下面有兩個菜單:】

CompareWith ->  Git Index:表示和暫存區中的內容(就是將文件add後)做對比。

                            ->  HeadReversion:表示最新版本

ReplacWith  -> 用指定的文件替換當前文件(可用來作恢復操做)。

6.   經過CopSSH搭建GIT服務器

7.   GIT經典協同模型/分支分類

(思考:團隊如何協做、代碼如何管理)

1. 

2. 

3. 

4. 

5. 

6. 

7. 

7.1.  Git經典協做模型

l  中心倉庫:包含masterdevelop兩個分支;

l  分支的分類:

1)  主要分支有:masterdevelop分支;

2)  支特性分支:特性分支、發佈分支、熱補丁分支

l  經典協做圖:(見上面開始看的)

l  項目已經默認有一個master分支,可是在開發中通常不在master分支上作開發,而是新建一個develop分支,在develop分支上作開發。

l  項目的maser分支,只有有了提交動做後纔有master分支

【實例:】(在Eclipse中開發)

發佈1.0版本:

如今開發一個項目,咱們發佈第一個版本,即1.0版本,這時候,咱們能夠給咱們的項目打一個「Tag」——注意,若是一個版本是一個Tag,那麼說明這個版本就是一個穩定的成熟的版本,是一個里程碑式的版本。

l  Tag的方法:項目》右鍵》TeamAdvancedTag

開發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版本項目》右鍵》Teamswitch to》選擇Tags/1.0版本,而後要基於這個1.0版本新建一個(好比名爲v1.0_fixup)新的分支(即熱補丁分支,也叫bug分支),在熱補丁分支上作開發,而後作checkout,而後就能夠在這個分支上修改代碼了;

(4)       代碼修復後,Add代碼》提交代碼(提交到本地分支上的),而後作一個1.1Tag;(最後作push操做<另一個視頻是提交和push一塊兒作的>

(5)       將修復的bug整合到2.0版本中:將項目切換到dev分支,而後項目》右鍵》TeamMerge》選擇Local/v1.0_fixup(視頻中開始選Tags/1.1,有問題,後來就改從Local選了)

8.   Android源代碼管理方式

9.   Git遷移

===教程二===

1.   使用tortoiseGit

【注意:】

同時使用TortoiseGitTortoiseSVN會有衝突,文件顯示的圖標會不正常。解決衝突方法是卸載其中一個。

【步驟<基本操做>:】

(1)       首先建立中央倉庫:

在某個目錄下建立文件夾,做爲倉庫名:好比publicShareTortoise.git而後在該文件夾中:右鍵 Git create Repository Here

(2)       而後在某個目錄下右鍵使用Clone命令,將項目Clone下來,新建一個文件

新建文件的上面顯示的圖標會顯示一個問號。

(3)       將新建文件先「add」,而後「commit」(這是提交到本地),而後push

注意:push的時候,在某個文件上右鍵push是不行的,push必須是對整個項目的push,因此在空白處右鍵》push

(4)       修改文件:修改文件後,再提交的時候,就不用Add這個 操做了,由於TortoiseGitcommit已經包含了add命令

【解決衝突】

(1)       若是有衝突push的時候,會提示「git did not exit cleanlyexit code 1

這時候,就能夠作pull操做(這時候會自動合併,有的時候會自動合併,有的時候會提示「合併失敗」);

(2)       若是「合併失敗」,那麼在合併失敗的文件上,右鍵》TortoiseGitEdit Conflicts

這時候進入文件合併界面:黃色能夠忽略,紅色必須解決

(3)       解決衝突後,目錄下會出現3個臨時文件:衝突前基準文件、遠程服務器上的文件、本地文件,右鍵》TortoiseGitResolve Finished,即標記爲「已經解決」,此時就能夠執行commit操做,同時臨時文件自動刪除。

【補丁】

(1)       用戶1修改了本地文件,而後提交到本地倉庫後(不要提交到遠程服務器),而後在空白處右鍵》Create Pach Serialization,就會在當前目錄生成一個補丁;

(2)       用戶1將生成的補丁用郵件發送給用戶2

(3)       用戶2在項目中右鍵》應用補丁,而後提交,而後再生成補丁發送給主開發者。

(4)       注意:若是用戶2在應用補丁的時候,若是衝突、應用補丁失敗,不要點擊「Abort」關閉那個對話框,而後在衝突的文件上右鍵》Edit Conflicts

相關文章
相關標籤/搜索