将master分支合并到另一个分支后,它会被修改吗?

时间:2019-10-31 09:52:09

标签: git git-branch git-merge

一个简单的问题:

我最近发现您可以将master合并到派生功能branches中(以使用最新的master更改来更新功能分支)。

这样做是否可以以任何方式修改master?还是完全不受该操作的影响?

2 个答案:

答案 0 :(得分:2)

简短的回答是“否”,但这比简短的回答值得更多。

如果您以 commits 而不是 branches 来考虑,您会发现自己和Git相处得更好。好吧,更确切地说,记住哪个分支是当前分支或使用git status并查看其是否显示on branch masteron 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到提交Hmaster上您所做的更改”与从提交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”的分支开头