git使用-去除merge branch ’master‘提交

git去除merge branch ’master‘提交


问题现象

在项目开发中,经常会有这样的情况发生,
更新上游项目代码时操作:

[Tom@localhost dev-gw-ac]$ git remote add upstream http://Tom@200.200.202.150/dev-gw-ac/dev-gw-ac.git
[Tom@localhost dev-gw-ac]$ git fetch upstream
[Tom@localhost dev-gw-ac]$ git merge upstream/master
[Tom@localhost dev-gw-ac]$ git push origin master

以上操作中,fetch+merge可以用pull来代替:

[Tom@localhost dev-gw-ac]$ git pull upstream master

有时候你会发现,在git merge时产生了一个新的提交 Merge remote-tracking branch ‘dev-gw-ac/master’:

commit a4e26816423de3513b40107f37a049bdf145aee0
Merge: f8da63e 05315ab
Author: Tom <Tom@utt.com.cn>
Date:   Tue Dec 11 12:15:48 2018 +0800

    Merge remote-tracking branch 'upstream/master'

commit f8da63e9e9f33ff0a99460b3ae051db3cb0ef73d
Author: Tom <Tom@utt.com.cn>
Date:   Tue Dec 11 11:24:10 2018 +0800

    优化nandflash读写

这个提交是一个冗余的提交,在我们向上游项目提交合并请求时,他会保存在提交历史里面,并且对代码审查造成一些干扰。


问题原因

那么,为什么会出现这种现象呢?其实是与 Git 的工作原理有关,对 Git 比较了解的人应该会知道,无论是 pull、push 亦或是 merge 操作,其实背后都是有很多的不同的模式的。

在进行 pull 操作的同时,其实就是 fetch+merge 的一个过程。我们从 remote 分支中拉取新的更新,然后再合并到本地分支中去。

如果 remote 分支超前于本地分支,并且本地分支没有任何 commit 的,直接从 remote 进行 pull 操作,默认会采用 fast-forward 模式,这种模式下,并不会产生合并节点,也就是说不会产生多余的那条 log 信息

如果本地先 commit 后再去 pull,那么此时,remote 分支和本地会分支会出现分叉,这个时候使用 pull 操作拉取更新时,就会进行分支合并,产生合并节点和 log 信息。这两种状态分别如下图所示:

fast-forword

A-B-D(origin/master)
     \
      C'(master) 

merge

A-B-C-E(master)
   \ /
    D(origin/master)

网搜资料:https://www.cnblogs.com/Sinte-Beuve/p/9195018.html


解决方法

怎样取消掉恼人的Merge branch提交,使提交历史变为简单的?

第一种方法:

在我们准备对本地做任何修改之前,我们先更新上游项目代码,这时merge合并时默认会采用 fast-forward 模式,由于本地没有变化,不会产生新的Merge remote-tracking branch提交。

第二种方法:

如果你已经对本地做出修改,并提交(未提交时更新会报错)到本地,更新时不要执行merge命令,使用rebase命令即可,如下:

[Tom@localhost dev-gw-ac]$ git fetch upstream
Password for 'http://Tom@200.200.202.150': 
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 31 (delta 16), reused 0 (delta 0)
Unpacking objects: 100% (31/31), done.
From http://200.200.202.150/dev-gw-ac/dev-gw-ac
 + 5562878...3abc369 master     -> upstream/master  (forced update)

[Tom@localhost dev-gw-ac]$ git  rebase upstream/master
First, rewinding head to replay your work on top of it...
Applying: nand 读函数有偏移量时,读取page大小,没有与page对齐

这里,rebase命令没有直接显示哪些文件做了修改,通过log命令可以看到更新后没有产生新的冗余提交。

不使用fetch+merge的话,也可以直接使用

git pull --rebase upstream master

如果拉取不产生冲突,会直接 rebase,不会产生分支合并操作,如果有冲突则需要手动 fix 后,自行合并。


rebase 注意事项

另外,请注意:如果需要使用rebase命令,请大家在阅读过此命令的注意事项后再使用,否则错误使用会给团队造成很大困扰。

关于什么时候使用 rebase,什么时候使用 merge,开发者总结了几条规则:

  1. 从 remote 分支拉取更新到本地时,使用 rebase。
  2. 当完成 bug 修复或新功能时,本地使用 merge 将子分支合并到主分支。
  3. 没有人应该 rebase 一根共享的分支,千万不要通过rebase来修改已经合并到上游项目的提交记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值