基于Git rebase修改历史提交信息
说明
关于为什么要修改历史提交的作者信息和提交信息,我就不多说了,也许是项目规范要求,也许是自己强迫症,总之是有这样的需求。
开始之前先说明一下:
- 本文介绍的方法只适用于本地仓库,提交到远程以后,我没测试过,也不太清楚。
- 本文介绍的方法基于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修改历史提交信息相关推荐
- git 修改历史提交信息
当你不小心,写错了提交的注视/信息,该如何处理呢.理论上,SCM是不应该修改历史的信息的,提交的注释也是. 不过在git中,其commit提供了一个--amend参数,可以修改最后一次提交的信息 ...
- Git系列之修改历史提交信息
文章の目录 1.查看 git 提交记录 2.修改最近两个或者两次上的commit信息 3.扩展:修改上一次git commit 提交的信息 参考 写在最后 1.查看 git 提交记录 git log ...
- 浅谈git rebase命令 -- git修改历史提交信息
浅谈git rebase命令 如果你只想修改git log命令打印到终端上的最后一个提交信息,那么使用git commit --amend命令直接修改就好. 如果你还想合并最近的某几个提交为一个提交, ...
- git历史提交信息和提交时间修改
git历史提交信息和提交时间修改 修改历史提交信息 修改历史提交时间 修改历史提交信息 执行:git rebase -i HEAD~10,这里的含义是修改最近10条数据 执行后会进入到修改界面,将要修 ...
- git删除相关历史提交记录,相关文件保持当前状态
git删除相关历史提交记录,相关文件保持当前状态 引言 新年新气象,趁着现在新的一年开始项目的事情还不是非常繁忙的时候,多整点下酒菜.这不实战类型的博客记录又开始了!当然实战类型的博客 ...
- git删除所有历史提交记录,只留下最新的干净代码
git删除所有历史提交记录,只留下最新的干净代码 1.Checkoutgit checkout --orphan latest_branch2. Add all the filesgit add -A ...
- git rebase 修改提交信息
reword pick:保留该commit(缩写:p) reword:保留该commit,但我需要修改该commit的注释(缩写:r) edit:保留该commit, 但我要停下来修改该提交(不仅仅修 ...
- shell获取git最近一次提交信息_Git修改commit提交信息
当进行一次commit提交的时候,可以附带简短的信息说明,代码如下:[Shell] 纯文本查看 复制代码$ commit -m "蚂蚁部落提交" 在-m命令后面跟着的"蚂 ...
- git 修改上次提交信息 与 撤销此操作.
git commit --amend 修改刚才提交的commit信息 撤销 git commit --amend 思路是使用 git reflog 查看在哪里ammend的.找到HEAD{N}, N是 ...
最新文章
- “穿透”与“征兆”:长篇小说《环形女人》(一)
- oracle常用操作指令
- 【AVR ASF4库函数学习笔记】二、GPIO
- 输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据
- linux查看显卡核心数,linux查看硬件信息,linux查看硬盘信息,linux查看CPU信息,linux查看显卡,硬件型号信息 | 帮助信息-动天数据...
- delln4030安装固态硬盘_戴尔灵越怎么更换固态硬盘
- EASYUI 登陆框界面
- 计算机类部分核心期刊说明
- 服务器修复oxc0000098,修复oxc0000098的方法
- 3小时做完3天工作,她是用了什么办法做到的?
- ECLISPE的快捷键大全
- 恢复SQL Server简单模式下误删除堆表记录
- winedit使用教程_【STemWin教程入门篇】第43章 EDIT-编辑控件
- 二次方程计算器-字符串处理
- csv文件太大,显示不全,切分成小文件
- 如何快速掌握 Python 数据采集与网络爬虫技术
- spinner添加分割线和改变右侧箭头
- redis启动报错oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
- axios在vue中的简单配置与使用
- 女博士分享读博经历成“网红”的1年后,却被“网暴”到去公安局立案.....
热门文章
- android地图 demo,Android地图控件之多地图展示
- html5 获取多媒体,基于HTML5的多媒体支持
- 在dreamweaver mx中它只能对html文件可以进行编辑,Dreamweaver试题
- u盘安装ubuntu_简单实用的ubuntu18.04安装
- _Linux系统编程—信号集操作函数
- 到现在才理解高斯分布的均值与方差为什么是0和1
- php进销存 带apk,php进销存配送管理系统,支持h5/ios/android/微信小程序
- 百练OJ:4147:汉诺塔问题(Hanoi)——python实现汉诺塔
- 笔记-中项案例题-2020年下-立项管理
- 笔记-企业管理知识-知识管理