git-flow實踐

git-flow 操作實踐

安裝

brew install git-flow

init

$ git flow init

Initialized empty Git repository in ~/project/.git/
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []

這時會在當前目錄執(zhí)行git init操作. 并且生成4個分支名字, 并且默認在develop分支上, develop分支就是我們主要工作的地方.

$ git branch
* develop
master

我們除了要把master分支推到遠端倉庫, develop同樣也要推到遠端倉庫 git push origin develop

Feature branches

開始一個新功能添加, 或者是一般bug修復, 或者是其他功能. 我們需要開一個feature分支. 我們在本地的主要工作都是要開feature分支完成的. ** 不要在develop 分支上開發(fā). **

$ git flow feature start authentication
Switched to a new branch 'feature/authentication'

Summary of actions:
- A new branch 'feature/authentication' was created, based on 'develop'
- You are now on branch 'feature/authentication'

Now, start committing on your feature. When done, use:

    git flow feature finish authentication

然后你可以做自己的修改了, 完成后, 需要將feature合并回develop分支.

$ git flow feature finish authentication
Switched to branch 'develop'
Updating 9060376..00bafe4
Fast-forward
authentication.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 authentication.txt
Deleted branch feature/authentication (was 00bafe4).

Summary of actions:
- The feature branch 'feature/authentication' was merged into 'develop'
- Feature branch 'feature/authentication' has been removed
- You are now on branch 'develop'

多個開發(fā)者進行開發(fā)時, 會出現每個人本地的develop分支不一致的情況, 這樣在每次拉取遠端develop分支時, 會出現很多merge提交. 關于這個問題, 在最后的減少以及消滅無用的merge commit章節(jié)中說明.

releases

在沒有使用git-flow工具時, 發(fā)布是一件很繁瑣的事情, 要保留一個用于releases的分支, 打tag等. 使用git-flow可以用簡單命令解決.

$ git flow release start 0.1.0
Switched to a new branch 'release/0.1.0'

Summary of actions:
- A new branch 'release/0.1.0' was created, based on 'develop'
- You are now on branch 'release/0.1.0'

Follow-up actions:
- Bump the version number now!
- Start committing last-minute fixes in preparing your release
- When done, run:

    git flow release finish '0.1.0' 

你將開始一個發(fā)布, 一般可以直接finishi

$ git flow release finish 0.1.0
Switched to branch 'master'
Merge made by the 'recursive' strategy.
authentication.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 authentication.txt
Deleted branch release/0.1.0 (was 1b26f7c).

Summary of actions:
- Latest objects have been fetched from 'origin'
- Release branch has been merged into 'master'
- The release was tagged '0.1.0'
- Release branch has been back-merged into 'develop'
- Release branch 'release/0.1.0' has been deleted

這時develop分支回合并到master分支, 并打tag. 之后我們只要把master和tag都推到遠端倉庫即可.

Hotfixing production code

緊急bug修復, 在已經發(fā)布的代碼上更正. 會從master開出hotfix分支, 然后合并回master, 也會合并回develop.

$ git flow hotfix start assets
Switched to a new branch 'hotfix/assets'

Summary of actions:
- A new branch 'hotfix/assets' was created, based on 'master'
- You are now on branch 'hotfix/assets'

Follow-up actions:
- Bump the version number now!
- Start committing your hot fixes
- When done, run:

    git flow hotfix finish 'assets'

然后修改問題, 之后提交:

$ git flow hotfix finish assets
Switched to branch 'master'
Merge made by the 'recursive' strategy.
assets.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 assets.txt
Switched to branch 'develop'
Merge made by the 'recursive' strategy.
assets.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 assets.txt
Deleted branch hotfix/assets (was 08edb94).

Summary of actions:
- Latest objects have been fetched from 'origin'
- Hotfix branch has been merged into 'master'
- The hotfix was tagged '0.1.1'
- Hotfix branch has been back-merged into 'develop'
- Hotfix branch 'hotfix/assets' has been deleted

在往下閱讀之前, 你最好將以上的命令實踐一遍, 感受git-flow的操作與分支流向. 推薦SourceTree來跟蹤變化.

減少以及消滅無用的merge commit

如果是一個人使用git-flow, 你會發(fā)現你所有的commit以及commit log都是有意義的. 你所有的更改, feature合并都是有明確記錄的.

但是在多人使用下, 大家各自在本地開發(fā), 往develop分支上merge, 那么就會出現每個人的develop分支不一致. 那么當一個人把自己的develop分支push到遠端時, 其他人pull的時候就會出現分支合并, 產生 "Merge branch 'develop' of remote into develop" 的類似commit.

