003_Git & Gitlab 使用指南


去年小組在從 SVN 和 TFS 遷移到 Git 的過程中整理了這份文檔,面向的用戶是對 Git 和 SVN 可能都不是很了解的人。看到自己寫了這么多,於是就拿出來分享下,有些東西可能寫得比較淺,有錯誤還請指正。

1. 關於 Git 你應該知道的東西

Git 是一個分布式版本控制系統。分布式的意思是,每個人電腦上都是一份完整的代碼庫,包含了所有的代碼提交歷史。
由於 Git 分布式的特點,在沒有網絡的情況下,依然可以自由地將代碼提交的本地的代碼庫中,等網絡恢復后再推送到服務器,開發更加靈活和自由。

重要概念:本地一個代碼庫,對本地文件的所有操作,最后都是提交到這個代碼庫中。同時可以設置多個遠程(remote,默認的remote通常用origin表示),當你要將代碼更新到服務器上時(稱作push),就通過設置的remote,更新到指定的服務器。

關於多個remote:例如其他公司的開發人員,在自己的公司中開發代碼,將默認remote設置為公司自己的源碼管理服務器,同時設置另外一個remote為移動的源碼服務器。這樣即可以將代碼提交到自己公司的服務器,同時也可以提交到我們公司的服務器。

1.1 一些術語

  • Fetch(獲取),從遠程代碼庫更新數據到本地代碼庫。注意:Fetch 只是將代碼更新到本地代碼庫,你需要檢出(check out)或與當前工作分支合並(merge)才能在你的工作目錄中看到代碼的改變。
  • Pull(拉取),從遠程代碼庫更新數據到本地代碼庫,並與當前工作分支合並,等同於 Fetch + Merge。
  • Push(推送),將本地代碼庫中已提交(commit)的數據推送到指定的 remote,沒有 commit 的數據,不會push
  • HEAD,指向你正在工作中的本地分支的指針
  • Master 分支:主分支,所有提供給用戶使用的正式版本,都在這個主分支上發布。關於分支管理的擴展閱讀
  • Tags(標簽):用來記錄重要的版本歷史,例如里程碑版本
  • Origin:默認的 remote的名稱
  • Git clone(克隆版本庫):從服務端將項目的版本庫克隆下來
  • Git init(在本地初始化版本庫):在本地創建版本庫的時候使用

1.2 工作流程

  1. 對代碼進行修改
  2. 完成了某項功能,提交(commit,只是提交到本地代碼庫),1-2可以反復進行,直到覺得可以推送到服務器上時,執行3
  3. 拉取(pull,或者用獲取 fetch 然后再手動合並 merge)
  4. 如果存在沖突,解決沖突
  5. 推送(push),將數據提交到服務器上的代碼庫

1.3 Gitlab 可以做什么

Gitlab 是 Git 服務端的集成管理平台,提供了:

  1. 代碼托管服務
  2. 訪問權限控制
  3. 問題跟蹤,bug的記錄、跟蹤和討論
  4. Wiki,項目中一些相關的說明和文檔
  5. 代碼審查,可以查看、評論代碼

目前官方沒有中文版,有個人漢化版本,一些地方對中文的支持較不好(詳見后續章節),如果有需要中文翻譯的地方,可以自己修改對應的代碼。

怎么安裝和維護 Gitlab,請看我另外一篇博客 CentOS 6.5 Minimal 安裝 Gitlab 7.5


2. 安裝與配置

需要安裝以下工具:

Git 圖形界面操作工具

TortoiseGit只有 Windows 版本,有32位和64位版本,請根據自己的電腦選擇相應的版本,同時下載對應版本的中文語言包。

2.1 設置 TortoiseGit 中文語言

右鍵 -> TortoiseGit -> 設置

2_1_1.png

2_1_2.png

2.2 設置用戶名和郵箱

點擊 Git 選項,然后點擊右側的全局,最后輸入用戶名和郵箱即可。這里的用戶名和郵箱,將作為以后提交數據到Git服務端的作者信息,請一定要設置。

2_2_1.png

2.3 設置保存密碼

默認情況下,Git 客戶端每次與服務器交互,都需要輸入密碼。但是我們可以配置保存密碼,只需要輸入一次,就不再需要輸入密碼。

2_3_1.png

選擇編輯全局.git/config,在末尾添加

