1. 程式人生 > >Git和SVN的詳細解釋

Git和SVN的詳細解釋

  1. Git歷史

同生活中的許多偉大事件一樣,Git 誕生於一個極富紛爭大舉創新的年代。Linux 核心開源專案有著為數眾廣的參與者。絕大多數的 Linux 核心維護工作都花在了提交補丁和儲存歸檔的繁瑣事務上(1991-2002年間)。到 2002 年,整個專案組開始啟用分散式版本控制系統 BitKeeper 來管理和維護程式碼。

到 2005 年的時候,開發 BitKeeper 的商業公司同 Linux 核心開源社群的合作關係結束,他們收回了免費使用 BitKeeper 的權力。這就迫使 Linux 開源社群(特別是 Linux的締造者 Linus Torvalds )不得不吸取教訓,只有開發一套屬於自己的版本控制系統才不至於重蹈覆轍。他們對新的系統訂了若干目標:

• 速度

• 簡單的設計

• 對非線性開發模式的強力支援(允許上千個並行開發的分支)

• 完全分散式

• 有能力高效管理類似 Linux 核心一樣的超大規模專案(速度和資料量)

 

  1. Git與svn對比
    1. Svn

SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的,而幹活的時候,用的都是自己的電腦,所以首先要從中央伺服器哪裡得到最新的版本,然後幹活,幹完後,需要把自己做完的活推送到中央伺服器。集中式版本控制系統是必須聯網才能工作,如果在區域網還可以,頻寬夠大,速度夠快,如果在網際網路下,如果網速慢的話,就鬱悶了。

下圖就是標準的集中式版本控制工具管理方式:

 

集中管理方式在一定程度上看到其他開發人員在幹什麼,而管理員也可以很輕鬆掌握每個人的開發許可權。

但是相較於其優點而言,集中式版本控制工具缺點很明顯:

  1. 伺服器單點故障
  2. 容錯性差
    1. Git

Git是分散式版本控制系統,那麼它就沒有中央伺服器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了檔案A,其他人也在電腦上改了檔案A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。

下圖就是分散式版本控制工具管理方式:

 

 

  1. git工作流程

一般工作流程如下:

  1. 從遠端倉庫中克隆 Git 資源作為本地倉庫。
  2. 從本地倉庫中checkout程式碼然後進行程式碼修改
  3. 在提交前先將程式碼提交到暫存區。
  4. 提交修改。提交到本地倉庫。本地倉庫中儲存修改的各個歷史版本。
  5. 在修改完成後,需要和團隊成員共享程式碼時,可以將程式碼push到遠端倉庫。

下圖展示了 Git 的工作流程:

 

  1. Git的安裝

最早Git是在Linux上開發的,很長一段時間內,Git也只能在Linux和Unix系統上跑。不過,慢慢地有人把它移植到了Windows上。現在,Git可以在Linux、Unix、Mac和Windows這幾大平臺上正常運行了。由於開發機大多數情況都是windows,所以本教程只講解windows下的git的安裝及使用。

    1. 軟體下載

下載地址:https://git-scm.com/download

 

 

參考資料中安裝包已經下載完畢,根據不同的作業系統選擇對應的安裝包。

    1. 軟體安裝
      1. 安裝git for windows

 

 

一路“下一步”使用預設選項即可。

      1. 安裝TortoiseGit

 

 

一路“下一步”使用預設選項即可。

預設選項下會啟動配置畫面:

 

由於目前只有英文語言包,預設即可繼續下一步。

配置git.exe,在4.2.1中已經安裝過git-for-windows了所以在此找到git.exe所在的目錄。

 

配置開發者姓名及郵箱,每次提交程式碼時都會把此資訊包含到提交的資訊中。

 

 

使用預設配置,點選“完成”按鈕完成配置。

完整完畢後在系統右鍵選單中會出現git的選單項。

 

      1. 安裝中文語言包

安裝中文語言包並不是必選項。可以根據個人情況來選擇安裝。

 

 

直接“下一步”完整完畢。

語言包安裝完畢後可以在TortoiseGit的設定中調整語言

 

 

  1. 使用git管理檔案版本
    1. 建立版本庫

什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。由於git是分散式版本管理工具,所以git在不需要聯網的情況下也具有完整的版本管理能力。

建立一個版本庫非常簡單,可以使用git bash也可以使用tortoiseGit。首先,選擇一個合適的地方,建立一個空目錄(D:\temp\git\repository)。

      1. 使用GitBash