很多時候, 合并時沒有沖突, 自動完成. 這種merge產生的commit是沒有意義的, 而且會讓分支看起來混亂.

按照以下規(guī)則可以減少甚至消除這種無意義的commit:

  1. 本地在往develop分支進行合并時, ** 先在develop上執(zhí)行git pull **, 當你沒有在本地對develop分支有commit時, 執(zhí)行git pull是會發(fā)生Fast-forward合并的, 這種默認并不產生commit.
  2. 將feature合并到develop上.
  3. push develop. 將你的修改提交到遠端.

多數時候, 如果多個人分開執(zhí)行以上操作, 是不會有問題的.

如果多個人同時進行以上操作, 那么在進行第三步的時候, 是push不上去的, 需要先pull, 那么又會產生所謂的無意義commit, 該怎么辦呢:

這時不要用git pull來拉取更改, 改為使用:

git pull --rebase

這個命令會將遠端代develop拉下來, 然后從本地develop上跟遠端develop分叉的地方開始, 將本地的commit一個個應用到遠端develop的末端, 使之成為一條直線, 從而沒有了merge commit.

關于沖突, rebase的時候也會有沖突:

比如遠端 a->b->c

你的 a->b->d

進行rebase之后 a->b->c->e, 其中e的更改內容和log就是你的d, 如果有沖突, 沖突的修改也是提現在e

修改完沖突, 我們會進行commit提交沖突修改. 不要使用git commit -m, 請直接使用git commit, git會識別你這是一個沖突提交.

當然, 操作的疏忽依然會產生無意義的commit, 但這并不致命, 注意就好.

如果真的要消滅無意義commit: 在你git pull之后發(fā)現自動合并了, 那么用git reset --hard [剛剛你本地的提交commit version]進行本地版本回滾, 然后再git pull --rebase

我對rebase的理解也不是很多, 以上只是應用中的使用體會, 肯定還存在很多沒有想到的情況和處理不當的地方, 請大家多提出來指正, 共同討論.

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末酥馍,一起剝皮案震驚了整個濱河市搂蜓,隨后出現的幾起案子分冈,更是在濱河造成了極大的恐慌,老刑警劉巖臼氨,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異芭届,居然都是意外死亡储矩,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門褂乍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來持隧,“玉大人,你說我怎么就攤上這事逃片∮吆” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵题诵,是天一觀的道長洁仗。 經常有香客問我,道長性锭,這世上最難降的妖魔是什么赠潦? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮草冈,結果婚禮上她奥,老公的妹妹穿的比我還像新娘瓮增。我一直安慰自己,他們只是感情好哩俭,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布绷跑。 她就那樣靜靜地躺著,像睡著了一般凡资。 火紅的嫁衣襯著肌膚如雪砸捏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天隙赁,我揣著相機與錄音垦藏,去河邊找鬼。 笑死伞访,一個胖子當著我的面吹牛掂骏,可吹牛的內容都是我干的。 我是一名探鬼主播厚掷,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼弟灼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冒黑?” 一聲冷哼從身側響起田绑,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薛闪,沒想到半個月后辛馆,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡豁延,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年昙篙,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诱咏。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡苔可,死狀恐怖,靈堂內的尸體忽然破棺而出袋狞,到底是詐尸還是另有隱情焚辅,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布苟鸯,位于F島的核電站同蜻,受9級特大地震影響,放射性物質發(fā)生泄漏早处。R本人自食惡果不足惜湾蔓,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砌梆。 院中可真熱鬧默责,春花似錦贬循、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至媒熊,卻和暖如春奇适,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泛释。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工滤愕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留温算,地道東北人怜校。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像注竿,于是被迫代替她去往敵國和親茄茁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • 多種多樣的工作流使得在項目中實施Git時變得難以選擇巩割。這份教程提供了一個出發(fā)點裙顽,調查企業(yè)團隊最常見的Git工作流。...
    JSErik閱讀 4,372評論 2 8
  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,456評論 1 26
  • 此文章用于歸納Object的所有方法 在JavaScript中宣谈,object是所有對象的基礎(原型鏈的頂端)愈犹,所以...
    moonburn閱讀 638評論 0 5
  • 一早從夢中醒來,夢里沒有你闻丑,下意識的回憶夢漩怎,試圖找到你的身影,但終究沒有你嗦嗡。 長長的呼吸勋锤,試圖清醒的、毫不惋惜的侥祭、...
    井兒閱讀 148評論 0 0
  • “明天早上5點走叁执,晚上走不安全”,哥哥勸幺爹道矮冬,“沒得事谈宛,開慢點,明天白天熱”胎署,幺爹語氣平和的說吆录,我猜白天熱是一部...
    心理成長小窩閱讀 310評論 1 1