说明

关于为什么要修改历史提交的作者信息和提交信息,我就不多说了,也许是项目规范要求,也许是自己强迫症,总之是有这样的需求。

开始之前先说明一下:

  • 本文介绍的方法只适用于本地仓库,提交到远程以后,我没测试过,也不太清楚。
  • 本文介绍的方法基于rebase实现,适用于修改任意历史提交,不限于最近一条。

开始之前我们需要一个git代码库作为实验对象,该代码库的概况如下,输入如下命令查看:

git log --graph --pretty='%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an %ae>%Creset'
复制代码

输出如下:

* e5f026b - (HEAD -> dev) 添加分辨率获取 (17 hours ago) <foo foo@foo.com>
* 51c6763 - 获取core number、device model、ram、diskspace (17 hours ago) <foo foo@foo.com>
* 7075919 - Add commnet (17 hours ago) <foo foo@foo.com>
* 06c4637 - Get SSID and BSSID (17 hours ago) <foo foo@foo.com>
* 4406428 - Get DNS (17 hours ago) <foo foo@foo.com>
* 28169b0 - Get router IP (17 hours ago) <foo foo@foo.com>
* db9b32c - Rename: Device+Info -> Device+Networking (17 hours ago) <foo foo@foo.com>
* 53d87f9 - Get WiFi and Celluar IP Address (17 hours ago) <foo foo@foo.com>
复制代码

下文中的操作都是基于该代码库实现。

修改历史提交的作者信息

界定修改范围

在修改之前,首先需要明确自己的修改范围,rebase操作执行时,允许我们指定rebase范围,比如要修改最近两条提交的作者信息,输入如下命令:

git reabse -i 7075919
复制代码

该命令中-i参数表明我们需要以交互式的方式来执行rebase操作。7075919为rebase操作的起始点,表示对(7075919, HEAD]之间的提交进行rebase,注意不包含7075919这条提交本身。

那么问题来了,如何对所有的提交进行rebase呢?单纯地输入:

git reabse -i 53d87f9
复制代码

是不行的,因为该命令不会将提交53d87f9纳入rebase。

如果要从第一条提交开始rebase,输入如下命令即可:

git rebase -i --root
复制代码

该命令会将所有提交纳入rebase。

选择要更改的提交

执行git reabse -i 7075919命令后,git默认的编辑器会打开,显示内容如下:

pick 51c6763 获取core number、device model、ram、diskspace
pick e5f026b 添加分辨率获取

# Rebase 7075919..e5f026b onto 7075919 (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
复制代码

可以看到,待修改的提交前面都有一个命令,默认是pick,表示rebae过中直接使用该提交,不做修改,提交列表下面的注释说明中还列举了其他命令,感兴趣的话大家可以去看下,此处便不赘述了。

此处我们要修改提交e5f026b的作者信息,直接编辑该提交前面的命令,将pick改成edit,也可以简写为e,效果一样的,编辑的后的内容如下,此处我省略了注释文案:

pick 51c6763 获取core number、device model、ram、diskspace
edit e5f026b 添加分辨率获取

# ...
复制代码

然后保存修改,并关闭编辑重启,我用的是vim,直接:wq退出,控制台会输出如下内容:

➜  Test git:(dev) git rebase -i 7075919
Stopped at e5f026b...  添加分辨率获取
You can amend the commit now, withgit commit --amendOnce you are satisfied with your changes, rungit rebase --continue
➜  Test git:(e5f026b)
复制代码

这表明git当前处于交互式rebase过程中,初始时指向第一条需要修改的提交。控制台输出表明当前正在对提交e5f026b进行rebase,这正是我们需要修改的第一条提交。

更改作者信息

输入如下命令,修改作者信息:

git commit --amend --author="bar <bar@bar.com>" --no-edit && git rebase --continue
复制代码

此处我们只有一条提交需要rebase,上述命令执行结束后,控制台输出如下:

➜  Test git:(e5f026b) git commit --amend --author="bar <bar@bar.com>" --no-edit && git rebase --continue
[detached HEAD fa3caab] 添加分辨率获取Author: bar <bar@bar.com>Date: Mon Apr 29 10:49:08 2019 +08003 files changed, 28 insertions(+)
Successfully rebased and updated refs/heads/dev.
➜  Test git:(dev)
复制代码

表明rebase结束,修改已生效,当前提交的HEAD指针已指向了dev。此处由于我们只有一条提交需要修改,所以该提交的修改结束也意味着整个rebase过程的结束,如果有多条提交需要修改,每完成一条提交的rebase以后,rebase便会停下来,并进入下一条提交的处理。

