使用git、git-flow與gitlab工作


本文轉載自:蛋疼的axb 

1.摘要

在工作中使用git代替svn也有一段時間了,對於git的一些特性/愛不釋手的同時也一直遇到相同的問題:“這時候應該打什么命令?”。相對於svn或者vss的簡單,git的學習成本還是有些高,如果要使用一個工具還要翻上300頁的《Pro Git》,工具的使用成本甚至大於開發本身,這也是我寫這篇文章的初衷。

 

2.安裝

下載 git OSX 版
下載 git Windows 版
下載 git Linux 版

Linux下可以直接用apt-get install git或者yum安裝

3.開始使用

注:這篇教程里所有git操作在命令行下執行,windows下可以右鍵-git bash打開命令行。

如果有人告訴你某某項目的git地址:

git clone username@host:/path/to/repository

或者是你只想自己折騰一下,建立一個空白的版本庫:

git init

4.版本控制

4.1.本地版本庫

要提交代碼到git倉庫需要兩個命令:

git add 
git commit -m “代碼提交信息”

要撤銷提交:

git reset HEAD

要從從版本庫恢復文件:

git checkout —

 

在git文件夾中實際存在三個區域:

  實際目錄:實際修改的文件。
  待提交區:暫存准備提交的內容,提交之后被清空。(也叫做index區)
  已提交區:提交到本地git版本庫的內容,有版本號。

  對這三個區域的操作都可以在本地離線完成。

  完整一些的狀態圖如下:working dir、index、git resposity

查看文件狀態:

git status

  文件總共四種狀態:
  與git repository一致
  與git repository不一致,已緩存
  與git repository不一致,未緩存
  還未添加到git repository

4.2.遠程版本庫

從遠程更新:

git pull

提交到遠程:

git push

遠程git與本地git的關系大概是這樣:

  遠程git與本地git的關系

其中:remotes/origin是git用來管理遠程版本庫的的隱藏分支,一般不用理會。

5.分支與標記

5.1.分支

分支是用來將特性開發絕緣開來的。在你創建倉庫的時候,master 是“默認的”。在其他分支上進行開發,完成后再將它們合並到主分支上。

。

創建一個叫feature_x的分支,並切換過去:

git branch feature_x
git checkout feature_x

切換回主分支:

git checkout master

再把新建的分支刪掉:

git branch -d feature_x

除非你將分支推送到遠端倉庫,不然該分支就是 不為他人所見的:

git push origin

如果要刪除遠端倉庫里的某個分支:

git push origin :

5.2.合並

要合並其他分支到你的當前分支(例如 master),執行:

git merge

兩種情況下,git 都會嘗試去自動合並改動。不幸的是,自動合並並非次次都能成功,並可能導致 沖突(conflicts)。 這時候就需要你修改這些文件來人肉合並這些 沖突(conflicts) 了。改完之后,你需要執行如下命令以將它們標記為合並成功:

git add

在合並改動之前,也可以使用如下命令查看:

git diff<source_branch><target_branch>

5.3.標記

在軟件發布時創建標簽,是被推薦的。這是個舊有概念,在 SVN 中也有。可以執行如下命令以創建一個叫做 1.0.0的標簽:

git tag 1.0.0

6.工作流與規范化

在工作中,用一個分支來處理開發、測試、發布、線上hotfix等等流程是難以控制的:項目上線前你只想讓其他人提交一個小修改,結果fetch下來的是另一個人為下次上線提交上來的幾百個文件修改。

這里介紹利用git分支的特性避免這種情況的一種做法:

6.1.永久分支

首先,git遠程版本庫有兩個永久分支,master與develop。

develop分支包含開發過程中最新的提交變更。有人會稱之為“集成分支”。該分支是自動化每日構建的代碼源。

當develop分支上的源碼到達一個穩定的狀態時,就可以發布版本。所有develop上的變更都應該以某種方式合並回master分支,並且使用發布版本號打上標簽。

每次有變化被合並到master分支時,這就是一次新的產品版本發布。

6.2.臨時分支

臨時分支是開發或者發布過程中被創建、一段時間后再刪掉的分支,同一時間內可能會有多個臨時分支在並行工作。

6.2.1.feature

作用:開發新的功能
分支來源:develop
分支結束時合並到:develop

特 性分支(有時也被稱作topic分支)是用來為下一發布版本開發新特性。當開始開發一個特性的時候,該特性會成為哪個發布版本的一部分,往往還不知道。特 性分支的重點是,只要特性還在開發,該分支就會一直存在,不過它最終會被合並回develop分支(將該特性加入到發布版本中),或者被丟棄(如果試驗的 結果令人失望)。

