[英]Merging feature branch based on another feature branch, back to master
與我們團隊的情況一樣,下一個版本的更改需要在當前版本完全測試並合並回 master 之前開始,從那里開始為下一個版本創建一個新分支。
所以我可以基於當前的功能分支創建一個新的功能分支,並在那里開始下一個版本的工作。 問題是,如果人們不記得您實際上還有另一個功能分支或導致合並沖突的其他更改,這有時會變得混亂。
像這樣的東西。 因此,在這種情況下,Feature-1 正在測試中,但出於某種原因,我們不會從這里發布,而 Feature-2 的工作將繼續進行。 但是,請注意在創建 Feature-2 之后發生了一次提交。 所以,如果我錯了,請糾正我,但是如果事實上 Feature-1 不會被發布,那么處理這個問題的一種方法,然后......假設頭部指向 /Feature2,以下是否會從 Feature-1 獲得更改然后一切回到主人?
git merge Feature-1
git push origin Feature-2
git checkout master
git merge Feature-2
git push origin master
如果每個版本有一個“功能分支”,它們就不是功能分支。 (除非您正在進行持續交付,在這種情況下,您只需發布 master。)
功能分支應該是一個單一的功能,最好是一個不會花費很長時間,或者不會與其他代碼混淆的功能。 一旦該功能完成,就應該對其進行測試、合並,並且刪除的分支不再使用。
除非您在不完整的功能分支中明確需要某些東西,否則不要將功能分支從其他功能分支中分支出來。 對於短而清晰的特征分支,這應該很少成為問題。 即便如此,它通常也只是一個錯誤修復或重構。 嘗試僅提取您需要的部分,將其合並,然后繼續前進。
如果您經常發現自己需要從其他功能分支中分支出來,那么您的功能分支做得太多了。
那是你的第一個問題。 如果您正確使用功能分支,這應該是一個罕見的問題。 在一個分支中做太多事情會使一切變得復雜。
下面我們來梳理一下 Git 是如何做分支的。 與其他版本控制系統不同,提交連接到其他提交,而分支只是標簽。 分支沒有自己的生命。 你的情況是這樣的。
G - H - I [feature-2]
/
D - E - F - K [feature-1]
/
A - B - C [master]
扭結完全是概念上的。 我們也可以這樣看。
K [feature-1]
/
D - E - F - G - H - I [feature-2]
/
A - B - C [master]
這樣看應該更清楚feature-2
。 所有master
,大部分feature-1
(未經測試),以及所有feature-2
。 在feature-1
完成之前, feature-1
feature-2
無法完成,這種依賴是不可取的。
如果您在分支上工作並希望保持最新狀態,最簡單的方法是git rebase upstream-branch
。 這將重寫您的提交,就像它們一直寫在upstream-branch
之上一樣。 這避免了一堆令人困惑的概念合並。
Before
G - H - I [feature-2]
/
D - E - F - K [feature-1]
/
A - B - C [master]
git checkout feature-2
git rebase feature -1
After
G1 - H1 - I1 [feature-2]
/
D - E - F - K [feature-1]
/
A - B - C [master]
然后可以使用git rebase --force-with-lease
安全地推送feature-2
。 如果人們使用 rebase 拉取而不是合並,他們可以安全地更新他們的feature-2
副本。 git pull --rebase
或設置pull.rebase = merges
在您的 Git 配置中pull.rebase = merges
。
同樣,這應該很少見。
但是,如上所述, feature-2
可能根本不應該構建在feature-1
之上。 如果它們是小而獨立的特征,它會是這樣的。
D - E - F - K [feature-1]
/
A - B - C [master]
\
G - H - I [feature-2]
現在,您可以同時開發和測試多個獨立的功能。 完成后,以任何順序將它們合並到 master 中並刪除。 master
始終處於已知良好狀態,可以隨時釋放。 發布是用標簽來跟蹤的,而不是分支。
git checkout master
git merge feature-2
git branch -d feature-2
D - E - F - K [feature-1]
/
A - B - C ---------- J [master]
\ /
G - H - I
這被稱為“功能泡沫”。
然后其他人將他們的功能分支重新建立在master
之上以進行更新,處理任何沖突或損壞,並繼續他們的業務。
git checkout master
git pull
git checkout feature-1
git rebase master
D1 - E1 - F1 - K1 [feature-1]
/
A - B - C ---------- J [master]
\ /
G - H - I
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.