在當前目錄中點選右鍵中選擇Git Bash來啟動。

 

或者在開始選單中啟動。注意如果是從開始選單啟動的gitbash需要切換目錄到倉庫所在的目錄。

 

 

建立倉庫執行命令:

$ git init

 

 

      1. 使用TortoiseGit

 

使用TortoiseGit時只需要在目錄中點選右鍵選單選擇“在這裡建立版本庫”

 

 

 

版本庫建立成功,會在此目錄下建立一個.git的隱藏目錄,如下所示:

 

在windows中如何顯示隱藏目錄隱藏目錄請自行百度o(╯□╰)o

 

概念:

版本庫:“.git”目錄就是版本庫,將來檔案都需要儲存到版本庫中。

工作目錄:包含“.git”目錄的目錄,也就是.git目錄的上一級目錄就是工作目錄。只有工作目錄中的檔案才能儲存到版本庫中。

 

    1. 新增檔案
      1. 新增檔案過程

在D:\temp\git\repository目錄下建立一個mytest.txt檔案

 

 

 

文字檔案變為帶“+”號的圖示:

 

提交檔案:在mytest.txt上再次點選右鍵選擇“提交”,此時將檔案儲存至版本庫中。

 

 

 

      1. 工作區和暫存區

Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。

什麼是工作區(Working Directory)?

工作區就是你在電腦裡能看到的目錄,比如我的reporstory資料夾就是一個工作區。

有的同學可能會說repository不是版本庫嗎怎麼是工作區了?其實repository目錄是工作區,在這個目錄中的“.git”隱藏資料夾才是版本庫。這回概念清晰了吧。

Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。

如下圖所示:

 

分支和HEAD的概念我們稍後再講。前面講了我們把檔案往Git版本庫裡新增的時候,是分兩步執行的:

第一步是用git add把檔案新增進去,實際上就是把檔案修改新增到暫存區;

第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。

 

因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。

你可以簡單理解為,需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。

 

    1. 修改檔案
      1. 提交修改

被版本庫管理的檔案不可避免的要發生修改,此時只需要直接對檔案修改即可。修改完畢後需要將檔案的修改提交到版本庫。

在mytest.txt檔案上點選右鍵,然後選擇“提交”

 

 

      1. 檢視修改歷史

在開發過程中可能會經常檢視程式碼的修改歷史,或者叫做修改日誌。來檢視某個版本是誰修改的,什麼時間修改的,修改了哪些內容。

可以在檔案上點選右鍵選擇“顯示日誌”來檢視檔案的修改歷史。

 

 

      1. 差異比較

當檔案內容修改後,需要和修改之前對比一下修改了哪些內容此時可以使用“比較差異功能”

 

 

      1. 還原修改

當檔案修改後不想把修改的內容提交,還想還原到未修改之前的狀態。此時可以使用“還原”功能

 

 

 

注意:此操作會撤銷所有未提交的修改,所以當做還原操作是需要慎重慎重!!!

    1. 刪除檔案

需要刪除無用的檔案時可以使用git提供的刪除功能直接將檔案從版本庫中刪除。

 

    1. 案例:將java工程提交到版本庫

第一步:將參考資料中的java工程project-test複製到工作目錄中

 

 

第二步:將工程新增到暫存區。

 

 

 

點選確定完成暫存區新增。

三、忽略檔案或資料夾

在此工程中,並不是所有檔案都需要儲存到版本庫中的例如“bin”目錄及目錄下的檔案就可以忽略。好在Git考慮到了大家的感受,這個問題解決起來也很簡單,在Git工作區的根目錄下建立一個特殊的.gitignore檔案,然後把要忽略的檔名填進去,Git就會自動忽略這些檔案。

如果使用TortoiseGit的話可以使用選單項直接進行忽略。

 

 

 

選擇保留本地檔案。完成後在此資料夾內會多出一個.gitignore檔案,這個檔案就是檔案忽略檔案,當然也可以手工編輯。其中的內容就是把bin目錄忽略掉。

 

  • 提交程式碼

將程式碼新增到master分支上,其中.gitignore檔案也需要新增到暫存區,然後提交到版本庫。

 

    1. 忽略檔案語法規範

空行或是以 # 開頭的行即註釋行將被忽略。

可以在前面新增正斜槓 / 來避免遞迴,下面的例子中可以很明白的看出來與下一條的區別。