1
2
[credential] 
helper = store

2_3_2.png

2.4 配置 SSH Key

Git 可以通過 HTTP 和 SSH 的方式連接,如果要使用SSH的方式連接,需要確保自己的 IP 有訪問 Gitlab 服務器 22 端口的權限。

通過 SSH 的方式,可以不用每次與服務器進行交互時都需要輸入用戶名和密碼。如果是 IDE 中的 Git 插件,則有保存密碼的功能。

2.5 生成 SSH Key

2.5.1 在 Git Bash 命令行下生成

鼠標右鍵 -> Git Bash

ssh-keygen -t rsa -C "uasername@139.com"

生成后的公鑰會存放在

C:/Users/You_User_Name/.ssh/id_rsa.pub

2.5.2 在可視化工具下生成

注意:使用這種方法生成時,默認會用計算機名,作為生成的 SSH Key 的名稱,如果計算機名包含中文,則會因編碼問題而出錯。這時候可以使用在 Git Bash 命令行下生成的方法。

鼠標右鍵 -> Git Gui

2_4_1.png

幫助 -> Show SSH Key

2_4_2.png

點擊 Generate Key,彈出一個對話框,提示輸入 passphrase(密碼短語),需要輸入兩次。意思就是以后提交數據到服務端,只要輸入這個密碼短語就可以了。這里可以為空,直接點OK,這樣,以后就不需要輸入任何密碼。但建議還是要輸入密碼短語。

2_4_3.png

復制 SSH Key 的公鑰

2_4_4.png

2.6 在 Gitlab 上配置 SSH Key

配置好 SSH Key 以后提交代碼,可以不用輸入密碼。點擊右上角的資料設置 -> SSH 密鑰 -> 增加 SSH 密鑰

2_4_5.png

粘貼剛剛復制的 SSH Key 公鑰,標題為可選,不寫會自動生成

2_4_6.png

2.7 配置 Gitlab

2.7.1 上傳個人頭像

請上傳個人頭像,主要是為了易於識別用戶。

2_5_1.png

2.7.2 設置郵件通知

如果不想收到郵件通知,可以設置關閉。但是建議開啟郵件通知。

2_5_2.png


3. Git 基本功能簡介

3.1 我是項目的創建者,我要創建項目

3.1.1 在 Gitlab 上執行創建新項目

  1. 取一個恰當的名字。
  2. 選擇正確的命名空間。所有人都可以在自身用戶名下建立新項目,但是群組命名空間下的項目只能由具有相應權限的人建立。
  3. 填寫詳細的項目描述
  4. 選擇可見等級

3_1_1.png

項目創建完成后,需要初始化,請保留該頁面,在必要時復制項目的 SSH 地址

Git 同時支持 SSH 和 HTTP 的方式訪問,SSH 可以不用輸入密碼。

3_1_2.png

3.1.2 初始化項目

以下這些操作,需要在項目的目錄下進行。請注意如果你的項目文件夾路徑包含中文,請使用 TortoiseGit 工具來操作,不要使用 Git Gui,否則會出現錯誤。

3.1.3 創建一份排除版本控制的文件類型清單

在項目中,實際上有很多文件是不需要版本控制的,例如編譯過程中生成的中間文件 .obj,IDE 的配置文件(Intellj IDEA 的 .idea 文件夾),編譯生成的文件(/out/ 和 /bin/ 文件夾),Python的.pyc文件,像這些類型的文件我們可以設置過濾,避免導致版本庫很大。

我們只要在項目的目錄下,放一個 .gitignore 文件就可以了。

3_1_3.png

這份 .gitignore 文件,排除了.idea/,out/,bin/ 文件夾,以及所有類型為 .pyc 的文件

3_1_4.png

Github 上面有一個 .gitignore 模板的項目

如果后續開發中有新類型的文件要排除,可以在文件上

右鍵 -> TortoisGit -> 刪除並添加到忽略列表

3.1.4 創建一份 README.md 文件

README.md 文件用來填寫項目的描述和說明,會直接顯示在 Gitlab 的項目文件頁面,方便直接查看項目的描述信息。
.md 是 Markdown 格式的文件,關於 Markdown,可以查看作業部落

3_1_5.png

3.1.5 在自己的電腦上創建版本庫

在項目目錄下

