如何修改 git 记录?

用 git 用着用着手残了?没事,还好 git 给咱们机会从新来过,这里记录了一些修改 git 的历史提交记录的方式,今后不再怕手残~html

初级选手 git amend

若是仅仅是在提交以后发现本身手残了,用git commit --amend就能够修改刚才的那一次提交。该命令在执行之后,会将刚刚的那一次提交从当前分支移除,把工做空间恢复到上次准备提交的状态(同时混合了上次提交以后的更改),而后显示出一个 vim 的界面让你去修改上次的提交信息。在vim 中保存后,就会把当前的全部修改一并用新的提交信息提交了。git

该命令仅仅能够修改最后一次提交,一个命令至关于执行了以下一系列动做:vim

$ORIG_HEAD=`git show`#保存当前的此次提交的 commit 号
    $git reset --soft HEAD^#回到最后一次提交准备提交前的状态
    $...#作一些操做和修改
    $git commit -c $ORIG_HEAD#表示用最后一次提交的提交信息来作为提交信息,不过会调出编辑器界面

中级选手 git rebase

前面的git commit --amend仅仅能够修改最后一次提交,可是当本身一时兴起,手残了一路时,这个命令就没法拯救咱们了,这个时候咱们就要祭出git rebase -i 这个大杀器来帮咱们修改那些不堪回首的往事。编辑器

实际上,git rebase -i并非一个专门用来修改历史记录的命令,而是一个让咱们能够交互式(就是一个个来) 进行衍合操做的命令,不过咱们能够用这个命令来实现对于提交历史的修改。spa

该命令的使用方法是git rebase -i <指定提交号>,好比能够用git rebase -i HEAD~3来修改本次提交、上次提交、上上次提交共三次提交。指针

enter image description here

如图,我若是向修改这三次提交,输入git rebase -i HEAD~3,就会出现以下的界面:code

enter image description here

这是一个 vim 编辑器的界面,这里是让咱们编辑这一段脚本,可使用的命令有下方注释中的六个命令。当退出当前编辑其的页面后,git 就会根据这个脚本一个个的针对提交执行对应的操做(从最先的那次提交开始执行)。htm

若是仅仅是想修改提交信息,就把全部的 pick 改为 r ,而后:wq保存,接下来 git 就会让你一个个的从最先的提交信息开始修改。blog

剩余的命令中, e 是会在修改对应提交时跳出 vim 编辑器,此时 HEAD 指针指向此次提交,此时能够用git commit --amend对此次提交进行各类修改,而后执行 git rebase --continue就会继续下一次操做;s 则是会在修改对应提交的时候把此次的提交和其父提交合并为一次提交;f 是和s相似可是会忽略当前提交的信息,直接采用父提交的信息;x 是须要在 x 以后输入命令而后在 HEAD 指向此次提交的时候执行。利用这些命令还能够完成重排提交拆分提交的动做。ip

终极杀手 git filter-branch

假如说咱们提交了 N 屡次之后,忽然发现咱们这些提交的邮箱都写错了(╯°□°)╯︵ ┻━┻,这个时候若是使用以前提到的命令,估计还没改完就要累死了。这个时候咱们就可使用git filter-branch来重写分支,其能够批量的对每一个提交执行咱们预设的操做。

git filter-branch命令使用的基本使用格式是git filter-branch --<各类filer> '命令' <修改的范围> ,不一样的 filter 会提供给命令不一样的输入和输出。好比,--msg-filter表示修改提交信息,原提交信息从标准输入读入,新提交信息输出到标准输出;--tree-filter表示修改文件列表等等。最后会有一个重写的范围。好比,git filter-branch --env-filter 'GIT_AUTHOR_EMAIL=john@example.com export GIT_AUTHOR_EMAIL' HEAD 就能够用来重写邮箱。建议在调用命令以前先啦出一个分支作尝试再在本身要修改的分支上执行操做。

若是想知道更多关于该命令的信息和栗子,请戳这里这里

相关文章
相关标签/搜索