git:rebase、merge

git:rebase 、merge

git merge--会有新的提交

在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。”

1607613666022-7e1f62d7-977c-4f7d-92ed-15e895c40d35.png

# 在master分支上
git merge bugFix

# 会生成一个新的提交在master上面

1607613754280-fb219aec-3f69-401e-ba21-45456a9f8712.png

# 在bugfix去mergemaster,因为之前master已经合并 了,所以直接快速合并
git checkout bugFix

git merge master

因为 master 继承自 bugFix,Git 什么都不用做,只是简单地把 bugFix 移动到 master 所指向的那个提交记录。

现在所有提交记录的颜色都一样了,这表明每一个分支都包含了代码库的所有修改

1607613889341-72686a2b-9c0b-4db7-895b-03f98504f2e0.png

1607609585577-c15af0ba-1b9b-4b4a-8087-779075b5d8ff.png

rebase--不会生成新的提交

不要在master使用,在自己的分支使用即可

merge更加关注历史记录

git rebase。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。

Rebase 的优势就是可以创造更线性的提交历史。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。

还是准备了两个分支;注意当前所在的分支是 bugFix(星号标识的是当前分支)

1607614101572-0847f411-a4c7-49f8-a3b5-b77d956e3453.png

我们想要把 bugFix 分支里的工作直接移到 master 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。

git rebase master 

1607614211031-dbfaf465-d423-4905-85c2-572e123ff601.png

现在 bugFix 分支上的工作在 master 的最顶端,同时我们也得到了一个更线性的提交序列。

注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 master 分支上的 C3 的副本。

现在唯一的问题就是 master 还没有更新,现在我们切换到了 master 上。把它 rebase 到 bugFix 分支上……

1607614301192-e5b0da6f-6be3-4eac-bfd1-f8d9436023f7.png

git rebase bugFix

1607614320359-1b0d9f5e-cba6-4599-9b1b-e60c5347ca86.png

由于 bugFix 继承自 master,所以 Git 只是简单的把 master 分支的引用向前移动了一下而已。

注意变基的时候是在变的分支上,往要变的分支上变。

在bugFix上往master变: git rebase master

往对方分支变基的时候,首先自己要在自己的分支上面,才可以往对方变

变完之后自己的分支上面就有了其他分支的东西,但是其他分支还在自己的位置,需要在其他分支上再次放这个分支变基两个分支的起点才是一致的。

多分支rebase

1607621769150-76178bcd-f983-40db-aa34-8020a9410808.png

把这些分支 rebase 到 master 上。希望得到有序的提交历史,也就是我们最终的结果应该是 C6' 在 C7' 上面, C5' 在 C6' 上面,依此类推。

即使你搞砸了也没关系,用 reset 命令就可以重新开始了。

git rebase master bugFix
git rebase bugFix side
git rebase side another
git rebase another master

直接使用分支变基的时候会将分支的所有commit都复制过去,如果存在已经重复的commit,那么就只是移动分支指针没有 内容上的移动

1607622009012-f4feebc7-08fa-4af3-bf79-cb2b2a5f5f4a.png

1607609616645-3b6d9997-8679-41fa-bdfd-d06848b73354.png

重新建立基础

1607607682763-8a177aa4-bd92-4d64-9982-b44f762ecb02.png

当前有两个分支,master和feature

master分支目前有4个提交,

feature分支处于第2个提交分支出去了,但是还没有任何人提交。

1607607834747-9e1c9419-226c-440f-b778-a1db02c2003f.png

添加文件feature.txt,提交

修改master.txt文件内容,删除以及添加,在feature分支提交

再修改master.txt文件内容,删除以及添加,在feature分支提交

再修改feature.txt文件内容,添加,在feature分支提交

1607608084833-f4c2435b-5236-4cf5-901e-156d831dc637.png

1607608204617-3dc20695-a708-49ee-ad1f-f6cff156dd3e.png

可以看到只是改变了feature的历史,没有改变master的历史

1607608273675-016524ec-182e-4693-b91b-4ca451444a2a.png

所有的commit一个个复制一遍插在base之上,

**<font style="color:#F5222D;">git rebase -i master </font>**当前所在分支交互式的rebase到master,

1607609029506-6e2146d0-327f-4232-b327-8c5cd262d4a4.png

这里不编辑直接exit,可以看到下面的提示,其实此时feature init 提交已经加上去了,但是commit 1 发生了冲突

1607609058680-077207e1-d962-40a7-9583-c857a68353bf.png手动处理 conflict 1之后,按照上面的提示进行add 和commit ,再执行 git rebase --continue

这个时候其实conflict 1 可以加在master上面了,但是conflict 2 又有冲突了,手动解决之后,再执行git rebase --continue

此时没有冲突了,feature 1 直接就加上去了

1607609496496-2cb60ecd-e8f8-4797-972f-cb970d14fb91.png

posted on 2025-10-13 17:43  chuchengzhi  阅读(19)  评论(0)    收藏  举报

导航

杭州技术博主,专注分享云计算领域实战经验、技术教程与行业洞察, 打造聚焦云计算技术的垂直博客,助力开发者快速掌握云服务核心能力。

褚成志 云计算 技术博客