我对 git 的了解有限。
我从 master 创建了一个分支 B1,做了一些编辑并提交到这个分支。
我想从 B1 创建另一个分支 B2,我在 B2 中进行了一些编辑
而且我还想提交并将 B2(从 B2 和 B1 进行编辑)推回 master
我该怎么做,文档假设您总是从 master 创建一个分支,而不是另一个分支。我为我的 git 愚蠢道歉。
tayfun 的回答基本上是正确的。如果您想了解更多关于原因的概念背景:
该文档不应该对从 master 分支做出假设(至少如果您正在查看规范的 git 文档,则不会;显然我不知道您在查看什么文档)。示例通常可能master仅仅因为它们是简单的示例而开始,但要理解的是:
没有什么特别之处master。
一个分支就是一个分支;其中一个恰好首先出现在那里,按照惯例,它被称为master.
此外,git 没有“父分支”或类似的记忆。在任何给定时间,您都可以专注于当前的提交拓扑。所以:
我从 master 创建了一个分支 B1,做了一些编辑并提交到这个分支。
x -- O <--(master)
\
A <--(B1)
Run Code Online (Sandbox Code Playgroud)
我想从 B1 创建另一个分支 B2,我在 B2 中进行了一些编辑
x -- O <--(master)
\
A <--(B1)
\
B <--(B2)
Run Code Online (Sandbox Code Playgroud)
在这一点上,git 不知道也不关心B2“创建自B1”。除了遵循上述步骤,您还可以说:
B2从主创建A)B)A并创建分支B1一切都会一样。
而且我还想提交并将 B2(从 B2 和 B1 进行编辑)推回 master
这里你的术语很混乱。
Topush是更新远程存储库引用。通常,您的遥控器可以有一个对应于每个本地分支的分支。尽管 git 非常灵活并且您可以以不同的方式使用 push,但它似乎仍然不是您在这里的意思。
将一个本地分支的更改合并到另一个本地分支是为了merge。(实际上有几种方法可以解决这个问题,但从概念上讲,最直接的是合并......)
此外,这触及了对 git 中分支的常见误解 - 更改“属于”这个分支或那个分支。在许多源代码控制系统中这可能是真的,但在 git 中却不是。相反,更改是或不是从分支(或其他参考)“可达”;并且可以(通常)可以从许多参考文献中获得更改。
(本质上,一个分支(或其他 ref)是一个指向提交的指针;该提交可从 ref 访问。如果该提交有父提交,则父提交是可访问的。这通过父指针递归地继续,以便整个历史记录最多可从该 ref 访问 ref。)
所以回到图表
x -- O <--(master)
\
A <--(B1)
\
B <--(B2)
Run Code Online (Sandbox Code Playgroud)
你所描述是什么A和B应该合并master。因为AandB正是可以从 访问B2但不能从访问的提交master,这很简单
git checkout master
git merge B2
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下 git 将在此处采用快捷方式,通过执行“快进”而不是真正的合并。之所以可以这样做master,是因为没有无法从B2. 在这种情况下,git 可以更新master以将其移动到与B2.
x -- O -- A <--(B1)
\
B <--(B2)(master)
Run Code Online (Sandbox Code Playgroud)
您可能不希望 git 这样做。(某些分支/合并策略要求保留分支拓扑。)在这种情况下,您可以说
git checkout master
git merge --no-ff B2
Run Code Online (Sandbox Code Playgroud)
这会给你
x -- O --------------- M <--(master)
\ /
A <--(B1) /
\ /
B --------/
^
(B2)
Run Code Online (Sandbox Code Playgroud)
M“合并提交”在哪里。如果有其他更改可从 访问master但无法从 访问B2,则合并提交会将这些更改与来自A和的更改合并B。
无论哪种方式,B1仍然指向A和B2仍然指向B,因此它们都可以从master.