Git flow是最先產生, 也是獲得廣深採用的的一種工做流程, 他的分支管理策略很是值得借鑑, 很大程度上避免了Git分支管理的混亂.
git
用於正式發佈, 應該是被鎖定的, 不能作此分支上作任何的修改. 一直保持處於Production-Ready狀態.bash
主開發分支, 用於平常開發, 包含全部要發佈到下一個Release的代碼, 主要用來合併與其餘分支, 好比feature分支. 建立develop分支測試
git checkout -b develop master
將develop分支合併到master分支fetch
# 切換到master分支 git checkout master # 對develop分支進行合併 git merge --no-ff develop
在develop分支上建立, 開發完成後, 再併入develop. 建立一個功能分支:url
git checkout -b feature-abc develop
開發完成後, 合併到develop分支spa
git checkout develop git merge --no-ff feature-abc
關於分支合併, 經常使用的命令有git merge和git rebase, 後面會給出詳細說明指針
刪除feature分支code
git branch -d feature-abc
在發佈正式版本以前(合併到master分支以前), 須要一個預發佈分支進行測試.
預發佈分支是在develop分支上建立出來, 預發佈結束之後, 必須合併進develop和master分支.
建立一個預發佈分支orm
git checkout -b release-0.1 develop
測試後, 合併到master索引
git checkout master git merge --no-ff release-0.1 # 對合並生成的新節點,作一個標籤 git tag -a 0.1
再合併到develop分支
git checkout develop git merge --no-ff release-0.1
最後, 刪除預發佈分支
git branch -d release-0.1
主要是用來修正線上bug. 補丁分支在master分支上建立, 開發完成後, 再合併進master和develop分支.
建立一個補丁分支
git checkout -b fixbug-0.1 master
開發結束後, 合併到master分支
git checkout master git merge --no-ff fixbug-0.1 git tag -a 0.1.1
再合併到develop分支
git checkout develop git merge --no-ff fixbug-0.1
刪除分支
git branch -d fixbug-0.1
Workspace:工做區
Index / Stage:暫存區
Repository:倉庫區(或本地倉庫)
Remote:遠程倉庫
# 拉取遠程倉庫主幹版本代碼 git clone git@x.x.x.x:xxxxx.git xxxx # 拉取遠程倉庫dev分支代碼 git clone -b dev git@x.x.x.x:xxxxx.git xxxx
# 顯示當前的Git配置 git config --list # 編輯Git配置文件 git config -e [--global] # 設置提交代碼時的用戶信息 git config [--global] user.name "[name]" git config [--global] user.email "[email address]"
# 添加指定文件到暫存區 git add [file1] [file2] ... # 添加指定目錄到暫存區,包括子目錄 git add [dir] # 添加當前目錄的全部文件到暫存區 git add . # 添加每一個變化前,都會要求確認 # 對於同一個文件的多處變化,能夠實現分次提交 git add -p # 刪除工做區文件,而且將此次刪除放入暫存區 git rm [file1] [file2] ... # 中止追蹤指定文件,但該文件會保留在工做區 git rm --cached [file] # 更名文件,而且將這個更名放入暫存區 git mv [file-original] [file-renamed]
# 提交暫存區到倉庫區 git commit -m [message] # 提交暫存區的指定文件到倉庫區 git commit [file1] [file2] ... -m [message] # 提交工做區自上次commit以後的變化,直接到倉庫區 git commit -a # 提交時顯示全部diff信息 git commit -v # 使用一次新的commit,替代上一次提交 # 若是代碼沒有任何新變化,則用來改寫上一次commit的提交信息 git commit --amend -m [message]
# 列出全部本地分支 git branch # 列出全部遠程分支 git branch -r # 列出全部本地分支和遠程分支 git branch -a # 與遠程倉庫同步本地分支索引 git fetch -p # 新建一個分支,但依然停留在當前分支 git branch [branch-name] # 新建一個分支,並切換到該分支 git checkout -b [branch] # 新建一個分支,指向指定commit git branch [branch] [commit] # 新建一個分支,與指定的遠程分支創建追蹤關係 git branch --track [branch] [remote-branch] # 切換到指定分支,並更新工做區 git checkout [branch-name] # 切換到上一個分支 git checkout - # 創建追蹤關係,在現有分支與指定的遠程分支之間 git branch --set-upstream [branch] [remote-branch] # 合併指定分支到當前分支 git merge [branch] # 刪除分支 git branch -d [branch-name] # 刪除遠程分支 git push origin --delete [branch-name] git branch -dr [remote/branch]
# 下載遠程倉庫的全部變更 git fetch [remote] # 顯示全部遠程倉庫 git remote -v # 顯示某個遠程倉庫的信息 git remote show [remote] # 增長一個新的遠程倉庫,並命名 git remote add [shortname] [url] # 取回遠程倉庫的變化,並與本地分支合併 git pull [remote] [branch] # 上傳本地指定分支到遠程倉庫 git push [remote] [branch] # 強行推送當前分支到遠程倉庫,即便有衝突 git push [remote] --force # 推送全部分支到遠程倉庫 git push [remote] --all
# 恢復暫存區的指定文件到工做區 git checkout [file] # 恢復某個commit的指定文件到暫存區和工做區 git checkout [commit] [file] # 恢復暫存區的全部文件到工做區 git checkout . # 重置暫存區的指定文件,與上一次commit保持一致,但工做區不變 git reset [file] # 重置暫存區與工做區,與上一次commit保持一致 git reset --hard # 重置當前分支的指針爲指定commit,同時重置暫存區,但工做區不變 git reset [commit] # 重置當前分支的HEAD爲指定commit,同時重置暫存區和工做區,與指定commit一致 git reset --hard [commit]
# 顯示有變動的文件 git status # 顯示當前分支的版本歷史 git log # 顯示commit歷史,以及每次commit發生變動的文件 git log --stat # 顯示某個commit以後的全部變更,每一個commit佔據一行 git log [tag] HEAD --pretty=format:%s # 顯示某個commit以後的全部變更,其"提交說明"必須符合搜索條件 git log [tag] HEAD --grep feature # 顯示某個文件的版本歷史,包括文件更名 git log --follow [file] git whatchanged [file] # 顯示過去5次提交 git log -5 --pretty --oneline # 顯示暫存區和工做區的差別 git diff # 顯示暫存區和上一個commit的差別 git diff --cached [file] # 顯示工做區與當前分支最新commit之間的差別 git diff HEAD # 顯示兩次提交之間的差別 git diff [first-branch]...[second-branch] # 顯示當前分支的最近幾回提交 git reflog
merge 是一個合併操做,會將兩個分支的修改合併在一塊兒,默認操做的狀況下會提交合並中修改的內容.
merge 的提交歷史忠實地記錄了實際發生過什麼,關注點在真實的提交歷史上面
rebase 並無進行合併操做,只是提取了當前分支的修改,將其複製在了目標分支的最新提交後面
rebase 的提交歷史反映了項目過程當中發生了什麼,關注點在開發過程上面
與遠程倉庫同步時,使用 pull 命令默認進行了 git fetch + git merge 兩個操做,能夠經過加上 --rebase 命令將 fetch 後的 merge 操做改成 rebase 操做
merge 碰見衝突後會直接中止,等待手動解決衝突並從新提交 commit 後,才能再次 merge
rebase 碰見衝突後會暫停當前操做,開發者能夠選擇手動解決衝突,而後 git rebase --continue 繼續,或者 --skip 跳過(注意此操做中當前分支的修改會直接覆蓋目標分支的衝突部分),亦或者 --abort 直接中止該次 rebase 操做
rebase 主要是爲是將提交約線圖平坦化. rebase 是『危險行爲』,建議你足夠熟悉 git 時才這麼作.
默認狀況下, git執行的是"快進式合併"(fast-forward merge), 這種模式, 刪除分支後, 會丟掉分支信息. --no-ff的做用是禁用fast-forward, 這樣git會在merge時生成一個新的commit, 爲了保證版本演進的清晰,咱們但願採用這種作法。