可以在後面新增正斜槓 / 來忽略資料夾,例如 build/ 即忽略build資料夾。

可以使用 ! 來否定忽略,即比如在前面用了 *.apk ,然後使用 !a.apk ,則這個a.apk不會被忽略。

* 用來匹配零個或多個字元,如 *.[oa] 忽略所有以".o"或".a"結尾, *~ 忽略所有以 ~ 結尾的檔案(這種檔案通常被許多編輯器標記為臨時檔案); [] 用來匹配括號內的任一字元,如 [abc] ,也可以在括號內加連線符,如 [0-9] 匹配0至9的數; ? 用來匹配單個字元。

看了這麼多,還是應該來個栗子:

# 忽略 .a 檔案

*.a

# 但否定忽略 lib.a, 儘管已經在前面忽略了 .a 檔案

!lib.a

# 僅在當前目錄下忽略 TODO 檔案, 但不包括子目錄下的 subdir/TODO

/TODO

# 忽略 build/ 資料夾下的所有檔案

build/

# 忽略 doc/notes.txt, 不包括 doc/server/arch.txt

doc/*.txt

# 忽略所有的 .pdf 檔案 在 doc/ directory 下的

doc/**/*.pdf

  1. 遠端倉庫
    1. 新增遠端庫

現在我們已經在本地建立了一個Git倉庫,又想讓其他人來協作開發,此時就可以把本地倉庫同步到遠端倉庫,同時還增加了本地倉庫的一個備份。

常用的遠端倉庫就是github:https://github.com/,接下來我們演示如何將原生代碼同步到github。

 

      1. 在github上建立倉庫

首先你得在github上建立一個賬號,這個就不演示了。然後在github上建立一個倉庫:

 

 

點選“create repository”按鈕倉庫就建立成功了。

Github支援兩種同步方式“https”和“ssh”。如果使用https很簡單基本不需要配置就可以使用,但是每次提交程式碼和下載程式碼時都需要輸入使用者名稱和密碼。而且如果是公司配置的私有git伺服器一般不提供hppts方式訪問,所以我們著重將“ssh”方式。

 

      1. ssh協議
        1. 什麼是ssh?

SSH是英文Secure Shell的簡寫形式。通過使用SSH,你可以把所有傳輸的資料進行加密,這樣"中間人"這種攻擊方式就不可能實現了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸的資料是經過壓縮的,所以可以加快傳輸的速度。SSH有很多功能,它既可以代替Telnet,又可以為FTP、Pop、甚至為PPP提供一個安全的"通道"。

 

如果一個使用者從本地計算機,使用SSH協議登入另一臺遠端計算機,我們就可以認為,這種登入是安全的,即使被中途截獲,密碼也不會洩露。

最早的時候,網際網路通訊都是明文通訊,一旦被截獲,內容就暴露無疑。1995年,芬蘭學者Tatu Ylonen設計了SSH協議,將登入資訊全部加密,成為網際網路安全的一個基本解決方案,迅速在全世界獲得推廣,目前已經成為Linux系統的標準配置。

        1. ssh金鑰生成

在windows下我們可以使用 Git Bash.exe來生成金鑰,可以通過開始選單或者右鍵選單開啟Git Bash

 

  

 

 

git bash 執行命令,生命公鑰和私鑰

命令: ssh-keygen -t rsa

 

執行命令完成後,在window本地使用者.ssh目錄C:\Users\使用者名稱\.ssh下面生成如下名稱的公鑰和私鑰:

 

 

        1. ssh金鑰配置

金鑰生成後需要在github上配置金鑰本地才可以順利訪問。

 

 

在key部分將id_rsa.pub檔案內容新增進去,然後點選“Add SSH key”按鈕完成配置。

      1. 同步到遠端倉庫

同步到遠端倉庫可以使用git bash也可以使用tortoiseGit

 

        1. 使用git bash

在倉庫所在的目錄(D:\temp\git\repository)點選右鍵選擇“Git Bash Here”,啟動git bash程式。

 

然後在git bash中執行如下語句:

git remote add origin [email protected]:sublun/mytest.git

git push -u origin master

注意:其中紅色字型部分需要替換成個人的使用者名稱。

 

如何出現如下錯誤:

 

可以先執行如下命令,然後再執行上面的命令

$ git remote rm origin

 

 

        1. 使用TortoiseGit同步

