前提:不要对任何已经提交到公共仓库中的 commit 进行修改(你自己一个人玩的分支除外)
场景:有时候开发一个功能, 修修补补 commit 了很多次 ,过多的 commit 会显得很复杂。
或者代码写好后,发现有几个commit有些多余,可以合并或者干脆删除。
所以,在这种情况下。我们需要整理一下 commit 的记录,让我们更好的管理提交记录。
1 命令 git rebase -i
这里主要用到rebase命令:
git rebase -i [startpoint] [endpoint]
其中-i
的意思是--interactive
,即弹出交互式的界面让用户编辑完成合并操作,[startpoint]
[endpoint]
则指定了一个编辑区间,如果不指定[endpoint]
,则该区间的终点默认是当前分支HEAD
所指向的commit
(注:该区间指定的是一个前开后闭的区间)。
2 步骤
假设这里要把 d c new_b合并。
① 使用 git log 命令查看提交历史:
②执行命令
git rebase -i 8b2c5f3
#或者
git rebase -i HEAD~3
#如果只是合并中间的new_b c
git rebase -i 8b2c5f3 b27e655
③ 编辑commit之前的命令
- pick:保留该commit(缩写:p)
- reword:保留该commit,但我需要修改该commit的注释(缩写:r)
- edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
- squash:将该commit和前一个commit合并(缩写:s)
- fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
- exec:执行shell命令(缩写:x)
- drop:我要丢弃该commit(缩写:d)
根据我们的需求,我们将commit内容编辑如下:
④ 编辑注释修改页面
比如 我要修改为 "new_b_c_d",这把"new_b"编辑为"new_b_c_d",然后删除 "c" "d".确认退出后
再次查看log
3仅两个commit的时候,怎么合并
使用--root,则从根commit开始
git rebase -i --root
结果如图:
剩下操作同上。
4 同步远程仓库
如果要同步远程仓库,则强制push
git push --force
#或者
git push origin master -f