Git的優(yōu)點(diǎn)
分布式,本地包含遠(yuǎn)程倉(cāng)庫(kù)所有源碼,可以離線操作
便捷的分支功能,可以很方便的進(jìn)行團(tuán)隊(duì)合作和版本控制
Git flow
- Git flow 是前人經(jīng)過(guò)探索總結(jié)出來(lái)的一套Git分支管理規(guī)范和流程,來(lái)保證我們?cè)陂_(kāi)發(fā)過(guò)程少踩一些坑。
首先,項(xiàng)目存在兩個(gè)長(zhǎng)期分支,前者用于存放對(duì)外發(fā)布的版本,任何時(shí)候在這個(gè)分支拿到的,都是穩(wěn)定的分布版;后者用于日常開(kāi)發(fā),存放最新的開(kāi)發(fā)版。

主分支master :
主分支 , 產(chǎn)品的功能全部實(shí)現(xiàn)后 , 最終在master分支對(duì)外發(fā)布;
該分支為只讀唯一分支 , 只能從其他分支(release/hotfix)合并 , 不能在此分支修改;
另外所有在master分支的推送應(yīng)該打標(biāo)簽做記錄,方便追溯;
開(kāi)發(fā)分支develop :
主開(kāi)發(fā)分支 , 基于master分支克??;該分支為只讀唯一分支 , 只能從其他分支合并;
包含所有要發(fā)布到下一個(gè)release的代碼; feature功能分支完成 , 合并到develop(不推送而是merge);
develop拉取release分支 , 提測(cè); release/hotfix 分支上線完畢 , 合并到develop并推送;
其次,項(xiàng)目存在三種短期分支。

功能分支(feature branch):
功能開(kāi)發(fā)分支 , 基于develop分支克隆 ;
功能開(kāi)發(fā)完畢后合到develop分支;主要用來(lái)開(kāi)發(fā)新功能,每個(gè)功能新開(kāi)一個(gè)feature,保證功能的獨(dú)立性;
feature分支可同時(shí)存在多個(gè) , 用于團(tuán)隊(duì)中多個(gè)功能同時(shí)開(kāi)發(fā) , 屬于臨時(shí)分支 , 功能完成后可選刪除;
(未正式上線之前不推送到遠(yuǎn)程中央倉(cāng)庫(kù)!!!)
分支命名: feature/ 開(kāi)頭的為特性分支, 命名規(guī)則: feature/user_module、 feature/cart_module
補(bǔ)丁分支(hotfix branch):
補(bǔ)丁分支 , 基于master分支克隆 , 主要用于對(duì)線上的版本進(jìn)行BUG修復(fù);
修復(fù)完畢后合并到develop/master分支并推送 , 打Tag;
屬于臨時(shí)分支 , 補(bǔ)丁修復(fù)上線后可選刪除;
分支命名: hotfix/ 開(kāi)頭的為修復(fù)分支,它的命名規(guī)則與 feature 分支類似;
預(yù)發(fā)分支(release branch):
測(cè)試分支 , 基于feature分支合并到develop之后 , 從develop分支克隆;
屬于臨時(shí)分支 , 功能上線后可選刪除
主要用于提交給測(cè)試人員進(jìn)行功能測(cè)試 , 測(cè)試過(guò)程中發(fā)現(xiàn)的BUG在本分支進(jìn)行修復(fù) ,
修復(fù)完成上線后合并到develop/master分支并推送(完成功能) , 打Tag;
分支命名: release/ 開(kāi)頭的為修復(fù)分支;
易錯(cuò)操作:
1、feature分支一旦合并到develop后不能再再該feature上修改了,
如果要改的話只能在合并后的develop上拉release進(jìn)行修改,
這就是為什么未正式上線之前不推送到遠(yuǎn)程中央倉(cāng)庫(kù)!!!
2、在release合并到develop分支前,不能把feature2合并到develop,這樣會(huì)造成混亂。
常用命令:
1、 創(chuàng)建功能分支

(develop)$: git checkout -b feature/xxx # 從dev建立特性分支
(feature/xxx)$: blabla # 開(kāi)發(fā)
(feature/xxx)$: git add . #添加到暫存區(qū)
(feature/xxx)$: git commit -m 'blabla' #提交備注
2、功能完成,把功能合并到develop

(feature/xxx)$: git checkout develop # 切換至develop分支
(develop)$: git pull #一定要先更新develop,再去merge代碼
(develop)$: git merge feature/xxx
(develop)$: git push #建議再編輯器里查看沖突文件,解決后再push
git branch -d feature/xxx #功能分支代碼合并到develop后就沒(méi)用了,如果接下來(lái)還要修改問(wèn)題到對(duì)應(yīng)到release分支進(jìn)行修改
3、功能準(zhǔn)備發(fā)布

(develop)$: git checkout -b release/xxx #這個(gè)分支專門(mén)用于發(fā)布前的準(zhǔn)備,包括一些清理工作、全面的測(cè)試、文檔的更新以及任何其他的準(zhǔn)備工作。它與用于功能開(kāi)發(fā)的分支相似,不同之處在于它是專為產(chǎn)品發(fā)布服務(wù)的。
4、發(fā)布完成

(release/xxx )$: git checkout master
(master)$: git merge release-0.1
(master)$: git push
(master)$: git checkout develop
(develop)$: git merge release-0.1
(develop)$: git push
(develop)$: git branch -d release-0.1
發(fā)布分支扮演的角色是功能開(kāi)發(fā)(develop)與官方發(fā)布(master)之間的一個(gè)緩沖。無(wú)論什么時(shí)候你把一些東西合并入master,你都應(yīng)該隨即打上合適的標(biāo)簽。
(master)$: git tag -a Verson1.0 -m"Initial public release" #一般在提交的時(shí)候打標(biāo)簽
(master)$: git push --tags
5、線上bug修復(fù)
線上產(chǎn)生bug,新建hotfix分支進(jìn)行修復(fù),步驟和創(chuàng)建feature分支相同

(master)$: git checkout -b hotfix/xxx
(hotfix/xxx)$: # Fix the bug
(hotfix/xxx)$: git checkout master
(master)$: git merge hotfix/xxx
(master)$: git push
(master)$: git checkout develop
(develop)$: git merge hotfix/xxx
(develop)$: git push
(develop)$: git branch -d hotfix/xxx
Git Flow使用:

