与我们的团队通常一样,下一个版本的更改需要在对当前版本进行完全测试并将其合并回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
答案 0 :(得分:0)
如果每个版本有一个“功能分支”,则它们不是功能分支。 (除非您要连续交付,在这种情况下,您只需要发布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-2
之后,feature-1
才能完成,这种依赖是不可取的。
如果您正在分支的顶部工作并希望保持最新状态,则最简单的操作是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]
然后可以用feature-2
安全地推送 git rebase --force-with-lease
。如果人们使用rebase拉动而不合并,则可以安全地更新其feature-2
的副本。 git pull --rebase
或在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