本文轉載自:蛋疼的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版本庫的內容,有版本號。
對這三個區域的操作都可以在本地離線完成。
完整一些的狀態圖如下:
查看文件狀態:
git status
文件總共四種狀態:
與git repository一致
與git repository不一致,已緩存
與git repository不一致,未緩存
還未添加到git repository
4.2.遠程版本庫
從遠程更新:
git pull
提交到遠程:
git push
遠程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.參考資料