原文:http://www.restran.net/2016/02/23/git-and-gitlab-guide/?utm_source=tuicool&utm_medium=referraljavascript
去年小組在從 SVN 和 TFS 遷移到 Git 的過程當中整理了這份文檔,面向的用戶是對 Git 和 SVN 可能都不是很瞭解的人。看到本身寫了這麼多,因而就拿出來分享下,有些東西可能寫得比較淺,有錯誤還請指正。html
Git 是一個分佈式版本控制系統。分佈式的意思是,每一個人電腦上都是一份完整的代碼庫,包含了全部的代碼提交歷史。因爲 Git 分佈式的特色,在沒有網絡的狀況下,依然能夠自由地將代碼提交的本地的代碼庫中,等網絡恢復後再推送到服務器,開發更加靈活和自由。java
重要概念:本地一個代碼庫,對本地文件的全部操做,最後都是提交到這個代碼庫中。同時能夠設置多個遠程(remote,默認的remote一般用origin表示),當你要將代碼更新到服務器上時(稱做push),就經過設置的remote,更新到指定的服務器。git
關於多個remote:例如其餘公司的開發人員,在本身的公司中開發代碼,將默認remote設置爲公司本身的源碼管理服務器,同時設置另一個remote爲移動的源碼服務器。這樣便可以將代碼提交到本身公司的服務器,同時也能夠提交到移動的服務器。github
注意
:Fetch 只是將代碼更新到本地代碼庫,你須要檢出(check out)或與當前工做分支合併(merge)才能在你的工做目錄中看到代碼的改變。Gitlab 是 Git 服務端的集成管理平臺,提供了:swift
目前官方沒有中文版,有我的漢化版本,一些地方對中文的支持較很差(詳見後續章節),若是有須要中文翻譯的地方,能夠本身修改對應的代碼。centos
怎麼安裝和維護 Gitlab,請看我另一篇博客 CentOS 6.5 Minimal 安裝 Gitlab 7.5緩存
須要安裝如下工具:安全
Git 圖形界面操做工具服務器
TortoiseGit只有 Windows 版本,有32位和64位版本,請根據本身的電腦選擇相應的版本,同時下載對應版本的中文語言包。
右鍵 -> TortoiseGit -> 設置
點擊 Git
選項,而後點擊右側的 全局
,最後輸入用戶名和郵箱便可。這裏的用戶名和郵箱,將做爲之後提交數據到Git服務端的做者信息,請必定要設置。
默認狀況下,Git 客戶端每次與服務器交互,都須要輸入密碼。可是咱們能夠配置保存密碼,只須要輸入一次,就再也不須要輸入密碼。
選擇 編輯全局.git/config
,在末尾添加
[credential]
helper = store
Git 能夠經過 HTTP 和 SSH 的方式鏈接,若是要使用SSH的方式鏈接,須要確保本身的 IP 有訪問 Gitlab 服務器 22 端口的權限。
經過 SSH 的方式,能夠不用每次與服務器進行交互時都須要輸入用戶名和密碼。若是是 IDE 中的 Git 插件,則有保存密碼的功能。
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
幫助 -> Show SSH Key
點擊 Generate Key,彈出一個對話框,提示輸入 passphrase(密碼短語),須要輸入兩次。意思就是之後提交數據到服務端,只要輸入這個密碼短語就能夠了。這裏能夠爲空,直接點OK,這樣,之後就不須要輸入任何密碼。但建議仍是要輸入密碼短語。
複製 SSH Key 的公鑰
配置好 SSH Key 之後提交代碼,能夠不用輸入密碼。點擊右上角的資料設置 -> SSH 密鑰 -> 增長 SSH 密鑰
粘貼剛剛複製的 SSH Key 公鑰,標題爲可選,不寫會自動生成
2.7.1 上傳我的頭像
請上傳我的頭像,主要是爲了易於識別用戶。
2.7.2 設置郵件通知
若是不想收到郵件通知,能夠設置關閉。可是建議開啓郵件通知。
3.1.1 在 Gitlab 上執行建立新項目
項目建立完成後,須要初始化,請保留該頁面,在必要時複製項目的 SSH 地址
Git 同時支持 SSH 和 HTTP 的方式訪問,SSH 能夠不用輸入密碼。
3.1.2 初始化項目
如下這些操做,須要在項目的目錄下進行。請注意若是你的項目文件夾路徑包含中文,請使用 TortoiseGit 工具來操做,不要使用 Git Gui,不然會出現錯誤。
3.1.3 建立一份排除版本控制的文件類型清單
在項目中,實際上有不少文件是不須要版本控制的,例如編譯過程當中生成的中間文件 .obj
,IDE 的配置文件(Intellj IDEA 的.idea
文件夾),編譯生成的文件(/out/ 和 /bin/ 文件夾),Python的.pyc文件,像這些類型的文件咱們能夠設置過濾,避免致使版本庫很大。
咱們只要在項目的目錄下,放一個 .gitignore
文件就能夠了。
這份 .gitignore
文件,排除了.idea/,out/,bin/ 文件夾,以及全部類型爲 .pyc 的文件
Github 上面有一個 .gitignore 模板的項目
若是後續開發中有新類型的文件要排除,能夠在文件上
右鍵 -> TortoisGit -> 刪除並添加到忽略列表
3.1.4 建立一份 README.md 文件
README.md 文件用來填寫項目的描述和說明,會直接顯示在 Gitlab 的項目文件頁面,方便直接查看項目的描述信息。
.md 是 Markdown 格式的文件,關於 Markdown,能夠查看 做業部落
3.1.5 在本身的電腦上建立版本庫
在項目目錄下
右鍵 -> Git init here
這樣就能夠在當前文件夾建立一個 Git 版本控制的庫,同時建立一個分支 master。
該操做會在這個文件夾下自動建立一個 .git
的隱藏文件夾,全部關於版本控制的信息都放在這個文件夾下面的文件中。
3.1.6 提交代碼到本地版本庫
右鍵 -> Git 提交
選擇要提交的文件,並填寫描述信息
3.1.7 設置 remote
將項目的 SSH 地址複製過來,並將默認的 remote 名稱設置爲 origin
若是提示是否關閉獲取標籤,也選擇 No
3.1.8 推送到服務器上的版本庫(push to remote)
若是提示該服務器主機是未知的,請選擇是,添加到已知主機列表
到這一步項目的代碼庫已建立完成,能夠去 Gitlab 上查看項目
3.1.9 建立開發分支
默認狀況下,master 分支在 Gitlab 中是保護分支。保護分支只容許 Master 級別以上的用戶才能 push 和 delete。而普通的開發人員(Developer 級別)是沒法提交代碼到 master分支的。
這麼設計的緣由是:咱們一般將 master 分支做爲穩定版本發佈的分支,在這個分支上的代碼都是最新可用版本。而平常的開發,一般在開發分支 develop 上進行。等到功能穩定後,再由項目的管理員合併到 master 分支上。
請在 Gitlab 中操做
3.2.1 克隆項目
在一個空白的項目文件夾下,右鍵 -> Git克隆。
若是你已配好了SSH Key,請輸入項目的SSH地址,這樣就能夠不用再輸入密碼。Git 支持 SSH 和 HTTP 的方式訪問,這裏也可使用 HTTP 地址。
若是提示該服務器主機是未知的,請選擇 是
,添加到已知主機列表
3.2.2 檢出開發分支
Git 克隆默認會檢出 master 分支,可是咱們須要在開發分支中工做。
檢查當前所在的分支
注意:切換分支的時候,若是有未提交的內容,須要先提交,不然沒法切換分支。若是不想提交能夠用貯藏(stash)
到這一步完成,你就能夠在本地自由地作開發了
3.2.3 從服務器的代碼庫更新數據
請注意,選擇拉取功能,就不須要再執行合併。若是是獲取,就須要再執行一次合併。二者的區別在於,拉取省略了合併的細節。
3.2.4 衝突與解決
出現沒法推送
試試拉取,但拉取的時候出現衝突,Merge conflict in test.html
這時候須要先解決衝突
解決方法有兩種,一種是打開衝突的文件,手動刪除衝突標記
上面那部分的內容是本地代碼庫,HEAD 所指向分支的代碼,下面那部分的內容是服務器端代碼庫的內容
<<<<<<< HEAD <pre>This is for test.</pre> ======= <p><a>This is for test.</a></p> >>>>>>> 5f065407ecf91415f109c882119291f0be37b07a
只須要決定最後的內容,而後刪除衝突標記,例如,只剩下
<pre>This is for test.</pre>
刪除完衝突標記後,須要右鍵空白的地方,點擊 Git Add all files now
另外一種方法是使用 TorgoiseGit 的工具
雙擊衝突的文件
點擊保存
無論使用哪一種方法,最後都要執行的兩步操做是 提交
和 推送
提交
推送
當成功推送到服務器的代碼庫後,衝突纔算真正解決
3.2.5 提交和推送代碼到服務器的版本庫
請查看 3.2.3 和 3.2.5,注意選擇正確的分支。
請注意:只有項目的 master 權限或者 owner 權限的人才能將代碼推送到保護分支中,master 分支默認是保護分支。假如本身沒有推送到保護分支的權限時,你能夠將代碼提交到,如 develop 分支中(或者本身創建的分支中),等 develop 分支的代碼穩定後,而後在 Gitlab 的項目地址中,發起一個 merge request 請求,系統會發送郵件通知對應的人執行合併操做。這樣就能夠將代碼合併到保護分支中(如 master 分支)
發起合併請求
選擇須要合併的分支,點擊「比較分支」(須要先比較分支,能夠查看到這兩個分支的差別)
描述分支合併請求,而後指派給項目的管理員,項目管理員會收到合併請求的郵件
3.3.1 建立分支與標籤
分支能夠基於任意提交(commit)、已有分支、已有標籤中建立。
當你要作實驗,或者開發新功能,修正bug時,均可以經過建立分支來安全的處理。這樣就不會影響正常的開發,當完成的時候,再合併回去。
建立完分支後,記得切換到正確的分支中去工做。
標籤是隻讀的,一般只用來記錄特定的歷史時刻,如里程碑版本等,這是爲了方便之後檢出特定版本的代碼。
3.3.2 推送分支或標籤到服務器的版本庫
使用推送命令,能夠將本地版本庫中的分支推送到服務器的版本庫中。若是要推送標籤,請勾選 包含標籤
。
3.3.3 分支合併
選擇要合併到當前工做分支中的分支,例如當前所在的分支是 master,選擇 develop,則會將 develop 中的代碼合併到 master 中。
合併分支有可能會出現衝突,解決衝突的方法請參見 3.3.4
WiKi 能夠放項目的相關說明文檔,包括部署手冊,使用手冊等等。
Gitlab 的 Wiki 使用了 Markdown 格式(是一種輕量級標記語言,可使用易讀易寫的純文本格式編寫出排版漂亮的文檔)
簡易入門請看 做業部落
在儀表盤中,點擊項目
Git 最爲重要的特性之一是名爲 git svn
的 Subversion 雙向橋接工具。該工具把 Git 變成了 Subversion服務的客戶端,從而能夠將 SVN 的代碼庫遷移到 Git,同時保留提交日誌。
使用 TortoiseGit 的 Git 克隆,選擇從 SVN 版本庫
將代碼克隆下來後,再設置下 Git 代碼庫的 remote,而後推送過去就能夠了。
須要使用工具 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 的服務器地址。
右鍵,Tortoise Git -> 顯示日誌
按 Ctrl 鼠標左鍵選擇兩個版本,右鍵選擇比較差別
右鍵選擇要比較差別的文件,選擇比較差別
TortoiseGit 能夠比較 Word 文件的差別
文本文件的差別比較是這樣的
當咱們將分支合併到主分支,或者放棄該分支的時候,能夠對分支進行刪除操做。
在 TortoiseGit 上進行分支刪除操做很是簡單,首先打開 「CheckOut/Switch」 對話框,經過 「Switch to Branch」 更多按鈕打開分支列表,或者經過菜單 「Browser References」 打開分支列表(默認該菜單是隱藏的)。選擇相應的分支,單擊右鍵,選擇刪除。
注意:
當咱們發現當前的代碼有問題,想回退到以前的版本時,可使用重置版本。在項目目錄下,
右鍵 -> TorgoiseGit -> 顯示日誌
進入日誌信息窗口,選擇指定的版本
右鍵 -> 重置到這個版本
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 添加跟蹤的文件,以及當前工做目錄中的修改內容,都會丟失。
File/Import
6.2.1 獲取數據(fetch)
項目右鍵 -> Team -> Remote -> Fetch From
Gerrit 是基於 Git 的代碼審覈軟件
選擇遠程代碼庫
自定義選擇要獲取的遠程分支,該圖是遠程倉庫中的全部
fetch 只是把服務端的代碼更新,放到本地的代碼庫中,還須要與本地分支合併,才能真正將代碼更新到工做目錄中。
分支的合併也是在這裏操做,注意上圖中,當前是 master,而後要把 origin/master 合併到 master 中
squash:不建立新的 commit
pull = fetch + merge
6.2.2 推送(push)
若是要刪除分支,也能夠在這裏操做,Add delete ref specification
6.2.3 Fetch from Upstream, Push to Upstream
Git 能夠同時設置多個遠程分支,這裏的 Upstream 能夠簡單的理解成是默認的遠程分支,由於代碼的版本歷史,就像溪流不斷向前,所以把代碼源稱爲 Upstream(由於本地的代碼 clone 自這裏)。
選擇 Team -> Merge Tool
修改左邊的本地數據,修改好後 Ctrl+S
保存文件就能夠了。這時候再次查看文件,衝突標記已經自動去掉。
<<<<<<< HEAD
=======
>>>>>>> remote
而後右鍵點擊此衝突文件
選擇 Team -> Add to index
再次將文件加入索引控制,此時文件已經不是衝突狀態,而且能夠進行提交併 push 到服務器端。必定要從新 commit,並 push 到服務端,纔算真正解決衝突。
建立分支
建立標籤