git學(xué)習(xí)及分支管理策略

git分支使用的壞習(xí)慣

最近使用git提交代碼發(fā)現(xiàn)大家的方式都不一樣,自己在使用中也遇到了一些問題,導(dǎo)致代碼危險。具體描述一下就是:
1.剛開始創(chuàng)建本地b_28分支與遠程b_28對應(yīng)。在此基礎(chǔ)上,我自己改一個bug就基于這個又拉取了本地分支b_bug,一直在這個本地分支上修改,這個b_bug也一直沒有關(guān)聯(lián)任何遠程代碼。
2.后來遠程b_featureA分支(原來是和b_28一樣的)做了些版本小修改。
3.我不明就里的,本地又checkout了一個b_featureA,還把這些修改merge到了自己的b_bug。
4.管理員讓我提交自己bug的修復(fù)。我將b_bug merge到本地b_28,然后先拉了origin b_28的更新,還好本地沒沖突,然后push到了遠端origin b_28。
5.遠端分支的話,管理員b_featureA開發(fā)完了,要merge到b_28,并以后要在b_28基礎(chǔ)上開發(fā)

其實這就有問題了,本來是用大家最新提交后的origin b_featureA去merge到origin b_28,但是由于我之前push到上面的代碼包含了不必要的對origin b_featureA拉取,導(dǎo)致這個提交不安全。(事實上由于我在第3步之后又將b_bug中一個文件K恢復(fù)到了b_28版本,導(dǎo)致這個更新丟失了。這次遠端merge的時候,K竟然還是未改的,b_featureA對它的改動并沒有merge成功,但也沒有提示,還好最后檢查了。其實要是我沒有恢復(fù)過這個K也就沒事了)
因此,我犯了一個不必要的錯誤,要保證本地分支的parent只有一個,不要隨便merge別的分支。
然后對于分支的使用原則,問了些人,大家習(xí)慣不一樣,這幾找了幾個列子,想分清楚集中使用方法。


大家怎么用

主要關(guān)注功能分支:
我覺得可能不同的項目或者不同習(xí)慣的人需要不同的分支策略,這些沒有必要非要按照某種規(guī)則去遵守。
一、阮一峰:Git分支管理策略 重點推薦,簡單全面
1.創(chuàng)建一個功能分支:

git checkout -b feature-x develop

2.開發(fā)完成后,將功能分支合并到develop分支:

git checkout develop
git merge --no-ff feature-x

3.刪除feature分支:

git branch -d feature-x

二、這個跟上面的是一樣的方法,還有全面的命令,總結(jié)的很好:git使用規(guī)范
三、 這個稍微有點不一樣:Git 問題, 一個 master, 多個新功能分支, 怎樣有序地合并和提交?
git支持很多種工作流程,我們采用的一般是這樣,遠程創(chuàng)建一個主分支,本地每人創(chuàng)建功能分支,日常工作流程如下:
1.去自己的工作分支

$ git checkout work

2.工作
3.提交工作分支的修改

$ git commit -a

4.回到主分支

$ git checkout master

5.獲取遠程最新的修改,此時不會產(chǎn)生沖突

$ git pull

6.回到工作分支

$ git checkout work

7.用rebase合并主干的修改,如果有沖突在此時解決

$ git rebase master // 將改變當前工作分支的提交歷史,rebase使得master上的更改在work上重演一遍

8.回到主分支

$ git checkout master

9.合并工作分支的修改,此時不會產(chǎn)生沖突。

$ git merge work

10.提交到遠程主干

$ git push

這樣做的好處是,遠程主干上的歷史永遠是線性的。每個人在本地分支解決沖突,不會在主干上產(chǎn)生沖突。
注意衍合rebase的使用:分支的衍合
簡單介紹rebase的:git rebase簡介(基本篇)
Attention:一旦分支中的提交對象發(fā)布到公共倉庫,就千萬不要對該分支進行衍合操作。
如果你遵循這條金科玉律,就不會出差錯。否則,人民群眾會仇恨你,你的朋友和家人也會嘲笑你,唾棄你