初始化:
這個(gè)命令會(huì)進(jìn)行一些默認(rèn)的配置,可以自動(dòng)創(chuàng)建上面介紹的所有分支:master、develop、feature、relase、hotfix等分支。完成后當(dāng)前所在分支就變成 develop. 任何開(kāi)發(fā)都必須從 develop 開(kāi)始
git flow init開(kāi)始新Feature:
git flow feature start some_awesome_feature發(fā)布新特性分支到遠(yuǎn)程服務(wù)器(也就是push到遠(yuǎn)程):
git flow feature publish some_awesome_feature取得其它用戶發(fā)布的新特性分支,并簽出遠(yuǎn)程的變更:
git flow feature pull origin some_awesome_feature完成一個(gè)Feature:
該命令將會(huì)把feature/some_awesome_feature合并到develope分支,然后刪除功能(feature)分支。
git flow feature finish feature/some_awesome_feature開(kāi)始一個(gè)Release:
當(dāng)你的功能點(diǎn)都完成時(shí)(需要發(fā)布新版本了),就基于develop創(chuàng)建一個(gè)發(fā)布(release)分支。
你可以選擇提供一個(gè) [BASE]參數(shù),即提交記錄的 sha-1 hash 值,來(lái)開(kāi)啟動(dòng) release 分支. 這個(gè)提交記錄的 sha-1 hash 值必須是'develop' 分支下的
git flow release start RELEASE [BASE]Publish一個(gè)Release:
git flow release publish RELEASE發(fā)布Release:
別忘了git push --tags,標(biāo)簽打在release分支上
git flow release finish RELEASE開(kāi)始一個(gè)Hotfix:
git flow hotfix start VERSION [BASENAME]發(fā)布一個(gè)Hotfix:
git flow hotfix finish VERSION
Git WorkTree應(yīng)用:
1、應(yīng)用場(chǎng)景:
a)我在 feature 分支開(kāi)發(fā)得多些,但總時(shí)不時(shí)被高優(yōu)先級(jí)的 BUG 打斷需要臨時(shí)去 develop 分一個(gè)分支出來(lái)解 BUG。
b)不同分支依賴的node_module包可能不同,打包發(fā)布時(shí),可能因?yàn)榍袚Q分支但是包沒(méi)有及時(shí)更新(被ignore),導(dǎo)致打包不成功
2、解決方法:git 2.6 以上開(kāi)始提供了 worktree 功能,可以解決這樣的問(wèn)題
3、使用方法:
git worktree add -b <新分支名> <新路徑> <從此分支創(chuàng)建>
git worktree add -b myNewBranch ../testDir master
這樣,原本的倉(cāng)庫(kù)文件夾的同級(jí)目錄下會(huì)出現(xiàn)一個(gè) testDir文件夾。這個(gè)倉(cāng)庫(kù)里只有一個(gè) .git 文件用來(lái)記錄這是主倉(cāng)庫(kù)的一個(gè)工作目錄。
相比于克隆多個(gè)倉(cāng)庫(kù),使用這種方法創(chuàng)建的多個(gè)目錄,有諸多好處:
只有一個(gè)倉(cāng)庫(kù)會(huì)占用版本庫(kù)的空間,其它只占用工作目錄的空間,對(duì)大型項(xiàng)目而言非常節(jié)省空間。
因?yàn)樗泄ぷ髂夸浌蚕硪粋€(gè)倉(cāng)庫(kù),所以一個(gè)更新意味著整個(gè)更新(A 目錄里對(duì)分支做的改動(dòng),B 目錄里切到此分支也是改動(dòng)后的;避免到時(shí)候找不到某個(gè)未推送的改動(dòng)改到了哪個(gè)倉(cāng)庫(kù))
4、刪除方法:
如果要?jiǎng)h除其中一個(gè)工作目錄,直接刪除文件夾即可。隨后使用命令清除多余的已經(jīng)被刪的工作目錄:
git worktree prune
5、本地git樹(shù)清除緩存:
git remote prune origin
我的Git 常用命令:
1、 tag標(biāo)簽
- 顯示所有的tag標(biāo)簽
git tag - 查看某個(gè)版本系列的縮略tag
git tag -l 'v1.0.*' - 查看某個(gè)版本系列的詳細(xì)tag
git show v0.0.6可以看到你commit的內(nèi)容 - 創(chuàng)建標(biāo)簽
git tag -a v1.0.0 -m "內(nèi)容:v1.0.0" - 推送標(biāo)簽
git push origin v1.0.0 - 刪除標(biāo)簽 刪除本地:
git tag -d v1.0.0刪除遠(yuǎn)程:git push origin :refs/tags/v1.0.0
2、 刪除node_modules并清除緩存
- 刪除node_module
rm -rf node_modules - 清除緩存
npm cache clear --force - 重新安裝依賴
npm install --no-shrinkwrap --update-binary
3、 回滾
- 查看提交節(jié)點(diǎn)
git log - 本地強(qiáng)制回滾到某個(gè)節(jié)點(diǎn)
git reset --hard 12asddf123fsd34fsdfdf - 遠(yuǎn)程強(qiáng)制回滾
git push -f
4、git刪除遠(yuǎn)端文件/文件夾(因?yàn)間ithub/gitlab沒(méi)有直接刪除文件夾的操作)
- 先到你需要修改的文件下
- 刪除遠(yuǎn)端對(duì)應(yīng)的文件夾,本地不會(huì)刪除
git rm -r --cached '文件名/文件夾名' -
git commmit -m '提交'、git push...
5、git 開(kāi)啟/關(guān)閉文件大小寫(xiě)鑒別(默認(rèn)關(guān)閉,不推薦一直開(kāi)啟,可以在修改文件需要提交的時(shí)候開(kāi)啟,提交后再關(guān)掉)
- 開(kāi)啟區(qū)分大小寫(xiě):
git config core.ignorecase false - 關(guān)閉區(qū)分大小寫(xiě):
git config core.ignorecase true
6 、修改本地文件名大小寫(xiě)并推送到遠(yuǎn)端(不要跟我說(shuō)你可以直接修改文件夾名字然后push)
舉個(gè)例子:把Add文件夾改成add文件夾,由于window或者在一些開(kāi)發(fā)工具里不支持把Add直接改成同名只是大小寫(xiě)不一樣的文件,所以需要先改成add_,然后在改成add
- 按照上一步的操作打開(kāi)git的區(qū)分大小寫(xiě)
- cd進(jìn)入到需要修改的文件夾的上一級(jí)
- 把
Add文件夾改成add_:git mv Add add_ - 再把
add_文件夾改成add:git mv add_ add -
git commmit -m '提交'、git push...
7 、報(bào)錯(cuò):似乎另外一個(gè) git 進(jìn)程在這個(gè)倉(cāng)庫(kù)中運(yùn)行,例如:'git commit' 命令打開(kāi)了一個(gè)編輯器...
rm -f ./.git/index.lock