一、由於TortoiseGit使用的ssh工具是“PuTTY”git Bash使用的ssh工具是“openSSH”,如果想讓TortoiseGit也使用剛才生成的金鑰可以做如下配置:

 

 

Url:遠端倉庫的地址

推送URL:也是相同的

Putty金鑰:選擇剛才生成的金鑰中的私鑰

 

  • 同步。在本地倉庫的資料夾中單擊右鍵,選擇“Git同步”

 

 

    1. 從遠端倉庫克隆

克隆遠端倉庫也就是從遠端把倉庫複製一份到本地,克隆後會建立一個新的本地倉庫。選擇一個任意部署倉庫的目錄,然後克隆遠端倉庫。

      1. 使用git bash:

$ git clone [email protected]:sublun/mytest.git

      1. 使用TortoiseGit:

在任意目錄點選右鍵:

 

 

    1. 從遠端倉庫取程式碼

Git中從遠端的分支獲取最新的版本到本地有這樣2個命令:

  1. git fetch:相當於是從遠端獲取最新版本到本地,不會自動merge(合併程式碼)
  2. git pull:相當於是從遠端獲取最新版本並merge到本地

上述命令其實相當於git fetch 和 git merge

在實際使用中,git fetch更安全一些

因為在merge前,我們可以檢視更新情況,然後再決定是否合併

如果使用TortoiseGit的話可以從右鍵選單中點選“拉取”(pull)或者“獲取”(fetch)

 

    1. 搭建私有Git伺服器
      1. 伺服器搭建

遠端倉庫實際上和本地倉庫沒啥不同,純粹為了7x24小時開機並交換大家的修改。GitHub就是一個免費託管開原始碼的遠端倉庫。但是對於某些視原始碼如生命的商業公司來說,既不想公開原始碼,又捨不得給GitHub交保護費,那就只能自己搭建一臺Git伺服器作為私有倉庫使用。

搭建Git伺服器需要準備一臺執行Linux的機器,在此我們使用CentOS。以下為安裝步驟:

1、安裝git服務環境準備

yum -y install curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel gcc cc

2、下載git-2.5.0.tar.gz

1)解壓縮

2)cd git-2.5.0

3)autoconf

4)./configure

5)make

6)make install

3、新增使用者

adduser -r -s /bin/sh -c 'git version control' -d /home/git git

4、設定/home/git資料夾操作許可權

mkdir /home/git

chown git:git /home/git

5、設定密碼

passwd git

輸入兩次密碼

6、切換到git使用者

su git

7、建立git倉庫

git --bare init /home/git/first

注意:如果不使用“--bare”引數,初始化倉庫後,提交master分支時報錯。這是由於git預設拒絕了push操作,需要.git/config新增如下程式碼:

[receive]

      denyCurrentBranch = ignore

推薦使用:git --bare init初始化倉庫。

 

      1. 連線伺服器

私有git伺服器搭建完成後就可以向連線github一樣連線使用了,但是我們的git伺服器並沒有配置金鑰登入,所以每次連線時需要輸入密碼。

使用命令連線:

$ git remote add origin ssh://[email protected]/home/git/first

這種形式和剛才使用的形式好像不一樣,前面有ssh://字首,好吧你也可以這樣寫:

$ git remote add origin [email protected]:first

 

使用TortoiseGit同步的話參考上面的使用方法。

  1. 分支管理
    1. 建立合併分支

在我們每次的提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git裡,這個分支叫主分支,即master分支。HEAD指標嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。

一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點:

 

每次提交,master分支都會向前移動一步,這樣,隨著你不斷提交,master分支的線也越來越長。

當我們建立新的分支,例如dev時,Git新建了一個指標叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:

 

你看,Git建立一個分支很快,因為除了增加一個dev指標,改改HEAD的指向,工作區的檔案都沒有任何變化!

 

不過,從現在開始,對工作區的修改和提交就是針對dev分支了,比如新提交一次後,dev指標往前移動一步,而master指標不變:

 

假如我們在dev上的工作完成了,就可以把dev合併到master上。Git怎麼合併呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合併:

 

所以Git合併分支也很快!就改改指標,工作區內容也不變!

 

合併完分支後,甚至可以刪除dev分支。刪除dev分支就是把dev指標給刪掉,刪掉後,我們就剩下了一條master分支:

 

    1. 使用TortoiseGit實現分支管理

使用TortoiseGit管理分支就很簡單了。

      1. 建立分支

