Git分支从一个分支创建

21

我正在使用主分支并创建了一个名为'A'的分支。

分支'A'包含用于创建“小部件”的HTML/CSS/JS。

在审核这段代码时,我还想着手创建此“小部件”的测试。

我目前无法使用主分支工作,因为分支'A'尚未合并。但是在代码审核期间,我需要一种在不对Branch 'A'进行更新的情况下继续使用Branch 'A'的方法,以便将其推送到主分支。

我认为我需要从Branch 'A'创建Branch 'B',以便我可以继续使用已经创建的代码。

问题1.如何在git中执行此操作?

问题2.一旦我将Branch 'A'合并到主分支,是否也会包括Branch 'B',即使我还没有完成它?

问题3.我可以独立于Branch 'A'合并Branch 'B'吗?

答案1:使用Git命令`git checkout -b B A`来创建基于分支A的新分支B。
答案2:不会,只有已经合并到主分支的提交才会包括在主分支中。
答案3:是的,您可以单独合并分支B而不必合并分支A。
2个回答

19

问题1. 我该如何在git中实现这个?

git checkout branch_a
git pull
git checkout -b branch_b

您将拥有来自 branch_a 的提交记录,存在于您的新的 branch_b 中。

问题2:当我将分支'A'合并到主分支时,即使我还没有完成分支“B”,它是否也包含在内?

不,它们是完全独立的分支,因此只有来自 branch_a 的提交记录将存在于主分支中。

问题3:我可以独立于分支“A”合并分支“B”吗?

这是一个双管齐下的方法。如果您想将 branch_a 的提交记录一并带上,那么可以随时将 branch_b 合并到主分支中,尽管这样做似乎失去了意义。

考虑到 branch_b 的测试可能依赖于 branch_a,在合并 A 之前合并 B 看起来很愚蠢。

一旦将 A 合并到主分支中,您可能需要将 branch_b 变基到新的主分支上,并摆脱从 branch_a 继承而来的所有原始提交记录,因为它们现在都存在于主分支中:

# Assume A merged into master
git fetch
# Rebase interactively
git rebase -i origin/master
# Exclude (skip or comment out) the commits that were from A, leaving only B
# Rebasing (n/n).....
git push origin branch_b --force

这将从主分支创建一个新的branch_b,其中包含来自A的提交,当您将B合并到主分支时,将不会出现合并冲突。

如果您尚未将branch_b推送到远程仓库,则无需进行强制推送。


7

这很简单 - 你可以在git中从任何分支创建一个分支。

如果你在A分支上,只需执行git checkout -b B,你就会有一个以A为起点的新分支。它将与A分开,A的更改不会反映在B中。

当A合并到主分支时,合并不会带入B的提交。

你不能独立地将B管理到主分支 - 分支B也包含了创建时A上的提交,因此合并B也会将这些提交带入。使用交互式变基或cherry-pick可能仅带入B的更改(不包括A),但这相当高级,可能不是你想做的。

另一件你需要做的事情 - 一旦你从B分支创建,由于代码审核,你可能最终会对A进行更改。确保在A上重新设置B,以保持一切更新,否则,当你将你的测试合并到主分支时,你将会遇到一些问题。


将B重新基于更新的A是一种选择,但如果其他人可能已经拉取了B,则应该将A合并到B中,进行任何必要的更改以适应更改,然后将B合并到A,再合并到主分支或直接合并到主分支,具体取决于您的分支结构。为什么这样做?Rebasing会重写历史记录,在git中重写已发布的历史记录是不好的事情。 - Darael
2
哦,同意。通常当我处于这种情况时,B是完全私有的分支,因此重新设置比生成大量额外的合并提交更容易且更清洁。 - Chris Tavares
@Darael 重写已发布的历史在理论上是不好的,但有时为了实现诸如更清晰的历史记录、删除错误提交等目标是必要的,只有当存储库受欢迎、常用等情况下才会成为问题。 - scrowler
@RobbieAverill 在我看来,一个更干净的历史记录并不值得为此付出代价,因为如果其他人尝试从重写之前克隆的存储库中拉取,那么结果会很痛苦。诚然,对于仅发布用于拉取请求的分支,这是有一定道理的,但这只是因为唯一应该拉取它的人正在与您一起进行重写。至于删除错误提交,在私有分支中是可以的,但一旦发布,这正是 git revert 的用途。 - Darael
将B基于A重置: 在B分支上运行rebase命令还是在A上运行?看起来应该在A分支上运行rebase命令,并使用B分支,但这似乎不正确。 - TemporaryFix
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接