此时查看修改后的代码库状态如下:

* fa3caab - (HEAD -> dev) 添加分辨率获取 (12 minutes ago) <bar bar@bar.com>
* 51c6763 - 获取core number、device model、ram、diskspace (17 hours ago) <foo foo@foo.com>
* 7075919 - Add commnet (17 hours ago) <foo foo@foo.com>
* 06c4637 - Get SSID and BSSID (17 hours ago) <foo foo@foo.com>
* 4406428 - Get DNS (17 hours ago) <foo foo@foo.com>
* 28169b0 - Get router IP (17 hours ago) <foo foo@foo.com>
* db9b32c - Rename: Device+Info -> Device+Networking (17 hours ago) <foo foo@foo.com>
* 53d87f9 - Get WiFi and Celluar IP Address (17 hours ago) <foo foo@foo.com>
复制代码

可以发现,提交的作者信息已经成功修改,并且生成了新的SHA-1。

修改历史提交的提交信息

修改历史提交信息与修改作者信息类似,同样基于rebase实现。此处仍以修改最近两条提交的提交信息为例,阐明修改过程。

执行git reabse -i 7075919命令界定修改范围以后,在编辑器内选择要修改的提交,此处我们选择修改提交51c6763的提交信息,将pick改成reword,如下所示:

reword 51c6763 获取core number、device model、ram、diskspace
pick fa3caab 添加分辨率获取

# ...
复制代码

保存并退出编辑器。

更改提交信息

上一步退出编辑器后,rebase开始执行,此时会再次打开默认的编辑器,显示如下:

获取core number、device model、ram、diskspace

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Author:    foo <foo@foo.com>
# Date:      Wed Apr 24 15:32:49 2019 +0800
#
# interactive rebase in progress; onto 7075919
# Last command done (1 command done):
#    reword 51c6763 获取core number、device model、ram、diskspace
# Next command to do (1 remaining command):
#    pick fa3caab 添加分辨率获取
# You are currently editing a commit while rebasing branch 'dev' on '7075919'.
#
# Changes to be committed:
#   modified:   DeviceInfo.xcodeproj/project.pbxproj
#   new file:   DeviceInfo/UIDevice+Hardware.h
#   new file:   DeviceInfo/UIDevice+Hardware.m
#   modified:   DeviceInfo/ViewController.m
#
复制代码

直接编辑提交信息进行修改即可,此处我们将提交信息修改为:

修改历史提交信息:获取core number、device model、ram、diskspace

# ...
复制代码

修改完成后保存退出,即完成了对历史提交的修改,控制台输出如下:

➜  Test git:(dev) git rebase -i 7075919
[detached HEAD ac74c92] 修改历史信息:获取core number、device model、ram、diskspaceAuthor: foo <foo@foo.com>Date: Wed Apr 24 15:32:49 2019 +08004 files changed, 79 insertions(+), 1 deletion(-)create mode 100644 DeviceInfo/UIDevice+Hardware.hcreate mode 100644 DeviceInfo/UIDevice+Hardware.m
Successfully rebased and updated refs/heads/dev.
➜  Test git:(dev)
复制代码

表明修改成功。

此时查看修改后的代码库状态如下:

* d5cedac - (HEAD -> dev) 添加分辨率获取 (71 seconds ago) <bar bar@bar.com>
* ac74c92 - 修改历史信息:获取core number、device model、ram、diskspace (8 minutes ago) <foo foo@foo.com>
* 7075919 - Add commnet (20 hours ago) <foo foo@foo.com>
* 06c4637 - Get SSID and BSSID (20 hours ago) <foo foo@foo.com>
* 4406428 - Get DNS (20 hours ago) <foo foo@foo.com>
* 28169b0 - Get router IP (20 hours ago) <foo foo@foo.com>
* db9b32c - Rename: Device+Info -> Device+Networking (20 hours ago) <foo foo@foo.com>
* 53d87f9 - Get WiFi and Celluar IP Address (20 hours ago) <foo foo@foo.com>
复制代码

可以发现,历史提交的提交信息已经成功修改,并且生成了新的SHA-1。

总结

本文基于rebase,阐明了如何修改历史提交的的作者信息和提交信息。其实从执行过程中可以看到,rebase的功能并不止于此,我们只用到了edit、pick、reword三种命令,除此之外,rebase还支持fixup、exec、drop能命令,可供完成更复杂的需求。

参考

www.git-tower.com/learn/git/f…