在本地倉庫資料夾中點選右鍵,然後從選單中選擇“建立分支”:

 

如果想建立完畢後直接切換到新分支可以勾選“切換到新分支”選項或者從選單中選擇“切換/檢出”來切換分支:

 

      1. 合併分支

分支切換到dev後就可以對工作區的檔案進行修改,然後提交到dev分支原理的master分支不受影響。例如我們修改mytest.txt中的內容,然後提交到dev分支。

 

 

切換到master分支後還是原理的內容:

 

將dev分支的內容合併到master分支,當前分支為master。從右鍵選單中選擇“合併”:

再檢視mytest.txt的內容就已經更新了:

 

 

    1. 解決衝突

兩個分支中編輯的內容都是相互獨立互不干擾的,那麼如果在兩個分支中都對同一個檔案進行編輯,然後再合併,就有可能會出現衝突。

例如在master分支中對mytest.txt進行編輯:

 

然後提交到版本庫。

 

切換到dev分支,對mytest.txt進行編輯:

 

 

 

最後進行分支合併,例如將dev分支合併到master分支。需要先切換到master分支然後進行分支合併。

 

出現版本衝突。

 

衝突需要手動解決。

 

在衝突檔案上單機右鍵選擇“解決衝突”選單項:

 

 

把衝突解決完畢的檔案提交到版本庫就可以了。

 

  1. Eclipse客戶端egit
    1. 安裝egit外掛

EclipseMars版本自帶此外掛

如果使用eclipse的egit外掛是不需要安裝git。

    1. Egit使用
      1. 使用者資訊

 

配置使用者資訊,此資訊為提交程式碼時,提交者的身份認證資訊。

      1. 將工程新增到本地倉庫

 

 

 

 

 

當工程新增到本地倉庫後,工程的位置已經及移動到本地倉庫。

 

      1. 新增暫存區
        1. 忽略檔案

在新增暫存區之前,專案中有些檔案不需要上傳到倉庫中,可以使用git排除配置檔案.gitignore來忽略上傳檔案。

 

 

 

        1. 新增到暫存區

 

 

把本地檔案新增本地版本庫暫存區域。

 

 

      1. 提交(本地倉庫)

必須先新增到暫存區域後才能提交程式碼

 

 

注意:提交時必須編寫提交資訊,不能新增空格。

 

      1. 共享版本庫(push到遠端倉庫)

本地使用者提交先提交到本地版本庫,如果需要提交到共享版本庫,那麼就需要push到遠端共享版本庫。

選擇push把當前專案程式碼push到共享版本庫中。

 

填寫遠端倉庫地址:

 

 

 

點選finish提交成功。

 

      1. 克隆(從遠端倉庫下載程式碼)

 

選擇git檢視,建立共享版本庫:

 

指定共享版本庫位置,連線共享版本庫。更新程式碼到本地倉庫

 

建立新的本地倉庫:

 

本地倉庫建立完畢:

此操作是把遠端倉庫克隆到本地倉庫。

 

接下來需要把本地倉庫專案匯入到本地eclipse中進行開發:

 

直接匯入專案:

 

      1. 更新

 

直接從共享版本庫更新版本內容。

      1. 解決衝突

 

使用合併工具merge tool解決衝突:

 

 

 

 

 

 

 

 

 

 

 

 

  1. Git歷史

同生活中的許多偉大事件一樣,Git 誕生於一個極富紛爭大舉創新的年代。Linux 核心開源專案有著為數眾廣的參與者。絕大多數的 Linux 核心維護工作都花在了提交補丁和儲存歸檔的繁瑣事務上(1991-2002年間)。到 2002 年,整個專案組開始啟用分散式版本控制系統 BitKeeper 來管理和維護程式碼。

到 2005 年的時候,開發 BitKeeper 的商業公司同 Linux 核心開源社群的合作關係結束,他們收回了免費使用 BitKeeper 的權力。這就迫使 Linux 開源社群(特別是 Linux的締造者 Linus Torvalds )不得不吸取教訓,只有開發一套屬於自己的版本控制系統才不至於重蹈覆轍。他們對新的系統訂了若干目標:

• 速度

• 簡單的設計

• 對非線性開發模式的強力支援(允許上千個並行開發的分支)

• 完全分散式

• 有能力高效管理類似 Linux 核心一樣的超大規模專案(速度和資料量)

 

  1. Git與svn對比
    1. Svn

SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的,而幹活的時候,用的都是自己的電腦,所以首先要從中央伺服器哪裡得到最新的版本,然後幹活,幹完後,需要把自己做完的活推送到中央伺服器。集中式版本控制系統是必須聯網才能工作,如果在區域網還可以,頻寬夠大,速度夠快,如果在網際網路下,如果網速慢的話,就鬱悶了。

下圖就是標準的集中式版本控制工具管理方式:

 

集中管理方式在一定程度上看到其他開發人員在幹什麼,而管理員也可以很輕鬆掌握每個人的開發許可權。

但是相較於其優點而言,集中式版本控制工具缺點很明顯:

  1. 伺服器單點故障
  2. 容錯性差
    1. Git

Git是分散式版本控制系統,那麼它就沒有中央伺服器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了檔案A,其他人也在電腦上改了檔案A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。

下圖就是分散式版本控制工具管理方式:

 

 

  1. git工作流程

一般工作流程如下:

  1. 從遠端倉庫中克隆 Git 資源作為本地倉庫。
  2. 從本地倉庫中checkout程式碼然後進行程式碼修改
  3. 在提交前先將程式碼提交到暫存區。
  4. 提交修改。提交到本地倉庫。本地倉庫中儲存修改的各個歷史版本。
  5. 在修改完成後,需要和團隊成員共享程式碼時,可以將程式碼push到遠端倉庫。

下圖展示了 Git 的工作流程:

 

  1. Git的安裝

最早Git是在Linux上開發的,很長一段時間內,Git也只能在Linux和Unix系統上跑。不過,慢慢地有人把它移植到了Windows上。現在,Git可以在Linux、Unix、Mac和Windows這幾大平臺上正常運行了。由於開發機大多數情況都是windows,所以本教程只講解windows下的git的安裝及使用。

    1. 軟體下載

下載地址:https://git-scm.com/download

 

 

參考資料中安裝包已經下載完畢,根據不同的作業系統選擇對應的安裝包。

    1. 軟體安裝
      1. 安裝git for windows

 

 

一路“下一步”使用預設選項即可。

      1. 安裝TortoiseGit

 

 

一路“下一步”使用預設選項即可。

預設選項下會啟動配置畫面:

 

由於目前只有英文語言包,預設即可繼續下一步。

配置git.exe,在4.2.1中已經安裝過git-for-windows了所以在此找到git.exe所在的目錄。

 

配置開發者姓名及郵箱,每次提交程式碼時都會把此資訊包含到提交的資訊中。

 

 

使用預設配置,點選“完成”按鈕完成配置。

完整完畢後在系統右鍵選單中會出現git的選單項。

 

      1. 安裝中文語言包

安裝中文語言包並不是必選項。可以根據個人情況來選擇安裝。

 

 

直接“下一步”完整完畢。

語言包安裝完畢後可以在TortoiseGit的設定中調整語言

 

 

  1. 使用git管理檔案版本
    1. 建立版本庫

什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。由於git是分散式版本管理工具,所以git在不需要聯網的情況下也具有完整的版本管理能力。

建立一個版本庫非常簡單,可以使用git bash也可以使用tortoiseGit。首先,選擇一個合適的地方,建立一個空目錄(D:\temp\git\repository)。

      1. 使用GitBash

在當前目錄中點選右鍵中選擇Git Bash來啟動。

 

或者在開始選單中啟動。注意如果是從開始選單啟動的gitbash需要切換目錄到倉庫所在的目錄。

 

 

建立倉庫執行命令:

$ git init

 

 

      1. 使用TortoiseGit

 

使用TortoiseGit時只需要在目錄中點選右鍵選單選擇“在這裡建立版本庫”

 

 

 

版本庫建立成功,會在此目錄下建立一個.git的隱藏目錄,如下所示:

 

在windows中如何顯示隱藏目錄隱藏目錄請自行百度o(╯□╰)o

 

概念:

版本庫:“.git”目錄就是版本庫,將來檔案都需要儲存到版本庫中。

工作目錄:包含“.git”目錄的目錄,也就是.git目錄的上一級目錄就是工作目錄。只有工作目錄中的檔案才能儲存到版本庫中。

 

    1. 新增檔案
      1. 新增檔案過程

在D:\temp\git\repository目錄下建立一個mytest.txt檔案

 

 

 

文字檔案變為帶“+”號的圖示:

 