右鍵 -> Git init here

這樣就可以在當前文件夾創建一個 Git 版本控制的庫,同時創建一個分支 master。

該操作會在這個文件夾下自動創建一個 .git 的隱藏文件夾,所有關於版本控制的信息都放在這個文件夾下面的文件中。

3_1_6.png

3.1.6 提交代碼到本地版本庫

右鍵 -> Git 提交

3_1_7.png

選擇要提交的文件,並填寫描述信息

3_1_8.png

3.1.7 設置 remote

3_1_9.png

將項目的 SSH 地址復制過來,並將默認的 remote 名稱設置為 origin

3_1_10.png

3_1_11.png

如果提示是否關閉獲取標簽,也選擇 No

3.1.8 推送到服務器上的版本庫(push to remote)

3_1_12.png

3_1_13.png

如果提示該服務器主機是未知的,請選擇是,添加到已知主機列表

3_1_14.png

到這一步項目的代碼庫已創建完成,可以去 Gitlab 上查看項目

3_1_15.png

3.1.9 創建開發分支

默認情況下,master 分支在 Gitlab 中是保護分支。保護分支只允許 Master 級別以上的用戶才能 push 和 delete。而普通的開發人員(Developer 級別)是無法提交代碼到 master分支的。

這么設計的原因是:我們通常將 master 分支作為穩定版本發布的分支,在這個分支上的代碼都是最新可用版本。而日常的開發,通常在開發分支 develop 上進行。等到功能穩定后,再由項目的管理員合並到 master 分支上。

請在 Gitlab 中操作

3_1_16.png

3_1_17.png

3.2 我是開發人員,我要獲取和提交代碼

3.2.1 克隆項目

在一個空白的項目文件夾下,右鍵 -> Git克隆。

如果你已配好了SSH Key,請輸入項目的SSH地址,這樣就可以不用再輸入密碼。Git 支持 SSH 和 HTTP 的方式訪問,這里也可以使用 HTTP 地址。

3_2_1.png

如果提示該服務器主機是未知的,請選擇,添加到已知主機列表

3_2_2.png

3.2.2 檢出開發分支

Git 克隆默認會檢出 master 分支,但是我們需要在開發分支中工作。

3_2_3.png

3_2_4.png

檢查當前所在的分支

3_2_5.png

注意:切換分支的時候,如果有未提交的內容,需要先提交,否則無法切換分支。如果不想提交可以用貯藏(stash)

到這一步完成,你就可以在本地自由地做開發了

3.2.3 從服務器的代碼庫更新數據

請注意,選擇拉取功能,就不需要再執行合並。如果是獲取,就需要再執行一次合並。兩者的區別在於,拉取省略了合並的細節。

3_2_6.png

3.2.4 沖突與解決

出現無法推送

3_2_7.png

試試拉取,但拉取的時候出現沖突,Merge conflict in test.html

3_2_8.png

這時候需要先解決沖突

3_2_9.png

解決方法有兩種,一種是打開沖突的文件,手動刪除沖突標記

上面那部分的內容是本地代碼庫,HEAD 所指向分支的代碼,下面那部分的內容是服務器端代碼庫的內容

1
2
3
4
5
<<<<<<< HEAD
<pre>This is for test.</pre>
=======
<p><a>This is for test.</a></p>
>>>>>>> 5f065407ecf91415f109c882119291f0be37b07a

只需要決定最后的內容,然后刪除沖突標記,例如,只剩下

1
<pre>This is for test.</pre>

3_2_10.png

刪除完沖突標記后,需要右鍵空白的地方,點擊 Git Add all files now

3_2_11.png

另一種方法是使用 TorgoiseGit 的工具

3_2_12.png

雙擊沖突的文件

3_2_13.png

點擊保存

3_2_14.png

不管使用哪種方法,最后都要執行的兩步操作是提交推送

提交

3_2_15.png

推送

3_2_16.png

當成功推送到服務器的代碼庫后,沖突才算真正解決

3.2.5 提交和推送代碼到服務器的版本庫

請查看 3.2.3 和 3.2.5,注意選擇正確的分支。