转载于:https://juejin.im/post/5cd12672f265da038733b6c2

基于Git rebase修改历史提交信息相关推荐

  1. git 修改历史提交信息

    当你不小心,写错了提交的注视/信息,该如何处理呢.理论上,SCM是不应该修改历史的信息的,提交的注释也是.    不过在git中,其commit提供了一个--amend参数,可以修改最后一次提交的信息 ...

  2. Git系列之修改历史提交信息

    文章の目录 1.查看 git 提交记录 2.修改最近两个或者两次上的commit信息 3.扩展:修改上一次git commit 提交的信息 参考 写在最后 1.查看 git 提交记录 git log ...

  3. 浅谈git rebase命令 -- git修改历史提交信息

    浅谈git rebase命令 如果你只想修改git log命令打印到终端上的最后一个提交信息,那么使用git commit --amend命令直接修改就好. 如果你还想合并最近的某几个提交为一个提交, ...

  4. git历史提交信息和提交时间修改

    git历史提交信息和提交时间修改 修改历史提交信息 修改历史提交时间 修改历史提交信息 执行:git rebase -i HEAD~10,这里的含义是修改最近10条数据 执行后会进入到修改界面,将要修 ...

  5. git删除相关历史提交记录,相关文件保持当前状态

          git删除相关历史提交记录,相关文件保持当前状态 引言   新年新气象,趁着现在新的一年开始项目的事情还不是非常繁忙的时候,多整点下酒菜.这不实战类型的博客记录又开始了!当然实战类型的博客 ...

  6. git删除所有历史提交记录,只留下最新的干净代码

    git删除所有历史提交记录,只留下最新的干净代码 1.Checkoutgit checkout --orphan latest_branch2. Add all the filesgit add -A ...

  7. git rebase 修改提交信息

    reword pick:保留该commit(缩写:p) reword:保留该commit,但我需要修改该commit的注释(缩写:r) edit:保留该commit, 但我要停下来修改该提交(不仅仅修 ...

  8. shell获取git最近一次提交信息_Git修改commit提交信息

    当进行一次commit提交的时候,可以附带简短的信息说明,代码如下:[Shell] 纯文本查看 复制代码$ commit -m "蚂蚁部落提交" 在-m命令后面跟着的"蚂 ...

  9. git 修改上次提交信息 与 撤销此操作.

    git commit --amend 修改刚才提交的commit信息 撤销 git commit --amend 思路是使用 git reflog 查看在哪里ammend的.找到HEAD{N}, N是 ...

最新文章

  1. “穿透”与“征兆”:长篇小说《环形女人》(一)
  2. oracle常用操作指令
  3. 【AVR ASF4库函数学习笔记】二、GPIO
  4. 输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据
  5. linux查看显卡核心数,linux查看硬件信息,linux查看硬盘信息,linux查看CPU信息,linux查看显卡,硬件型号信息 | 帮助信息-动天数据...
  6. delln4030安装固态硬盘_戴尔灵越怎么更换固态硬盘
  7. EASYUI 登陆框界面
  8. 计算机类部分核心期刊说明
  9. 服务器修复oxc0000098,修复oxc0000098的方法
  10. 3小时做完3天工作,她是用了什么办法做到的?
  11. ECLISPE的快捷键大全
  12. 恢复SQL Server简单模式下误删除堆表记录
  13. winedit使用教程_【STemWin教程入门篇】第43章 EDIT-编辑控件
  14. 二次方程计算器-字符串处理
  15. csv文件太大,显示不全,切分成小文件
  16. 如何快速掌握 Python 数据采集与网络爬虫技术
  17. spinner添加分割线和改变右侧箭头
  18. redis启动报错oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  19. axios在vue中的简单配置与使用
  20. 女博士分享读博经历成“网红”的1年后,却被“网暴”到去公安局立案.....

热门文章

  1. android地图 demo,Android地图控件之多地图展示
  2. html5 获取多媒体,基于HTML5的多媒体支持
  3. 在dreamweaver mx中它只能对html文件可以进行编辑,Dreamweaver试题
  4. u盘安装ubuntu_简单实用的ubuntu18.04安装
  5. _Linux系统编程—信号集操作函数
  6. 到现在才理解高斯分布的均值与方差为什么是0和1
  7. php进销存 带apk,php进销存配送管理系统,支持h5/ios/android/微信小程序
  8. 百练OJ:4147:汉诺塔问题(Hanoi)——python实现汉诺塔
  9. 笔记-中项案例题-2020年下-立项管理
  10. 笔记-企业管理知识-知识管理