提交檔案:在mytest.txt上再次點選右鍵選擇“提交”,此時將檔案儲存至版本庫中。

 

 

 

      1. 工作區和暫存區

Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。

什麼是工作區(Working Directory)?

工作區就是你在電腦裡能看到的目錄,比如我的reporstory資料夾就是一個工作區。

有的同學可能會說repository不是版本庫嗎怎麼是工作區了?其實repository目錄是工作區,在這個目錄中的“.git”隱藏資料夾才是版本庫。這回概念清晰了吧。

Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。

如下圖所示:

 

分支和HEAD的概念我們稍後再講。前面講了我們把檔案往Git版本庫裡新增的時候,是分兩步執行的:

第一步是用git add把檔案新增進去,實際上就是把檔案修改新增到暫存區;

第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。

 

因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。

你可以簡單理解為,需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。

 

    1. 修改檔案
      1. 提交修改

被版本庫管理的檔案不可避免的要發生修改,此時只需要直接對檔案修改即可。修改完畢後需要將檔案的修改提交到版本庫。

在mytest.txt檔案上點選右鍵,然後選擇“提交”

 

 

      1. 檢視修改歷史

在開發過程中可能會經常檢視程式碼的修改歷史,或者叫做修改日誌。來檢視某個版本是誰修改的,什麼時間修改的,修改了哪些內容。

可以在檔案上點選右鍵選擇“顯示日誌”來檢視檔案的修改歷史。

 

 

      1. 差異比較

當檔案內容修改後,需要和修改之前對比一下修改了哪些內容此時可以使用“比較差異功能”

 

 

      1. 還原修改

當檔案修改後不想把修改的內容提交,還想還原到未修改之前的狀態。此時可以使用“還原”功能

 

 

 

注意:此操作會撤銷所有未提交的修改,所以當做還原操作是需要慎重慎重!!!

    1. 刪除檔案

需要刪除無用的檔案時可以使用git提供的刪除功能直接將檔案從版本庫中刪除。

 

    1. 案例:將java工程提交到版本庫

第一步:將參考資料中的java工程project-test複製到工作目錄中

 

 

第二步:將工程新增到暫存區。

 

 

 

點選確定完成暫存區新增。

三、忽略檔案或資料夾

在此工程中,並不是所有檔案都需要儲存到版本庫中的例如“bin”目錄及目錄下的檔案就可以忽略。好在Git考慮到了大家的感受,這個問題解決起來也很簡單,在Git工作區的根目錄下建立一個特殊的.gitignore檔案,然後把要忽略的檔名填進去,Git就會自動忽略這些檔案。

如果使用TortoiseGit的話可以使用選單項直接進行忽略。

 

 

 

選擇保留本地檔案。完成後在此資料夾內會多出一個.gitignore檔案,這個檔案就是檔案忽略檔案,當然也可以手工編輯。其中的內容就是把bin目錄忽略掉。

 

  • 提交程式碼

將程式碼新增到master分支上,其中.gitignore檔案也需要新增到暫存區,然後提交到版本庫。

 

    1. 忽略檔案語法規範

空行或是以 # 開頭的行即註釋行將被忽略。

可以在前面新增正斜槓 / 來避免遞迴,下面的例子中可以很明白的看出來與下一條的區別。

可以在後面新增正斜槓 / 來忽略資料夾,例如 build/ 即忽略build資料夾。

可以使用 ! 來否定忽略,即比如在前面用了 *.apk ,然後使用 !a.apk ,則這個a.apk不會被忽略。

* 用來匹配零個或多個字元,如 *.[oa] 忽略所有以".o"或".a"結尾, *~ 忽略所有以 ~ 結尾的檔案(這種檔案通常被許多編輯器標記為臨時檔案); [] 用來匹配括號內的任一字元,如 [abc] ,也可以在括號內加連線符,如 [0-9] 匹配0至9的數; ? 用來匹配單個字元。

看了這麼多,還是應該來個栗子:

# 忽略 .a 檔案

*.a

# 但否定忽略 lib.a, 儘管已經在前面忽略了 .a 檔案

!lib.a

# 僅在當前目錄下忽略 TODO 檔案, 但不包括子目錄下的 subdir/TODO

/TODO

# 忽略 build/ 資料夾下的所有檔案

build/

# 忽略 doc/notes.txt, 不包括 doc/server/arch.txt

doc/*.txt

# 忽略所有的 .pdf 檔案 在 doc/ directory 下的

doc/**/*.pdf

  1. 遠端倉庫
    1. 新增遠端庫