請注意:只有項目的 master 權限或者 owner 權限的人才能將代碼推送到保護分支中,master 分支默認是保護分支。
假如自己沒有推送到保護分支的權限時,你可以將代碼提交到,如 develop 分支中(或者自己建立的分支中),等 develop 分支的代碼穩定后,然后在 Gitlab 的項目地址中,發起一個 merge request 請求,系統會發送郵件通知對應的人執行合並操作。這樣就可以將代碼合並到保護分支中(如 master 分支)

發起合並請求

3_2_17.png

選擇需要合並的分支,點擊“比較分支”(需要先比較分支,可以查看到這兩個分支的差異)

3_2_18.png

描述分支合並請求,然后指派給項目的管理員,項目管理員會收到合並請求的郵件

3_2_19.png

3.3 分支與標簽

3.3.1 創建分支與標簽

3_3_1.png

分支可以基於任意提交(commit)、已有分支、已有標簽中創建。

當你要做實驗,或者開發新功能,修正bug時,都可以通過創建分支來安全的處理。這樣就不會影響正常的開發,當完成的時候,再合並回去。

創建完分支后,記得切換到正確的分支中去工作。

3_3_2.png

標簽是只讀的,通常只用來記錄特定的歷史時刻,如里程碑版本等,這是為了方便以后檢出特定版本的代碼。

3_3_3.png

3.3.2 推送分支或標簽到服務器的版本庫

使用推送命令,可以將本地版本庫中的分支推送到服務器的版本庫中。如果要推送標簽,請勾選包含標簽

3_3_4.png

3.3.3 分支合並

3_3_5.png

選擇要合並到當前工作分支中的分支,例如當前所在的分支是 master,選擇 develop,則會將 develop 中的代碼合並到 master 中。

3_3_6.png

合並分支有可能會出現沖突,解決沖突的方法請參見 3.3.4


4 Gitlab 基本功能

4.1 為項目寫 WiKi

WiKi 可以放項目的相關說明文檔,包括部署手冊,使用手冊等等。

4_1_1.png

4_1_2.png

Gitlab 的 Wiki 使用了 Markdown 格式(是一種輕量級標記語言,可以使用易讀易寫的純文本格式編寫出排版漂亮的文檔)
簡易入門請看作業部落

4.2 查看項目的標簽信息

在儀表盤中,點擊項目

4_2_1.png

5 高級功能

5.1 從SVN遷移到Git

Git 最為重要的特性之一是名為 git svn 的 Subversion 雙向橋接工具。該工具把 Git 變成了 Subversion服務的客戶端,從而可以將 SVN 的代碼庫遷移到 Git,同時保留提交日志。

使用 TortoiseGit 的 Git 克隆,選擇從 SVN 版本庫

5_1_1.png

將代碼克隆下來后,再設置下 Git 代碼庫的 remote,然后推送過去就可以了。

5.2 從 TFS 遷移到 Git

需要使用工具 git-tfs,下載地址在這里

https://github.com/git-tfs/git-tfs/releases

請注意 v0.20.0 版本不支持 TFS 服務器是 2008 版本,如果是 TFS 2008,請選擇 v0.19.2。

需要將 git-tfs 文件目錄添加到環境變量。

還需要再安裝 TFS Team Explorer。如果服務器是TFS 2008版本,必須確保自己的電腦上只能安裝 TFS Team Explorer 2008,如果安裝了 TFS Team Explorer 2013,則仍然會提示不支持 TFS 2008,無法正確使用 git-tfs。可以切換到虛擬機中,只安裝 TFS 2008 中。

在 Git Bash 中輸入如下命令

git-tfs clone http://192.168.8.25:8080 $/qzmcc_uuv

qzmcc_uuv 為項目在 TFS 上的名稱,http://192.168.8.25:8080 為 TFS 的服務器地址。

5.3 比較版本差異

右鍵,Tortoise Git -> 顯示日志

按 Ctrl 鼠標左鍵選擇兩個版本,右鍵選擇比較差異

5_3_1.png

右鍵選擇要比較差異的文件,選擇比較差異

5_3_2.png

TortoiseGit 可以比較 Word 文件的差異

5_3_3.png

文本文件的差異比較是這樣的

5_3_4.png

5.4 刪除分支

當我們將分支合並到主分支,或者放棄該分支的時候,可以對分支進行刪除操作。

