一个简单的问题:
我最近发现您可以将master
合并到派生功能branches
中(以使用最新的master
更改来更新功能分支)。
这样做是否可以以任何方式修改master
?还是完全不受该操作的影响?
答案 0 :(得分:2)
简短的回答是“否”,但这比简短的回答值得更多。
如果您以 commits 而不是 branches 来考虑,您会发现自己和Git相处得更好。好吧,更确切地说,记住哪个分支是当前分支或使用git status
并查看其是否显示on branch master
或on branch develop
或其他内容很重要,但是在这之后 ,考虑提交。
每个分支名称都指向一个(单个)提交。根据定义,该提交是分支的 tip 提交。这里的短语“ 指向”表示分支名称从字面上包含该一次提交的原始哈希ID。每个提交都有自己唯一的哈希ID:没有其他提交可以拥有该哈希ID。该哈希ID表示该立即和永久提交。
特殊名称HEAD
表示分支名称。 1 即HEAD
记住一个分支名称,而一个分支名称记住一次提交。
当您这样做:
git checkout develop
(假设它成功了),通过让develop
记住名字HEAD
,Git让您“ develop
”。您当前的 commit 现在是develop
命名的那个。
随后运行时:
git merge master
(假设它成功了),Git完成了所有合并工作-无论是什么工作,都会变得很复杂-然后可能进行了新的提交。 2 如果 did 进行新的提交,名称 develop
现在可以标识新的提交。名称master
仍与名称master
始终标识的提交相同。
与此同时,每个提交通过其哈希ID引用一定数量的 parent 提交。大多数提交仅持有一个父哈希ID,因此大多数提交都指向其一个父哈希。这一系列向后的箭头形成一条链。例如,名称master
可能具有哈希ID H
。同时,具有哈希ID H
的提交拥有哈希ID G
,而提交G
拥有哈希ID F
,依此类推:
... <-F <-G <-H <-- master
Git可以从名称master
到提交H
,然后回到G
,再到F
,依此类推,在提交链中倒退
任何提交都不能永远更改(只能更改一点),因此一旦提交存在并且有一些父母,该提交将始终向后指向那些父母。 (您不能更改提交。最多可以使Git停止查看提交。如果您和Git都不能找到提交,则该提交最终会从存储库中掉出来并被垃圾回收。)Git主要只是继续在链中添加 new 提交。
所以我们从这样的东西开始:
...--F--G--H <-- master
\
I--J <-- develop
您git checkout
进行开发以选择提交J
。 (在名称HEAD
旁边绘制单词develop
,这样您就可以记住自己在develop
上。)
现在您运行git merge master
,Git会启动合并机器。这需要进行大量计算,以找出正确的合并结果,并构建新的提交。由于新提交是合并提交,因此它照常指向J
,但是指向<{> {em}} 指向H
:
...--F--G-----H <-- master
\ \
I--J--K
写出合并提交K
的结果是,Git将其哈希ID(无论实际上是什么)写入附有HEAD
的名称中,现在develop
指向提交K
:
...--F--G-----H <-- master
\ \
I--J--K <-- develop (HEAD)
提交H
不会更改-不能更改-并且名称master
尚未移动,因此master
不会受到影响。>
1 名称HEAD
可以包含哈希ID而不是分支名称。在这种情况下,Git表示您处于“分离头”模式。更新(例如创建新的提交)只需将新的提交哈希ID直接写到HEAD
中,以便HEAD
继续分离。将git checkout
与分支名称一起使用,将HEAD
重新附加到该分支名称。
2 在某些情况下,git merge
根本不执行合并,而是进行快进操作。不需要合并时会发生这种情况。例如,如果您在master
上并且拥有以下内容:
...--G--H <-- master (HEAD)
\
I--J <-- dev
并询问git merge dev
,如果要进行真正的合并,Git必须合并的更改将是从提交H
到提交H
( master
上您所做的更改”与从提交H
到提交J
的更改({{1}上的“他们更改了什么”)。但是显然,提交dev
中的内容与提交H
中的内容相同。无需实际进行任何合并!如果您允许,H
根本不会费心合并,而只会直接检出提交git merge
并向前拖动名称J
以进行匹配,给予:
master
请注意,这是针对...--G--H
\
I--J <-- dev, master (HEAD)
的,而不是相反的。进行git checkout master; git merge dev
会使您得到“已经更新”的消息,而没有其他任何更改。
答案 1 :(得分:1)
在这种情况下,您无需修改master分支中的任何东西。您只需将其更改到功能分支。 “主人”不是某种“特殊”分支。这只是具有相同规则的普通分支。而且之所以广为传播,是因为每个新的git存储库都以一个名为“ master”的分支开头