現在我們已經在本地建立了一個Git倉庫,又想讓其他人來協作開發,此時就可以把本地倉庫同步到遠端倉庫,同時還增加了本地倉庫的一個備份。

常用的遠端倉庫就是github:https://github.com/,接下來我們演示如何將原生代碼同步到github。

 

      1. 在github上建立倉庫

首先你得在github上建立一個賬號,這個就不演示了。然後在github上建立一個倉庫:

 

 

點選“create repository”按鈕倉庫就建立成功了。

Github支援兩種同步方式“https”和“ssh”。如果使用https很簡單基本不需要配置就可以使用,但是每次提交程式碼和下載程式碼時都需要輸入使用者名稱和密碼。而且如果是公司配置的私有git伺服器一般不提供hppts方式訪問,所以我們著重將“ssh”方式。

 

      1. ssh協議
        1. 什麼是ssh?

SSH是英文Secure Shell的簡寫形式。通過使用SSH,你可以把所有傳輸的資料進行加密,這樣"中間人"這種攻擊方式就不可能實現了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸的資料是經過壓縮的,所以可以加快傳輸的速度。SSH有很多功能,它既可以代替Telnet,又可以為FTP、Pop、甚至為PPP提供一個安全的"通道"。

 

如果一個使用者從本地計算機,使用SSH協議登入另一臺遠端計算機,我們就可以認為,這種登入是安全的,即使被中途截獲,密碼也不會洩露。

最早的時候,網際網路通訊都是明文通訊,一旦被截獲,內容就暴露無疑。1995年,芬蘭學者Tatu Ylonen設計了SSH協議,將登入資訊全部加密,成為網際網路安全的一個基本解決方案,迅速在全世界獲得推廣,目前已經成為Linux系統的標準配置。

        1. ssh金鑰生成

在windows下我們可以使用 Git Bash.exe來生成金鑰,可以通過開始選單或者右鍵選單開啟Git Bash

 

  

 

 

git bash 執行命令,生命公鑰和私鑰

命令: ssh-keygen -t rsa

 

執行命令完成後,在window本地使用者.ssh目錄C:\Users\使用者名稱\.ssh下面生成如下名稱的公鑰和私鑰:

 

 

        1. ssh金鑰配置

金鑰生成後需要在github上配置金鑰本地才可以順利訪問。

 

 

在key部分將id_rsa.pub檔案內容新增進去,然後點選“Add SSH key”按鈕完成配置。

      1. 同步到遠端倉庫

同步到遠端倉庫可以使用git bash也可以使用tortoiseGit

 

        1. 使用git bash

在倉庫所在的目錄(D:\temp\git\repository)點選右鍵選擇“Git Bash Here”,啟動git bash程式。

 

然後在git bash中執行如下語句:

git remote add origin [email protected]:sublun/mytest.git

git push -u origin master

注意:其中紅色字型部分需要替換成個人的使用者名稱。

 

如何出現如下錯誤:

 

可以先執行如下命令,然後再執行上面的命令

$ git remote rm origin

 

 

        1. 使用TortoiseGit同步

一、由於TortoiseGit使用的ssh工具是“PuTTY”git Bash使用的ssh工具是“openSSH”,如果想讓TortoiseGit也使用剛才生成的金鑰可以做如下配置:

 

 

Url:遠端倉庫的地址

推送URL:也是相同的

Putty金鑰:選擇剛才生成的金鑰中的私鑰

 

  • 同步。在本地倉庫的資料夾中單擊右鍵,選擇“Git同步”

 

 

    1. 從遠端倉庫克隆

克隆遠端倉庫也就是從遠端把倉庫複製一份到本地,克隆後會建立一個新的本地倉庫。選擇一個任意部署倉庫的目錄,然後克隆遠端倉庫。

      1. 使用git bash:

$ git clone [email protected]:sublun/mytest.git

      1. 使用TortoiseGit:

在任意目錄點選右鍵:

 

 

    1. 從遠端倉庫取程式碼

Git中從遠端的分支獲取最新的版本到本地有這樣2個命令:

  1. git fetch:相當於是從遠端獲取最新版本到本地,不會自動merge(合併程式碼)
  2. git pull:相當於是從遠端獲取最新版本並merge到本地

上述命令其實相當於git fetch 和 git merge

在實際使用中,git fetch更安全一些

因為在merge前,我們可以檢視更新