git一些"反悔"指令

294 阅读1分钟

我喜欢用命令行操作git 记录下偶尔会用到但是很实用的git命令

一、git rebase 汇合提交

在实现一个功能的过程中往往可能提交不止一次commit,但事后会留下数条commit记录。

如果希望获得比较简洁直观的commit history,我们希望汇合多次的commit。

这里记录分享下我的git rebase汇合操作,以demo repo演示:

创建一个简单的的test repo

image.png

多次 commit

gitlog//查看commit记录也可以这样查看git log //查看commit记录 也可以这样查看 git log -n //(n代表任意条数量的记录) image.png

指定rebase操作的区间

$git rebase -i [startpoint] [endpoint]

-i 的意思是--interactive,即弹出vim界面让用户编辑完成合并操作

[startpoint] [endpoint]是用commmitId界定了rebase的区间,前开后闭。

我们尝试汇合initial commit之后的三次提交,操作如下

git rebase -i 0063607bcd7ad732b0a098125e8112760ba7e56c bcf08e33eafdfe58c2dd3b37d1b12764e8667d8f

image.png

操作面板交互

下方是标注规则

  • 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

image.png

按i键进入insert编辑模式,主要配合上述规则修改黄色框内的记录条目

合并提交

  1. 将后两次的commit由pick改为suqash标记,这里用简写指令s
  2. 然后esc退出insert模式
  3. :wq!保存编辑退出 image.png

修改commit内容

image.png

进入临时分支

image.png

这时候我们处在一个临时的分支,无法push。我们可以先以该分支为起点创建一个临时分支temp

image.png

然后再切回先前的主分支master

image.png

执行git rebase temp,会以master为基点挂载temp分支的内容

如果是多次提交可能会出现合并的提示,需要你确认你自己的冲突已经解决

如果你十分确定你的代码没有问题,你可以连续 git rebase --skip跳过每一次的rebase

或者连续使用git rebase --continue确认每次的commit是无误的,如果有错就解决冲突

如果你突然反悔了,记得可以git rebase --abort放弃你之前的rebase内容

rebase汇合完毕

出现该提示代表rebase汇合成功 image.png

可以用log确认结果

image.png

显然3次commit已经合并为1次,也改好了我们想要的commit message

push -f更新代码

注意。尽量不要在rebase汇合时囊括你同事的commit,可能会出意料之外的问题,因为我们需要-f强推。 image.png


二、修改上次提交commit message: git commit --amend -m "instead commit message"

如果某次push代码之后我们忘记或者写错一些commit message,不用reset也不用rebase

直接用一行命令就可以直接修改上次提交的commit message

上次提交的git message如下: image.png 修改之后:

image.png

三、修改上次提交commit author email

我在不同的设备可能有不同的git config设置,我的user.name和user.email有时候忘记按照某个具体的项目设定,这也会影响公司或者自己开源项目的git history直观。 当然也可以改,方法参照修改message,指令如下

$git commit --amend --author="{author} <{email}>"