四、一個小團隊的使用:請推薦一個適合4-6人小團隊的git代碼管理模式?
整體項目分為master和develop兩個分支,master主要用來發(fā)布網(wǎng)站使用.develop主要是用來分開使用.
1.平時每個人開發(fā)的時候,從develop中clone一下并創(chuàng)建一個開發(fā)者自己的分支,如zhang.(再有新加入者的時候,類似同樣的方法分支另起一個名字li.).** Q:相當于每個開發(fā)者有一個自己的遠程分支?按照人來確立分支而不是按照功能分支 **
2.當開發(fā)工作完成后,提交本地倉庫并git push到自己的分支.
3.最后先將develop合并到自己的分支(開發(fā)期間可能被開發(fā)者進行過修改),以確保合并成功.
4.合并無誤后,再將當前合并后的zhang分支合并到develop分支中.(注:這里的合并操作先是在本地分支合并.然后再合并到遠程分支.有點多操作一步).
5.到最后一天工作結(jié)束后再將develop合并到master分支,通過master上線運行.
另外對于線上環(huán)境有緊急bug要修改的時候.再從master里創(chuàng)建一個分支.獨立維護.結(jié)束后,再分別同步master和develop兩個分支.

** 五、我打算用這個方式了,感覺跟第三個很類似:3.2 Git 分支 - 分支的新建與合并**
讓我們來看一個簡單的分支新建與分支合并的例子,實際工作中你可能會用到類似的工作流。 你將經(jīng)歷如下步驟:
1.開發(fā)某個網(wǎng)站。
2.為實現(xiàn)某個新的需求,創(chuàng)建一個分支。
3.在這個分支上開展工作。
正在此時,你突然接到一個電話說有個很嚴重的問題需要緊急修補。 你將按照如下方式來處理:
1.切換到你的線上分支(production branch)。
2.為這個緊急任務(wù)新建一個分支,并在其中修復(fù)它。
3.在測試通過之后,切換回線上分支,然后合并這個修補分支,最后將改動推送到線上分支。
4.切換回你最初工作的分支上,繼續(xù)工作。

我認為的使用方式,還沒有驗證過不知道是不是好用:
比如有兩個相互獨立的任務(wù)featureA和featureB,簡單點,他們都是從origin/dev拉過來開發(fā)。
第一種:

  1. 分別建立本地分支

$ git branch b_featureA origin/dev //新建本地分支featureA --關(guān)聯(lián)遠程分支dev
$ git branch b_featureB origin/dev //新建本地分支featureB --關(guān)聯(lián)遠程分支dev

  1. featureA和featureB在各自的分支上工作

  2. 最后修改完,先pull遠端的代碼,可能會有沖突,此時

$ git stash // 先暫存本地修改
$ git pull // 再拉取
$ git stash pop stash@{0} // 還原暫存區(qū)的內(nèi)容,并解決沖突

  1. 解決沖突后

$ git push origin dev

  1. 如果本地分支featureA和本地分支featureB沒用了,可以刪除

這種方法沒有一個比較穩(wěn)定的本地分支。

第二種:
1.新建本地local_dev --關(guān)聯(lián)遠程dev

$ git branch local_dev origin/dev

2.基于本地的開發(fā)分支local_dev 創(chuàng)建兩個功能分支,它們不關(guān)聯(lián)任何遠程分支

$ git branch b_featureA
$ git branch b_featureB

3.分別在featureA和featureB在各自的分支上工作

4.featureA開發(fā)完畢,切回到local_dev,它pull最新代碼,此時不會有沖突。然后兩種情況:
方法一:將最新的更改merge到local_dev,有可能沖突,也有rebase的,不熟悉先不用了。
沒有沖突工作區(qū)也干凈后,push到遠端。刪除本地featureA。
如果有暫時不想提的,可以stash起來,先不刪除,然后進行后續(xù)開發(fā)。

方法二:再復(fù)雜一點,切回到featureA,將local_dev的更新merge過來,沖突在此處解決。
都提交后,切回到local_dev,將featureA的更新merge過來,此時不會再有沖突。
local_dev推送到遠端。

方法三:我沒想到,一個同事說的,切回到featureA,將origin/dev的更新merge過來,就是直接將遠端分支的更改merge過來,有沖突就在此處解決。然后都開發(fā)完畢后,切回到local_dev,將featureA的更新merge過來,然后將local_dev推送到遠端。比方法二少一步merge,然后好像也沒什么大的缺點。
不過還沒用過直接將遠程分支merge到本地這種未對應(yīng)遠程分支的分支上。而且,經(jīng)常看到這樣的忠告:

不要用git pull,用git fetch和git merge代替它。

5.featureB同上

我之前是用的最復(fù)雜的第二種的方法二。好處是沖突都是在本地最末端的分支上,和其他功能都不會相互影響,就是操作太麻煩了。
打算采用上面的三,期待有更好的方法。


一些常用命令

基本命令

