我对git知之甚少。
我已经从master创建了一个分支B1,进行了一些编辑并提交给了这个分支。
我想从B1创建另一个分支B2,我在B2中进行了一些编辑
我还想提交并推送B2(从B2和B1进行编辑)回到主
如何执行此操作,文档假定您始终从master创建分支,而不是另一个分支。我为我的愚蠢而道歉。
答案 0 :(得分:4)
tayfun的回答基本上是正确的。如果您想了解更多关于原因的概念背景:
文档不应该对master的分支做出假设(至少如果你正在查看规范的git文档那么;显然我不知道你在看什么文档)。示例通常可以从master
开始,因为它们只是简单的示例,但要理解的是:
master
没有什么特别之处。
分支是分支;其中一个恰好首先出现在那里,按惯例,它被称为master
。
此外,git没有“父分支”或类似内容的记忆。在任何给定时间,您都可以专注于当前的提交拓扑。所以:
我已经从master创建了一个分支B1,进行了一些编辑并提交给了这个分支。
x -- O <--(master)
\
A <--(B1)
我想从B1创建另一个分支B2,我在B2中进行了一些编辑
x -- O <--(master)
\
A <--(B1)
\
B <--(B2)
此时,git不知道或不关心B2
是从B1
创建的。您可以说:
B2
A
)B
)A
并创建分支B1
一切都会一样。
我还想提交并推送B2(从B2和B1进行编辑)回到主
这里你的术语很混乱。
要push
更新远程存储库ref。通常,您的遥控器可能具有与每个本地分支对应的分支。虽然git非常灵活,你可以以不同的方式使用push,但它仍然不像你的意思。
将来自一个本地分支的更改合并到另一个本地分支是merge
。 (实际上有几种方法可以解决这个问题,但从概念上讲,最直接的方法是合并...)
此外,这触及了关于git中分支的常见误解 - 变更“属于”此分支或该分支。在许多源控制系统中可能是真的,但在git中它不是。相反,从分支(或其他参考)“可以”到达或不变化;并且可以(通常是)从许多引用中获得更改。
(本质上,一个分支(或其他ref)是一个指向提交的指针;该提交可以从ref访问。如果该提交有一个父提交,则父提交是可达的。这将通过父指针递归继续,以便可以从该参考文献中获得导致参考的整个历史记录。)
回到图表
x -- O <--(master)
\
A <--(B1)
\
B <--(B2)
您所描述的是A
和B
应该合并到master
。由于A
和B
正好是可以从B2
访问但无法从master
访问的提交,因此这就像
git checkout master
git merge B2
请注意,默认情况下,git会在此处执行快捷方式,方法是执行“快进”而不是真正的合并。这可以完成,因为master
没有无法从B2
无法进行的更改。在这种情况下,git只需更新master
即可将其移至与B2
相同的提交。
x -- O -- A <--(B1)
\
B <--(B2)(master)
你可能不希望git这样做。 (某些分支/合并策略要求保留分支拓扑。)在这种情况下,您可以说
git checkout master
git merge --no-ff B2
会给你
x -- O --------------- M <--(master)
\ /
A <--(B1) /
\ /
B --------/
^
(B2)
其中M
是“合并提交”。如果可以从master
到达但B2
无法访问的其他更改,则合并提交会将这些更改与A
和B
的更改结合起来。
无论哪种方式,B1
仍然指向A
而B2
仍然指向B
,因此它们都可以从master
完全到达。
答案 1 :(得分:2)
没有什么可以阻止你将任何分支合并回主人。该分支可以从master或任何其他分支分支。只需:
git checkout master
git merge B2
试试这个。如果你想将它重置为原点(假设您的远程仓库被称为原点,或者如果您没有远程仓库,您也可以提供提交哈希),则可以随时git reset --hard origin/master
。
答案 2 :(得分:1)
让我简要解释git
如何运作,以便您理解
让我们在temp/
文件夹
$ cd temp
$ git init
现在,使用以下文本
创建一个文件hello.txtin master
保存,提交更改并使用
检查您的分支名称$ git add hello.txt
$ git commit -m 'committed in master'
$ git branch
* master # the output
好的,现在您创建一个分支名称B1
$ git checkout -b B1
现在检查hello.txt
里面有什么。
$ cat hello.txt
in master
它与master分支具有相同的文本。现在编辑文件并添加一些文本
in master
in B1
您将文件保存在 B1 分支中,并且它具有更新的数据。在 B1
中提交更改并创建新分支$ git add hello.txt
$ git commit -m 'committed in B1'
创建分支名称B2
,而无需返回主
$ git checkout -b B2
如果检查B2中hello.txt的内容,则会有与B2中相同的文本,因为分支B2来自分支B1。现在,如果你回到master分支并看到hello.txt的内容,你会发现==&gt;仅in master
,分支 B1和B2 的更改不会影响主分支
现在更改hello.txt的内容
in master
in B1
in B2
保存并提交更改。
现在回到您的问题,您希望从 B2 分支合并( Not push )更改到 B1 。您可以返回分支 B1 来执行此操作。
$ git branch B1 # To change the branch to B1
$ git merge B2 # It will merge changes made in B2 to B1
现在检查 B1 中 hello.txt 的内容。尼斯。对吗?
同样,转到master分支并将 B1 中所做的更改合并到master。你有它。