一、修改最新一次的commit的信息
1.首先通过 git log 查看commit信息
2.使用指令:git commit --amend
这时候就会弹出一个操作框需要会点基本的
vim操作 我们输入i进行对commit的修改,当我们改完后输入esc表示改完了,输入:wq就可以保存了
3.git push --force 到远程仓库(注意:必须加上 --force 如果只使用 git push 会报错)
二、修改最近两个或者两次上的commit信息
1.首先通过 git log 查看commit信息
git log --pretty=format:"%h %s" // 可以格式化一下commit信息
git log --pretty=oneline // 可以格式化一下commit信息
2.使用指令:git rebase -i HEAD~3(把对应的 pick 改成 edit 后保存,只把第1个和第3个变成edit)
3.使用 git commit --amend -m 'xxx' 去修改具体的commit信息
4.用 git rebase --continue 完成
此时分支变为
master|REBASE-i 3/3,现在只修改完第1条commit
再通过git commit --amend和git rebase --continue修改第3条后
分支状态变回master
并提示Successfully rebased and updated refs/heads/master.说明已修改完成
5.git push --force 到远程仓库(注意:必须加上 --force 如果只使用 git push 会报错)
git push -f // 强制更新到远程仓库
6.去远程仓库查看提交记录
三、当我们提交完一个commit后,发现还漏了一点东西,再次改完后,又要commit,那不就两个commit了吗?我们只想提交一个commit
git commit --amend --no-edit
--no-edit表示我们不修改了,还是和前面那个提交是同一个提交
这样我们就并没有多提交一次了
四、把多个commit整合成一个commit(一)
//最新的2个commit,整合成一个commit
git rebase -i HEAD~2
也可以
git rebase -i 版本号
用git rebase的例子(输入git rebase -i HEAD~7,就会出现如下的界面)
pick 1fc6c95 Patch A
pick 6b2481b Patch B
pick dd1475d something I want to split
pick c619268 A fix for Patch B
pick fa39187 something to add to patch A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before patch B
# Rebase 41a72e6..7b36971 onto 41a72e6
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
(1)这是一个 vim 编辑器的界面,这里是让我们编辑这一段脚本,可以使用的命令有下方注释中的六个命令。当退出当前编辑的页面后,git 就会根据这个脚本一个个的针对提交执行对应的操作(从最早的那次提交开始执行)
(2)如果仅仅是想修改提交信息,就把所有的 命令 pick 改成 命令 r ,然后 esc 退出编辑,然后 :wq 保存,接下来 git 就会让你一个个的从最早的提交信息开始修改
(3)命令 e 是会在修改对应提交时跳出 vim 编辑器,此时 HEAD 指针指向这次提交,此时可以用git commit --amend对这次提交进行各种修改,然后执行 git rebase --continue就会继续下一次操作
(4)命令 s 则是会在修改对应提交的时候把这次的提交和其父提交合并为一次提交(多个commit合并成一个commit)
(5)命令 f 是和s类似但是会忽略当前提交的信息,直接采用父提交的信息
(6)命令 x 是需要在 x 之后输入命令然后在 HEAD 指向这次提交的时候执行
(7)利用这些命令还可以完成重排提交、拆分提交的动作
(9)输入git rebase -i HEAD~7,出现的界面的命令的说明
| 命令 | 命令简写 | 说明 |
|---|---|---|
| pick | p | 保留该commit |
| reword | r | 保留该commit,但需要修改该commit的注释 |
| edit | e | 保留该commit, 但我要停下来修改该提交(不仅仅修改注释) |
| squash | s | 将该commit合并到前一个commit |
| fixup | f | 将该commit合并到前一个commit,但不要保留该提交的注释信息 |
| exec | x | 执行shell命令 |
| drop | d | 丢弃该commit |
如果多个commit合并后,发现合并错了,可以使用
git rebase --abort
这个就是取消前面的rebase,恢复成多个commit合并之前的样子