git merge时merge/squash merge/rebase merge的区别

1. merge

$ git checkout master
$ git merge dev

这是最基本的 merge,会把分支的提交历史原封不动地拷贝过来,如果 master 此后已经有了新的提交,那么本次 merge 时还会额外自动创建一条 commit 信息用于记录本次 merge 操作。

2. squash merge

$ git checkout master
$ git merge --squash dev

字面意思,相比?merge?来说会减少分支合并的记录,会被压缩为一条 commit 记录。squash merge 本质是把 dev 分支的改动保存到 master 本地,接下来还需要手动提交一下,因此最终提交者变成了操作 master 分支的人,这可能是个弊端。

3. rebase merge

$ git checkout dev
$ git rebase -i master
$ git checkout master
$ git merge dev

rebase merge 可以完美解决 squash merge 可能会变更原始提交者的问题。

首先 rebase 这个概念如果不懂可以先去了解下,这里先进行 rebase 的意义,个人认为,一方面是为了和 master 分支同步一下信息,以免 master 在和 dev 分叉之后又有了额外的更新;另一方面,能真正解决 squash merge 痛点的是 -i 交互模式,会进入文本编辑框,由自己指定 dev 相对于 master 新产生的这些“补丁” 在 rebase 时具体该如何应用到当前 dev 分支上。

所以 rebase merge 是非常灵活的,你可以什么都不干,采用默认策略:

pick xxxxxxx A
pick xxxxxxx B
pick xxxxxxx C

也可以把所有 commit 合为一条,保存退出后,会再次进入一个用于编辑合并后提交信息的文本编辑框:

pick xxxxxxx A
squash xxxxxxx B
squash xxxxxxx C

还可以不合为一条,而只合并其中某几条,比如把 A,B,C 三条提交记录整合为 AB,C 两条记录:

pick xxxxxxx A
fixup xxxxxxx B
pick xxxxxxx C

文本编辑框中定义的指令合理的话,应该会顺利 rebase 成功,之后可以 git log 查看一下是否如愿。
最后,在 master 分支上进行 git merge dev 就是常规操作了。

所以 squash merge 和 rebase merge 在多条合并为一条时的区别是,前者在 merge 时才合并为一条,而后者在提前 rebase 时就顺便整合了多条 commit 信息。



参考:

  1. git merge的三种操作merge, squash merge, 和rebase merge

原文地址:https://www.cnblogs.com/nicholaswang/p/11801563.html

时间: 2024-09-29 23:22:52

git merge时merge/squash merge/rebase merge的区别的相关文章

git有merge时如何删除分支

不小心增加了一个分支,并且有了merge,如何删除掉? 具有merge时不能切换分支 可以利用git stash命令 git rm controllers/InterfaceController.php    //删除merge文件,不删除有时不能stashgit stash        //缓存git statusgit checkout mastergit branchgit branch -D zhaojian3_update    //删除分支 -D 强行删除git stash lis

Git 少用 Pull 多用 Fetch 和 Merge(转)

英文原文:git: fetch and merge, don’t pull This is too long and rambling, but to steal a joke from Mark Twain Blaise Pascal I haven’t had time to make it shorter yet.  There is some discussion of this post on the git mailing list, but much of it is tangen

Git 少用 Pull 多用 Fetch 和 Merge(转)

This is too long and rambling, but to steal a joke from Mark Twain Blaise Pascal I haven’t had time to make it shorter yet.  There is some discussion of this post on the git mailing list, but much of it is tangential to the points I’m trying to make

处理git pull时代码冲突问题

今天在服务器上git pull是出现以下错误: error: Your local changes to the following files would be overwritten by merge 不知道什么原因造成的代码冲突,处理方法如下: 如果希望保留生产服务器上所做的改动,仅仅并入新配置项: git stash git pull git stash pop 然后可以使用git diff -w +文件名 来确认代码自动合并的情况. 如果希望用代码库中的文件完全覆盖本地工作版本. 方法

git合并时忽略某个文件

因为开发现场跟部署的环境不同,有很多ip地址每次都要改来改去;于是开两个分支master(用来保存部署现场的ip)和dev(开发环境的ip),开发功能时在dev分支,然后使用master合并,每个分支都保存着自己的config配置文件,不想dev分支被master合并时config文件也合并. 创建自定义merge driver git config --global merge.ours.driver true 在要被merge的分支上创建.gitattributes文件,并且在文件中置顶不m

解决git Push时请求username和password,而不是ssh-key验证

转载自:https://blog.lowstz.org/posts/2011/11/23/why-git-push-require-username-password-github/ 之前开始用github时是在ubuntu下按着官方的新手指南搞定的.但最近一直在用fedora,所以也想在fedora下用github,配置的时候很顺利,就是在git push的每次都需要输入username和password,而我是配置好公钥登陆的.用ssh -T [email protected] 也是成功用公

git review时出现fatal: ICLA contributor agreement requires current contact information.错误

使用git review时出现错误: fatal: ICLA contributor agreement requires current contact information. Please review your contact information: https://review.openstack.org/#/settings/contact fatal: Could not read from remote repository. Please make sure you have

FW 执行Git命令时出现各种 SSL certificate problem 的解决办法

比如我在windows下用Git clone gitURL 就提示  SSL certificate problem: self signed certificate 这种问题,在windows下出现得频率高些.我估计主要是git本身就是基于linux开发的,在windows上,容易缺失一些环境. 参考了一些文章,解决方法其实就是“直接不管ssl证书的事儿”-_-||| 方法如下: 1.创建临时环境变量: windows上命令行输入: [plain] view plain copy set GI

【转载】Git push时重复输入用户名密码的问题

在windows上使用git来push到github服务器的时候,每次都需要填写用户名/邮箱.密码,很麻烦.最近用hexo写博客,需要频繁地进行博客配置和预览,而每次预览执行hexo deploy都需要输入用户名.密码验证,不胜其烦,今天下决心解决. 尽管github提供了SSH方式进行本地和服务端的链接,可是按照网站说明设置好之后,这个问题仍然得不到解决.尝试了好几次,最终用下面这个方法解决了. 首先添加环境变量. 在用户文件夹如C:\Users\zhangsan下新建一个名为_netrc的文