1. 程式人生 > >Git(一)Git的簡介安裝與本地倉庫檔案視覺化管理

Git(一)Git的簡介安裝與本地倉庫檔案視覺化管理

一.git歷史

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

   到 2005 年的時候,開發 BitKeeper 的商業公司同 Linux 核心開源社群的合作關係結束,他們收回了免費使用 BitKeeper 的權力。這就迫使 Linux 開源社群(特別是

Linux的締造者 Linus Torvalds )不得不吸取教訓,只有開發一套屬於自己的版本控制系統才不至於重蹈覆轍。他們對新的系統訂了若干目標:

  • 速度
  • 簡單的設計
  • 對非線性開發模式的強力支援(允許上千個並行開發的分支)
  • 完全分散式
  • 有能力高效管理類似 Linux 核心一樣的超大規模專案(速度和資料量)

二.gitsvn的區別

1.svn

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

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

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

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

  • 伺服器單點故障
  • 容錯性差

2.git 

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

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

三.git的工作流程

一般工作流程如下:

1.從遠端倉庫中克隆 Git 資源作為本地倉庫。

2.從本地倉庫中checkout程式碼然後進行程式碼修改

3.在提交前先將程式碼提交到暫存區。

4.提交修改。提交到本地倉庫。本地倉庫中儲存修改的各個歷史版本。

5.在修改完成後,需要和團隊成員共享程式碼時,可以將程式碼push到遠端倉庫。

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

四.git安裝

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

1.windows安裝

我這裡下載的對應64位作業系統的

下載完成有如下三個檔案

2)安裝

安裝git for windows

Next選擇安裝路徑,然後一路使用預設選項安裝直到完成。

安裝TortoiseGit

Next選擇安裝路徑,然後一路next直到出現配置介面

選擇English,接著繼續下一步,檢查安裝環境

配置使用者名稱,郵箱

下一步,預設選項,完成安裝。安裝完畢後在系統右鍵選單中會出現git的選單項

安裝中文語言包

 

直接“下一步”完整完畢。滑鼠右鍵選擇Settings

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

2.Linux上安裝

[[email protected] ~]$ sudo yum -y install git
[[email protected] ~]$ git --version
git version 1.8.3.1

五.使用git管理檔案版本 

1.建立版本庫

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

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

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

黑視窗建立倉庫執行命令: $ git init

使用tortoiseGit

使用TortoiseGit時只需要在目錄(D:\Develop\Git\git)中點選右鍵選單選擇“Git在這裡建立版本庫”

點選確定,建立成功 。

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

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

2.新增檔案

1) 新增檔案步驟

在D:\Develop\Git\git目錄下建立一個test.txt檔案,重新整理如下,標記藍色?

在git目錄內點選test.txt檔案右鍵客戶端工具點選新增 

提示新增成功,點選確定,此時 標記藍色?變為藍色 +

此時,git目錄裡隱藏檔案 .git 會多差一個暫存區index檔案。

提交檔案

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

日誌資訊輸入提交資訊(必填項)

點選提交

至此,新增檔案並提交到本地倉庫完成,文字檔案變為帶“√”號的圖示:標記藍色 + 變為綠色√

2)工作區和暫存區

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

   什麼是工作區(Working Directory)?

工作區就是你在電腦裡能看到的目錄,比如我的git資料夾就是一個工作區。其實git目錄是工作區,在這個目錄中的.git”隱藏資料夾才是版本庫。

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

如下圖所示:

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

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

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

因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。可以簡單理解為,需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。

3.修改檔案

1)提交修改

       被版本庫管理的檔案不可避免的要發生修改,此時只需要直接對檔案修改即可。修改完畢後需要將檔案的修改提交到版本庫。在修改後的test.txt(修改後圖示變成紅色感嘆號)檔案上點選右鍵,然後選擇“提交”,之前的提交方式一樣。

2)檢視修改歷史

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

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

3)差異比較

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

4)還原修改

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

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

4.刪除檔案

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

5.還原刪除檔案

6.案例:將專案提交到版本庫

第一步:把已有java工程solr-demo複製到工作目錄中

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

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

三、忽略檔案或資料夾

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

如果使用TortoiseGit的話可以使用選單項直接進行忽略。(這裡以IDEA專案演示)

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

同樣步驟再次把target目錄忽略

四、提交程式碼

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

提交

7.忽略檔案語法規範

空行或是以 # 開頭的行即註釋行將被忽略。
可以在前面新增正斜槓 / 忽略當前路徑檔案,但不包括子目錄的同名檔案。
可以在後面新增正斜槓 / 來忽略資料夾。
可以使用 ! 來否定忽略,即比如在前面用了 *.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