$ git remote add origin git@github.com:michaelliao/learngit.git // 將本地的git目錄和遠程建好的git目錄關(guān)聯(lián)
$ git add . // 添加所有文件到git版本控制,注意不是git stash
$ git commit -m "commit log" // 提交修改,必須要加注釋
$ git checkout -b story remotes/origin/story // 在本地創(chuàng)建story分支并track,可以pull和push
//恢復(fù)版本
$ git checkout -- readme.txt // 把readme.txt文件在工作區(qū)的修改全部撤銷,還未添加到暫存區(qū)
$ git reset HEAD readme.txt // 已經(jīng)add,還沒有commit,先用這句unstage,在用上一句
// 如果已經(jīng)commit
$ git log // 查看提交記錄,確定恢復(fù)到哪個版本
$ git log -p // 查看詳細提交記錄
$ git reset --hard HEAD^ // 恢復(fù)到上一個版本,因為HEAD指的是當期版本,HEAD是上一個,HEAD^是上上個,其余的可以用版本編號的前幾位來恢復(fù)
$ git reset --hard 3628164 // 前幾位來恢復(fù),只要這個號碼能唯一確定一個版本就可以
$ git push -u origin b_28 // 將本地修改的b_28推送到遠端b_28,加上了-u參數(shù),Git不但會把本地的分支內(nèi)容推送的遠程新的分支,還會把本地的分支和遠程的分支關(guān)聯(lián)起來,在以后的推送或者拉取時就可以簡化命令。第一次推送分支的所有內(nèi)容,以后就可以用git push origin b_28了
$ git branch -d feature // 刪除feature分支
$ git branch -a // 加上-a參數(shù)可以查看遠程分支,遠程分支會用紅色表示出來
$ git branch -vv // git branch -vv(兩個v),就能夠看到本地分支跟蹤的遠程分支。
$ git merge --no-ff develop // 默認情況下,Git執(zhí)行"快進式合并"(fast-farward merge)加上這個參數(shù)就是非快進式合并
$ git push origin :branch_you_want_to_delete // 刪除遠程的某個分支,注意冒號前面有個空格,慎用

跟蹤遠程分支
從遠程分支 checkout 出來的本地分支,稱為 跟蹤分支 (tracking branch)。跟蹤分支是一種和某個遠程分支有直接聯(lián)系的本地分支。在跟蹤分支里輸入 git push,Git 會自行推斷應(yīng)該向哪個服務(wù)器的哪個分支推送數(shù)據(jù)。同樣,在這些分支里運行 git pull 會獲取所有遠程索引,并把它們的數(shù)據(jù)都合并到本地分支中來。
在克隆倉庫時,Git 通常會自動創(chuàng)建一個名為 master 的分支來跟蹤 origin/master。這正是 git push
和 git pull 一開始就能正常工作的原因。當然,你可以隨心所欲地設(shè)定為其它跟蹤分支,比如 origin
上除了 master 之外的其它分支。剛才我們已經(jīng)看到了這樣的一個例子:git checkout -b [分支名] [遠程名]/[分支名]。如果你有 1.6.2 以上版本的 Git,還可以用 --track
選項簡化:
$ git checkout --track origin/serverfixBranch //serverfix set up to track remote branch serverfix from origin.Switched to a new branch 'serverfix'

要為本地分支設(shè)定不同于遠程分支的名字,只需在第一個版本的命令里換個名字:
$ git checkout -b sf origin/serverfixBranch //sf set up to track remote branch serverfix from origin.Switched to a new branch 'sf'

git本地新建一個分支后,如果沒有做遠程分支關(guān)聯(lián), git 會在git pull, git push操作中提示你顯示的添加關(guān)聯(lián)。你只要沒有顯示指定,git pull的時候就提示“no tracking information”,則說明本地分支和遠程分支的鏈接關(guān)系沒有創(chuàng)建。如果新建分支的時候沒有指定,隨后再指定本地dev分支與遠程origin/dev分支的鏈接,可以用下面的命令

$ git branch --set-upstream dev origin/dev

工作區(qū)域暫存

$git stash
$ git stash list
$ git stash apply
$ git stash drop stash@{0}
$ git stash pop //來重新應(yīng)用儲藏,同時立刻將其從堆棧中移走。


學(xué)習(xí)參考資料:看了這些就夠了

1.Git常用操作和技巧
2.git - 簡明指南
3.Pro Git簡體中文版
4.廖雪峰 簡明git教程
5.Git Commands and Best Practices Cheat Sheet

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內(nèi)容