在 TortoiseGit 上進行分支刪除操作非常簡單,首先打開 “CheckOut/Switch” 對話框,通過 “Switch to Branch” 更多按鈕打開分支列表,或者通過菜單 “Browser References” 打開分支列表(默認該菜單是隱藏的)。選擇相應的分支,單擊右鍵,選擇刪除。

注意:

  1. 刪除分支,既可以刪除本地分支,也可以刪除遠程分支。
  2. 如果刪除遠程分支,推送后,服務器上對應的分支會被刪除。當其他開發者更新數據后,其對應的本地分支並不會刪除。
  3. 在刪除遠程分支的時候,本地分支並不會刪除,這也說明了本地分支與遠程分支並無從屬關系。

5_4_1.png

5_4_2.png

5.5 重置代碼到以前的版本

當我們發現當前的代碼有問題,想回退到之前的版本時,可以使用重置版本。在項目目錄下,

右鍵 -> TorgoiseGit -> 顯示日志

進入日志信息窗口,選擇指定的版本

右鍵 -> 重置到這個版本

5_5_1.png

5_5_2.png

5.5.1 重置類型,soft, mixed, hard 的區別

soft 不改動工作區和索引

假設有一些 commits

A - B - C (master)

HEAD 指向 C, 並且暫存區(stage,或稱為 index)matches C.

當使用 git reset --soft B 時,master 和 HEAD 指向 B,但是依然保留了 C 添加跟蹤的文件,此時會將這些文件放入暫存區中,顯示為已緩存。同時工作區中修改的文件,顯示為未緩存。

mixed 保持工作區不變,重置索引

當使用 git reset --mixed B 時,master 和 HEAD 指向 B,這時候 C 添加跟蹤的文件仍然會在,但是會顯示為未緩存(不是版本控制),而當前工作目錄中的修改內容,仍然會在,顯示未緩存的狀態

(如果不知道怎么選,默認使用 mixed)

hard 重置索引和工作區(丟棄所有本地變更)

當使用 git reset --hard B 時,C 添加跟蹤的文件,以及當前工作目錄中的修改內容,都會丟失。


6 Eclipse 中使用 EGit

6.1 檢出項目

File/Import

5_6_1.png

5_6_2.png

5_6_3.png

5_6_4.png

5_6_5.png

5_6_6.png

5_6_7.png

5_6_8.png

6.2 更新和推送數據

6.2.1 獲取數據(fetch)

項目右鍵 -> Team -> Remote -> Fetch From

Gerrit 是基於 Git 的代碼審核軟件

5_6_9.png

選擇遠程代碼庫

5_6_10.png

自定義選擇要獲取的遠程分支,該圖是遠程倉庫中的所有

5_6_11.png

fetch 只是把服務端的代碼更新,放到本地的代碼庫中,還需要與本地分支合並,才能真正將代碼更新到工作目錄中。

5_6_12.png

分支的合並也是在這里操作,注意上圖中,當前是 master,然后要把 origin/master 合並到 master 中

1
2
squash:不創建新的 commit
pull = fetch + merge

6.2.2 推送(push)

如果要刪除分支,也可以在這里操作,Add delete ref specification

5_6_13.png

5_6_14.png

6.2.3 Fetch from Upstream, Push to Upstream

Git 可以同時設置多個遠程分支,這里的 Upstream 可以簡單的理解成是默認的遠程分支,因為代碼的版本歷史,就像溪流不斷向前,因此把代碼源稱為 Upstream(因為本地的代碼 clone 自這里)。

6.3 解決沖突

選擇 Team -> Merge Tool

5_6_15.png

  • 第一項是將GIT自動合並過的文件和服務器端文件進行對比
  • 第二項是用本地最新版本的文件和服務器端文件進行對比,建議用此項

5_6_16.png

修改左邊的本地數據,修改好后 Ctrl+S 保存文件就可以了。這時候再次查看文件,沖突標記已經自動去掉。

1
2
3
4
5
<<<<<<< HEAD

=======

>>>>>>> remote

然后右鍵點擊此沖突文件

選擇 Team -> Add to index 

再次將文件加入索引控制,此時文件已經不是沖突狀態,並且可以進行提交並 push 到服務器端。一定要重新 commit,並 push 到服務端,才算真正解決沖突。

5_6_17.png

6.4 分支和標簽

創建分支

5_6_18.png

創建標簽

5_6_19.png

6.5 reset 到某個版本

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM