Like_6 发表于 2017-10-29 19:52

软件开发的同学请进,Git中的rebase和merge到底有什么区别

本帖最后由 Like_6 于 2017-10-29 20:57 编辑

用Git的时间不长,学习时感觉没有区别,两者的功能都是合并,有冲突都要解决,日志记录也没有区别。

一直用的merge, 一直都没用过rebase,一直没注意这事,上周末,同事叫我把我的分支rebase他的分支,我说merge可以吗?他说不行。一定要rebase. 然后讲了下为什么,但是我没有听明白。

请问一下大家,merge和rebase的区别到底是什么呀? 我今天上网找了资料,也在家又一次做了试验,但还是没发现两者的区别。谢谢。


另: Git的GUI工具较多,我用的是TortoiseGit, 不会是因为我选用的工具无法显示这两者的区别吧。

gaokx 发表于 2017-10-29 20:07

master (带 x1 修改)创建feature分支 (这时候这个feature分支等同于带x1的master)

然后 master 有了x2修改, feature 上面新增加了f1 修改

看起来就是 master x1, x2,然后feature有 x1, f1

feature把新的master合并,就是merge过来,那么feature上面的commit就是x1,x2,f1,当然也可能是 x1,f1,x2,看x2和f1提交的时间而定,如果x2和f1有修改到同一个文件重叠的部分,那就是有冲突,需要处理.

feature对新的master做rebase,那么feature分支上面一定就是x1,x2,f1这个顺序,当然如果有冲突还是要处理.

不同的地方是,如果master上面发生了回滚,就是从x1,x2变成了只有x1,但是,一个feature上面如果对master进行了合并,含有原来的x2提交的话,那么这个feature合并回master以后,这个x2就回去了,就是说master上再次包含了x2,这当然是不希望出现的情况.

如果这个分支是进行的rebase那么feature合并回去,master就是x1,f1的状态,x2不会被再写回去.

所以你同事叫你一定要rebase.背后的原则就是,不同的分支原则上必须是不相关的,只应该相对于master分支做新的提交,分支不应该覆盖包含其他的分支的提交.

我们有个it群,有兴趣你可以加进来.

shrek_munich 发表于 2017-10-29 21:31

取决于你们两个的工作的关联,他的是master 分支还是另一个feature,从描述上我猜你的分支应该是feature。(虽然可能性不大)如果你的分支是master,那不允许你rebase他,只能merge他。

如果你是feature,他是master,建议你rebase,这样可以有一个比较清爽的提交历史,而且既然他已经是提交了的master,你作为未来后提交的,rebase可以看到一个单一提交树而不是一个不明所以的merge记录;

如果你们都是feature就比较特殊,一般只有在两个关联feature而且需要联合测试的时候这么干,否则应该是他测试完成以后merge回master你再rebase master。如果是以上的情况,他这样做对他来说提交记录比较完整,如果和你的开发有冲突,需要在你的提交上解决conflict,对你来说稍微吃亏一点,但至少整个历史比较完整。

Like_6 发表于 2017-10-30 00:13

感谢两位,现在清楚多了。

temgy1986 发表于 2018-7-25 14:42

gaokx 发表于 2017-10-29 21:07
master (带 x1 修改)创建feature分支 (这时候这个feature分支等同于带x1的master)

然后 master 有 ...

请问你们的IT群是微信么?有没有号呢?求拉。
页: [1]
查看完整版本: 软件开发的同学请进,Git中的rebase和merge到底有什么区别