雙十節(jié)前夕將不同分支間 merge,本地遠(yuǎn)程 rebase 的適用場(chǎng)景進(jìn)行了區(qū)分,真是一件喜事,基本解決了 Git 分支管理上的一系列策略問(wèn)題;
本文就簡(jiǎn)要、集中的陳述一下 Git 分支管理策略;
原則
-
Git の 分支與整合策略;
注意區(qū)分 合并 和 變基;整合的兩種方式:merge(合并),rebase(變基);
注意 git pull 命令,既可以是 git fetch + merge 組合,又可以 git fetch + rebase 組合;
當(dāng)下,我們普遍采用的是 fetch + rebase 組合的 pull; - 在一個(gè)迭代分支上協(xié)作開(kāi)發(fā),采用 rebase,實(shí)際上是本地分支 rebase 遠(yuǎn)程分支;
所產(chǎn)生的 log 整潔有序; - 迭代分支從 dev 分支開(kāi)出;
- 迭代分支應(yīng)經(jīng)常 merge dev(git merge dev);
尤其是在 dev 上 hotfix 的東西在發(fā)布后,要及時(shí)地 merge 到迭代分支上; - 迭代完成后,dev 合并迭代(git merge 0.8d);
- 刪除迭代分支(git branch -d 0.8c);
迭代分支 merge dev 時(shí)出現(xiàn)沖突怎么辦?
- 為了降低沖突概率,請(qǐng)及時(shí) merge dev;
- merge 時(shí)出現(xiàn)沖突,解決沖突
# 確保本地庫(kù)當(dāng)前代碼是你想要的;
git checkout 1.0
git merge dev
# 出現(xiàn)沖突,解決沖突
git add .
git commit -a -m 'merge dev 到 1.0,解決沖突'
git push
如果發(fā)生了不幸:比如你在 commit 之后、push 之前 pull 了,就會(huì)出現(xiàn)麻煩;如果不明白原理,沒(méi)有及時(shí)中止 rebase,而是選擇繼續(xù)解決出現(xiàn)的新問(wèn)題,那么你就 誤入歧途 了。
-
commit 之后、push 之前 pull出現(xiàn)新問(wèn)題的原因分析
由于我們 pull 采用的是 fetch + rebase,fetch 操作沒(méi)有影響(因?yàn)檫h(yuǎn)程 origin 1.0 沒(méi)新 commits),rebase 操作把 merged 過(guò)來(lái)的 dev 上所做的 commits 基于 origin/1.0 又 applying 了一遍。至于為什么會(huì)這樣,還不理解。 -
commit 之后、push 之前 pull出現(xiàn)問(wèn)題后如何解決?
git rebase --abort果斷中止 rebase 即可;
何時(shí)出現(xiàn) diverged 情況?
- 新分支 0.8c 從 dev 開(kāi)出;
- 0.8c 和 dev 各有若干 commits;
- 0.8c:git rebase dev,產(chǎn)生 diverged(和遠(yuǎn)程分支分叉了);
- 解決若干沖突,本地 0.8c 和 dev 指向同一個(gè) commit;
- 再無(wú)法推送到遠(yuǎn)程 0.8c(因?yàn)?diverged);
HEAD detached 如何處理?
- peter 晚上在家 2 次提交(C1和C2):
b26接口和格式化日期,使用同一函數(shù)兩個(gè) commits;并且 push 到 remote; - peter 翌日公司 1次 提交(C3):
添加yii2mod-comment(yii2mod/yii2-comments)
提交前沒(méi)有 pull。 - git pull 后出現(xiàn):
HEAD detached from refs/heads/v0.8(即 HEAD 指向的是 C2,而本地 v0.8 指向的是 C3,雖然本來(lái)她跟蹤的是遠(yuǎn)程 v0.8) - 解決方法
當(dāng)下處于 * (HEAD detached from refs/heads/v0.8) 狀態(tài)(當(dāng)前 HEAD 指向 C2),
git merge v0.8(指向 C2 的 HEAD 將 C3 合并到 HEAD)
git push origin HEAD:v0.8 (將當(dāng)前本地 HEAD 推到遠(yuǎn)程 v0.8)
git pull origin v0.8

使用的 git 命令

merge 之后
When HEAD is detached, commits work like normal, except no named branch gets updated. (You can think of this as an anonymous branch.)