特性分支往往只存在於開發者的本地倉庫中。

6.2.2.release

作用:准備發布新版本
可能的分支來源:develop
分支結束時合並到:develop和master

發布分支為准備新的產品版本發布做支持。它允許你在最后時刻檢查所有的細節。此外,它還允許你修復小bug以及准備版本發布的元數據(例如版本號,構建日期等等)。在發布分支做這些事情之后,develop分支就會顯得比較干凈,也方便為下一大版本發布接受特性。

從 develop分支創建發布分支的時間通常是develop分支(差不多)能反映新版本所期望狀態的時候。至少說,這是時候版本發布所計划的特性都已經合 並回了develop分支。而未來其它版本發布計划的特性則不應該合並,它們必須等到當前的版本分支創建好之后才能合並。

正是在發布分支創建的時候,對應的版本發布才獲得一個版本號——不能更早。在該時刻之前,develop分支反映的是“下一版本”的相關變更,但不知道這“下一版本”到底會成為0.3還是1.0,直到發布分支被創建。版本號是在發布分支創建時,基於項目版本號規則確定的。

6.2.3.hotfix

作用:修復發行版bug
分支來源:master
分支結束時合並到:develop和master

熱 補丁分支和發布分支十分類似,它的目的也是發布一個新的產品版本,盡管是不在計划中的版本發布。當產品版本發現未預期的問題的時候,就需要理解着手處理, 這個時候就要用到熱補丁分支。當產品版本的重大bug需要立即解決的時候,我們從對應版本的標簽創建出一個熱補丁分支。

使用熱補丁分支的主要作用是(develop分支上的)團隊成員可以繼續工作,而另外的人可以在熱補丁分支上進行快速的產品bug修復。

6.2.4.流程圖

。

6.3.gitlab與code review

在了解如何review之前先明確幾個觀點:

1、master分支中的任何版本都認為是可以立即部署的
2、每一次master分支的變更都來自於其它分支向master的合並操作。
3、對master的修改需要review。

借助於gitlab的merge request機制,與上面說的工作流程,我們可以在release分支正式合並到master分支之前建立merge request,在其他人review完成這次合並之后再正式進行合並。

6.3.1.如何review

1、將需要合並到master的分支push到gitlab。
2、進入工程-merge request -create new merge request
3、選擇源分支、目標分支,確定。
4、review負責人進入merge request,確認沒有問題之后選擇Auto Merge(或者手動在本地合並之后再push到gitlab),並關閉這個merge request,完成。
5、如果發現問題那么在有問題的行下注釋,並提醒request的發起人及時修改。

6.4.git flow

git flow是git的輔助工具,實質上是一些分支-合並的腳本集合,使用git flow可以更輕松的完成對各種特性分支的操作。

安裝:

apt-get install git-flow

將git庫轉換為git-flow庫:

git flow init

實質上這一步只是為git flow中的幾個特性分支命名。

開始一個新功能:

git flow feature start xxxx

提交這個功能到遠程庫:

git flow feature publish xxxx

完成功能,合並到develop:

git flow feature finish xxxx

記得刪除遠程倉庫里的分支:

git push origin :xxxx

release,hotfix與之類似,唯一的一點區別:hotfix目前沒有publish功能,所以提交遠程倉庫的這一步要改成:

git push origin hotfix/xxxx:hotfix/xxxx

注意:
git flow只是在本地執行分支/合並操作的腳本,不是一個流程管理工具。

 

7.更進一步

幾個常用命令:
git reset
A). –hard:重設(reset) index和working directory,自從以來在working directory中的任何改變都被丟棄,並把HEAD指向。
B). –soft:index和working directory中的內容不作任何改變,僅僅把HEAD指向。這個模式的效果是,執行完畢后,自 從以來的所有改變都會顯示在git status的”Changes to be committed”中。
C). –mixed:僅reset index,但是不reset working directory。這個模式是默認模式,即當不顯示告知git reset模式時,會使用mixed模式。

**git checkout **
-b 簽出並創建分支
-t 簽出並追蹤遠程分支

**git rebase **
合並/修改提交

git remote -av

顯示所有遠程倉庫

git push -u

設置分支對應的遠程倉庫

8.參考資料

    1. git-the simple guide
    2. 《Pro Git》
    3. A successful git branching model
    4. Github-flow

 


免責聲明!

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



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