Git中rebase的使用

平时开发中,基本使用idea进行Git的pull、statsh、commit、push、revert等操作。

git add . 可以将所有未add的文件添加到暂存区,也可以git add file(具体的文件路径)对单一文件操作

也可以通过git add -i,命令进入交互式操作中,如图:

交互式add

更多交互式操作详见Git官方文档

git restore . 可以将所有还未加入到暂存区的文件恢复至原来状态,也可以git restore file(具体文件路径)对单一文件进行操作:

如:

git restore src/test/java/com/example/mybatis/demomybatis/MybatisTests.java

也可以通过git restore -i,命令进入交互式操作中

同时还可以将一个分支develpop合并到master上:步骤如下

1、在develop上确保已经提交完毕

2、切换到master分支上,pull一下

3、在idea的右下角,Git那里,找到develop分支,点击develop分支,有一个merger into current选项,点击即可合并

4、如果出现冲突,则解决冲突即可

问题引出:

今天在合并代码的时候的,合并分支1(暂时叫dev1)到分支2(dev2),由于使用了idea进行合并,所以idea默认合并之后会生成一个merger的信息并commit。但是这时候发现dev2上有其他同事提交的代码,导致我从dev1上合过来的代码有一部分报错。进行修改之后,再次commit.然后push的时候要合并成一个commit进行push.

为什么要合并成一次commit?

原因:我司使用gerrit进行代码的构建和自动检查功能,如果分两次push,则会失败,因为第一次idea默认的commit中其实是有错误的,gerrit的代码自动检查也过不了

方式一:

使用git rebase -i 命令

模拟场景如下:

第一次commit

git commit -m "test1 commit"

第二次提交:

git commit -m "test2 commit"

查看git 提交历史:

git log

如下图:

Git历史

我们目标是要将这两次提交合并为一次提交

1、选择要合并的提交的共同的parent,这里就是commit 为11ef17...这个提交,执行命令

git rebase -i 11ef17

会弹出一个vim编辑器页面,如图,按i进入编辑模式

vim编辑器

p,pick:使用该次提交
r,reword:使用该次提交,但重新编辑提交信息
e,edit:使用该次提交,但停止到该次提交
s,squash:将该commit和【前一个】commit合并
f,fixup:将该commit和前一个commit合并,但不保留该提交的注释信息
x,exec:执行shell命令
d,drop:丢弃该commit

这里我们编辑如下:

p 1103bb9 test1 commit

s b94e5f7 test2 commit

编辑之后,:wq命令,保存、退出。此时会进入到编辑commit message信息页面

信息

在这里可以编辑提交信息,按i进入编辑模式,如果要使用第一个提交信息,则使用#将test2 commit注释掉,如果这两个提交信息都不想要,则可以都用#注释掉,然后在#This is a combination of 2 commits下面,添加自己的提交信息即可。

填写完毕,esc退出编辑模式->:wq保存退出->git log 查看两个提交已经合并为一个commit了

提示:如果在rebase过程中出现任何问题,则可以通过命令,git rebase --abort,退出rebase模式

PS:在第一个commit不能使用s参数,因为s是指将当前和它的前一个提交合并,但是第一个的前面已经不存在其他提交了,所以要是这么写会直接标红 报错

方式二:

使用git commit --amend

第一次提交之后,第二次修改文件之后,注意:修改完之后,只需要add,不需要 git commit 使用第一次的提交信息并且将这两个commit合并为一个commit

git commit --amend

这种方式其实等价于第一种方式中的交互模式中的,f参数,fixup:将该commit和前一个commit合并,但不保留该提交的注释信息

p 1103bb9 test1 commit

f b94e5f7 test2 commit

方式三:

直接使用git reset (commitid),将本地git恢复至两个commit的parent历史处。

由于git reset不带任何参数,会将原来的修改移除暂存区,所有接下来使用git add . 将所有被移除的文件重新加入暂存区中,然后进行一次总的git commit即可

提示:可以使用git reset --soft (commitid),加入--soft参数不会使文件移除暂存区

 

个人推荐使用git commit --amend或者git rebase -i形式

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值