我喜欢用命令行操作git 记录下偶尔会用到但是很实用的git命令
一、git rebase 汇合提交
在实现一个功能的过程中往往可能提交不止一次commit,但事后会留下数条commit记录。
如果希望获得比较简洁直观的commit history,我们希望汇合多次的commit。
这里记录分享下我的
git rebase
汇合操作,以demo repo演示:
创建一个简单的的test repo
多次 commit
git log -n //(n代表任意条数量的记录)
指定rebase操作的区间
$
git rebase -i [startpoint] [endpoint]
-i
的意思是--interactive
,即弹出vim
界面让用户编辑完成合并操作
[startpoint] [endpoint]是用commmitId界定了rebase的区间,前开后闭。
我们尝试汇合initial commit之后的三次提交,操作如下
git rebase -i 0063607bcd7ad732b0a098125e8112760ba7e56c bcf08e33eafdfe58c2dd3b37d1b12764e8667d8f
操作面板交互
下方是标注规则
- p, pick: 保留该 commit。
- r, reword: 保留该 commit,可以修改 commit 的注释。
- e, eidt: 保留该 commit,但停下来修改该 commit (不仅仅是注释),可以用来解决 merge 冲突。
- s, squash: 将该 commit 和 前面一个 commit 合并。
- f, fixup: 将该 commit 和 前面一个 commit 合并,但不保留该提交的注释信息。
- x, exec: 执行 shell 命令。
- d, drop: 丢弃该 commit
按i键进入insert编辑模式,主要配合上述规则修改黄色框内的记录条目
合并提交
- 将后两次的commit由pick改为suqash标记,这里用简写指令s
- 然后esc退出insert模式
- :wq!保存编辑退出
修改commit内容
进入临时分支
这时候我们处在一个临时的分支,无法push。我们可以先以该分支为起点创建一个临时分支temp
然后再切回先前的主分支master
执行
git rebase temp
,会以master
为基点挂载temp
分支的内容
如果是多次提交可能会出现合并的提示,需要你确认你自己的冲突已经解决
如果你十分确定你的代码没有问题,你可以连续
git rebase --skip
跳过每一次的rebase
或者连续使用
git rebase --continue
确认每次的commit是无误的,如果有错就解决冲突
如果你突然反悔了,记得可以
git rebase --abort
放弃你之前的rebase内容
rebase汇合完毕
出现该提示代表rebase汇合成功
可以用log确认结果
显然3次commit已经合并为1次,也改好了我们想要的commit message
push -f更新代码
注意。尽量不要在rebase汇合时囊括你同事的commit,可能会出意料之外的问题,因为我们需要-f强推。
二、修改上次提交commit message: git commit --amend -m "instead commit message"
如果某次push代码之后我们忘记或者写错一些commit message,不用reset也不用rebase
直接用一行命令就可以直接修改上次提交的commit message
上次提交的git message如下:
修改之后:
三、修改上次提交commit author email
我在不同的设备可能有不同的git config设置,我的user.name和user.email有时候忘记按照某个具体的项目设定,这也会影响公司或者自己开源项目的git history直观。 当然也可以改,方法参照修改message,指令如下
$
git commit --amend --author="{author} <{email}>"