git 分支?

對git不是很熟悉,有個問題要弄清楚一下。

假如遠程倉庫有 dev 和 master 兩個分支,master 作為一個穩定版分支,可用於直接發布產品,日常的開發則 push 到 dev 分支,那我本地是不是要從 dev 分支中創建一個本地分支,然後在這個分支的 push 的動作是默認推到遠程 dev 分支上?可以的話簡單寫一下命令,謝謝


分一二兩點回答,建議都看。

第一點是回答你的問題,第二點是更加全面的了解和其他推薦。

一、遠程倉庫有master和dev分支

1. 克隆代碼

git clone https://github.com/master-dev.git
# 這個git路徑是無效的,示例而已

2. 查看所有分支

git branch --all
# 默認有了dev和master分支,所以會看到如下三個分支
# master[本地主分支] origin/master[遠程主分支] origin/dev[遠程開發分支]
# 新克隆下來的代碼默認master和origin/master是關聯的,也就是他們的代碼保持同步
# 但是origin/dev分支在本地沒有任何的關聯,所以我們無法在那裡開發

3. 創建本地關聯origin/dev的分支

git checkout dev origin/dev
# 創建本地分支dev,並且和遠程origin/dev分支關聯,本地dev分支的初始代碼和遠程的dev分支代碼一樣

4. 切換到dev分支進行開發

git checkout dev # 這個是切換到dev分支,然後就是常規的開發

5. 為了更好的理解,最好繼續看看下文。

二、假設遠程倉庫只有mater分支

1. 克隆代碼

git clone https://github.com/master-dev.git
# 這個git路徑是無效的,示例而已

2. 查看所有分支

git branch --all
# 默認只有master分支,所以會看到如下兩個分支
# master[本地主分支] origin/master[遠程主分支]
# 新克隆下來的代碼默認master和origin/master是關聯的,也就是他們的代碼保持同步

3. 創建本地新的dev分支

git branch dev # 創建本地分支
git branch # 查看分支
# 這是會看到master和dev,而且master上會有一個星號
# 這個時候dev是一個本地分支,遠程倉庫不知道它的存在
# 本地分支可以不同步到遠程倉庫,我們可以在dev開發,然後merge到master,使用master同步代碼,當然也可以同步

4. 發布dev分支

發布dev分支指的是同步dev分支的代碼到遠程伺服器

git push origin dev:dev # 這樣遠程倉庫也有一個dev分支了

5. 在dev分支開發代碼

git checkout dev # 切換到dev分支進行開發
# 開發代碼之後,我們有兩個選擇
# 第一個:如果功能開發完成了,可以合併主分支
git checkout master # 切換到主分支
git merge dev # 把dev分支的更改和master合併
git push # 提交主分支代碼遠程
git checkout dev # 切換到dev遠程分支
git push # 提交dev分支到遠程
# 第二個:如果功能沒有完成,可以直接推送
git push # 提交到dev遠程分支
# 注意:在分支切換之前最好先commit全部的改變,除非你真的知道自己在做什麼

6. 刪除分支

git push origin :dev # 刪除遠程dev分支,危險命令哦
# 下面兩條是刪除本地分支
git checkout master # 切換到master分支
git branch -d dev # 刪除本地dev分支

7. 推薦書籍 progit.pdf

書籍格式和語言:中文、英文、PDF、ePub

下載地址:http://git-scm.com/book

8. 還有不理解的地方可以提問 $_^


寫在前面:

1. 建議使用source tree或者其他的gui工具。

2. 安裝oh-my-zsh

開始回答問題:

最近在看git關於分支的管理,發現可以用git-flow用來管理分支。先貼上項目地址nvie/gitflow · GitHub

git-flow主要有5中分支:master、hotfix、release、develop、feature。

feature分支開始於develop分支,完成以後合併到develop分支。

當完成一定數量feature分支以後,從develop再開一個release分支出來,這些特性將被更行到下一個發布的版本中,之後的feature將不會被合併到release中。

之後在release分支中,只修改bug,然後完成release分支。完成release分支會完成以下三個操作:1、合併release分支到master;2、給master打上版本的標籤;3、release回歸到develop分支。

當發現master上有bug時,開一個hotfix,完成後合併到master分支。

基本的開發流程就是這樣,不清楚的可以看看文檔Gitflow Workflow

PS:source tree中已經集成了git-flow使用感受良好


最近在最新的博客上寫了關於git初學者的系列文章,可以看一下: http://hanfu.space/learning/2015/10/26/git-tutorial-2/


遠程分支upsteam一般由倉庫管理員來維護,merge的許可權也可以設。發布的話不一定是按master來,很多是按穩定的tag來發布的。

網上推薦的工作流一般是用fetch+rebase (相比pull+merge工作流更乾淨,不容易出錯)

比如dev是你的公共開發分支

git checkout dev # 本地切到公共分支
git pull # 將本地的dev更新
git checkout -b bug_101026 # 新建一個主題分支(一個bug,一個功能什麼的)
... # 改動.. commit.. 測試...
git fetch origin # 更新upstream
git rebase origin/dev # 將你的commits移到的末尾
git checkout dev # 切換到公共分支
git pull # 更新公共分支
git rebase bug_101026 # 將你的主題分支加到公共分支的末尾
git push # 推送


我說的不是如何做 而是做什麼 不做什麼

------------------以下是答案---------------

你的問題是要不要 我給出的答案是不要

永遠不要這麼推送 本地和遠程分支名嚴格保持一致

分支名應該能表示兩件事

who 誰負責

what 做什麼

------------------ 以上是答案 ----------------

如果在我的團隊有人非要這麼干 我保證後面會有人拿分支名來猜謎語 本地的分支是謎底 遠端別人看到的是謎面 大家一起猜猜猜

吐槽時間結束 下面是原因

如果不一致 單獨維護映射關係

也就是自己用一套混淆機制增加開發維護成本

不清楚是誰 不清楚做什麼

最後告訴你怎麼做

1 從dev開本地新分支 featurebranch

2 日常工作保證提交到新分支 featurebranch

3 如果需要多人共同開發,推送到遠端 featurebranch

4 開發完畢 將feachbranch合併到dev分支

5 推送dev到遠端,此處應該需要重新拉取dev分支fast forward到最新 或者fetch rebase

6 刪除本地 和 遠端 featurebranch

如果有code review 4、5應該通過merge request來實現

以上各步驟命令 其它答案都有 就不寫了

等你理解問題究竟是什麼 能夠明確思考問題的細節 如何做就自然會浮現

ps 你看到的應該是一套git workflow

pps 這套工作流程在敏捷開發 持續交付中是成本很高的


這裡說比較全:

http://aissues.com/m/book.php?id=31622EF2-11DD-4CFD-9616-9283B202A5BE


不用,master就是團隊的開發測試了,qa測試了。認可的比較穩定的代碼,所以你可以直接從遠程clone下master分支,再從本地master創建你的開發分支開發測試等,等測試差不多了和master合併進行發布,如果不滿意這次發布,公司可以回退的,當然你需要本地master和遠程保持一樣就需要經常pull下別人發布的代碼。


1. 安裝oh-my-zsh

2. git fetch origin 獲取最新版本到本地

3. git branch -a(all的縮略寫法) 查看所有分支,包括本地和遠程

4. git checkout origin/dev (遠程分支) -b dev(本地分支) 新建本地分支並切換過去


推薦閱讀:

TAG:Git | 項目開發 | IT項目管理 |