Git提交错了不用慌,这三招帮你修改记录
大家好,今天我们来聊聊git当中一个很重要的功能——历史记录的修改。
有的时候我们会突然发现某个地方需要修改,最常见的某个不应该被提交的文件被提交了进来。我们希望它不只是在后序的版本当中不再出现,而是希望整个从git仓库当中移除掉。这个时候我们就需要修改git之前的历史记录。这个时候应该怎么办呢?
不要着急,git当中有很多的手段可以修改之前的历史提交记录。
修改最后一次提交
这一点我们在之前的文章当中曾经提到过,如果我们只是想要修改最后一次的提交记录,这是比较简单的。我们只需要直接修改我们想要修改的部分,在提交的时候加上一个参数--amend即可。
git commit --amend
amend的意思是补丁,它可以把我们这一次的修改合并到上一条历史记录当中,而不会产生一个新的commit记录。运行之后,它会打开一个vim编辑器,我们还可以修改上一次commit时输入的提示信息。

我们使用git log检查的话,会发现历史记录的修改时间还是上一次的时间。看起来就好像什么也没有发生过一样,悄无声息地就改掉了。

修改多个信息
--amend虽然好用,但是它只能修改最后一次的提交信息,如果我们想要修改的提交记录在那之前,我们应该怎么办呢?
git当中并没有提供直接的工具来实现这一点,不过我们可以使用rebase来达成。我们可以加上-i进行交互式地变基,我们可以在任何想要的修改完成之后停止,也可以添加文件或者是做其他想要做的事情。但是我们变基的目标不是某一个分支而是当前分支的某一个历史节点,所以我们需要提供一个具体的commitid或者是指针位置。
git rebase -i的功能非常强大,我们几乎可以使用它来完成所有一切我们想要完成的事情。
比如我们想要修改倒数第二次提交,我们可以执行git rebase -i HEAD~3。也就是以倒数第三个节点作为基准节点执行变基,这时候git会进入一个vim窗口,在这个窗口当中我们可以看到最近的三次提交记录。

首先我们可以看到上面的三行就是我们可以修改的三个commit,分别展示的是要执行的操作以及commitid以及commit message。这里的操作默认的是pick,也就是使用该commit。关于我们可以执行的操作git在下方也给了充分的提示,其中比较常用的有pick、edit以及squash。
这一次我们想要做的是修改提交记录,所以我们应该执行edit,我们把想要修改的commit前的pick改成edit。比如这样:

退出之后,git会自动带我们回到我们选择edit的分支提交之后的版本。我们进行我们想要的修改,这里我在第15篇文章当中加上了一行:尝试rebase。之后再使用git add以及git commit --amend进行修改提交结果。

再之后我们执行git rebase --continue,把剩下要应用的变更应用完成。

一切都结束之后,我们可以使用一下git show命令查看一下我们修改的bee9ce3这个commit的记录。可以看到已经多了这一行,说明我们的修改成功了。

顺序变更、合并、拆分
顺序变更
我们不仅可以修改某一次commit当中的内容,还可以修改这些commit的相对顺序,以及可以让它们合并以及拆分。
修改顺序其实很简单,我们只需要人为地修改rebase -i之后弹出的vim文件即可。比如说原本的记录是:
pick A change A
pick B change B
pick C change C
如果我们想要更换顺序,我们只需要修改这个文件即可。比如变成:
pick B change B
pick A change A
pick C change C
那么当我们在退出vim的时候,git会首先应用B commit的变更,再应用A最后应用C。
合并
除此之外,我们还可以合并多个commit记录成一个。操作的方法也很简单,就是我们只需要把pick修改成squash。git会自动把所有squash的commit记录合并在一起。
pick A change A
squash B change B
squash C change C
拆分
有的时候一个commit非常巨大,我们可能也会想要将它拆分,其实操作也很简单。比如我们想要把commit B拆分成两条,首先,我们在rebase的时候将commit B前面的pick修改成edit。
pick A change A
edit B change B
pick C change C
当我们退出的时候,我们会进入到B commit刚刚提交完的状态。由于我们要做的是拆分B这个提交,所以我们需要执行git reset HEAD^,把上一次提交重置。然后再分别add我们想要拆分开来提交的文件。
整个操作如下:
git reset HEAD^
git add test/*
git ci -m 'add test'
git add code/*
git ci -m 'update code'
git rebase --continue
这样我们就把commit B拆分成了两个commit插入到了历史记录当中了。
最后的最后,大家需要注意,虽然这些手段在修改记录的时候非常好用。但是如果这些commit已经被提交到了远程,我们是不可以直接git push同步的。因为git会校验我们提交的hash值,发现对不上之后会禁止我们的提交。所以如果想要提交到远程的话,只能使用git push -f强制覆盖。但是这是一个非常非常危险的操作,如果你git push -f了,没有人会知道你到底修改了什么,只建议在自己独有的分支上如此操作,一定一定要谨慎使用。
今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发)

Git提交错了不用慌,这三招帮你修改记录的更多相关文章
- 设置Git提交时不用输入用户名和密码
在用git提交时代码至github上时每次都要输入用户名和密码,当提交操作较为频繁时非常不方便,可以按下文中的介绍,设置成提交时不用输入用户名和密码: 1.在当前库下,已经运行过 git remote ...
- git,提交错了分支,想把远程的分支恢复到上一个版本
1.先将本地分支回滚到上一个版本 2.删除远程分支(可以先备份一下) 3.创建新的分支,将本地分支push上去
- 如何三招帮你排查Linux中的硬件问题
下列贴士帮助你更快速更轻松地为Linux中的硬件排查故障.许多不同的因素可能导致Linux硬件出现问题:在你开始尝试诊断之前,了解最常见的问题以及最有可能找到原因的环节是明智之举. Linux服务器在 ...
- 不用copy代码--eclipse使用git提交项目-转
原文地址:http://blog.csdn.net/u014079773/article/details/51595127 准备工作: 目的:eclipse使用git提交本地项目,提交至远程githu ...
- vue+node+mongoDB 火车票H5(三)---git提交时忽略不想提交的文件
想要把项目通过git提交到GitHub上,但提交时并不想提交node_modules文件夹,这个文件夹太大 git 提交代码时不提交配置文件夹node_modules 在.gitignore文件中添加 ...
- Git三招
一.Git提交指令 git init git第一次使用在当前文件夹初始化一个git仓库,第二次不需要 git add . 把当前文件夹所有文件添加到缓存区中. 可以选特定的文件夹或文件.将后面的.改变 ...
- Git提交引用和引用日志
转载自:https://github.com/geeeeeeeeek/git-recipes/wiki/5.5-Git%E6%8F%90%E4%BA%A4%E5%BC%95%E7%94%A8%E5%9 ...
- Git提交项目到GitHub
一.GitHub新建项目 1.进入Github首页,点击New repository新建一个项目 2.填写相应信息后点击create即可 Repository name: 仓库名称 Descripti ...
- Git提交代码到主分区
git 提交代码,本地新建一个my分支,不从本地master分支直接上传,而是先从本地my分支上提交至本地master分支,然后本地master提交至远程master分支 上.前提是远程只有一个mas ...
随机推荐
- C语言初级编程实践:2048小游戏
大部分同学学习C语言编程以后不知道能通过什么样的项目才可以锻炼自己的思维功力,2048相信大家都应该熟悉,不管是手机上还是网页版的相信大家都玩过,这个简单的控制台版本的游戏是我曾经在伟易达上班时一个嵌 ...
- CSS色调旋转滤镜
一 关于filter 首先看一下官方对于CSS的filter属性的定义: CSS属性将模糊或颜色偏移等图形效果应用于元素.滤镜通常用于调整图像,背景和边框的渲染. 本文主要讲的是filter中的一个属 ...
- 基于gin的golang web开发:认证利器jwt
JSON Web Token(JWT)是一种很流行的跨域认证解决方案,JWT基于JSON可以在进行验证的同时附带身份信息,对于前后端分离项目很有帮助. eyJhbGciOiJIUzI1NiIsInR5 ...
- chrome浏览器查看当前页面cookie
方法一:点进去设置--高级--网站设置--权限cookie--查找所有cookie和网站数据,就可以看到所有的cookie信息了,举例: 方法二:键盘F12,找到network--点击Doc(如果没有 ...
- 4、Spring Cloud Eureka
1.Eureka简介 (1).CAP简介 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition toleran ...
- Linux(宝塔)部署.Net Core完整记录
前言 最近在V站上看到一个外卖推广的小程序,意思大概是类似淘宝联盟那种,别人走自己的链接后,自己可以抽取大概4%-6%的提成.觉得还蛮有意思的,一开始开源的是静态页面写死的,所以我这边用.Net Co ...
- [BJDCTF 2nd]duangShell
[BJDCTF 2nd]duangShell 点击进去之后提示我们swp源代码泄露,访问http://xxx/.index.php.swp下载该文件 该文件产生的原因是:使用vi编辑器打开文件时,会 ...
- 转载 HTTP协议
转载自:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, ...
- XML文件格式
首行是需要对xml版本声明<?xml version="1.0" ecoding="UTF-8"?> 语言可根据需要修改 在编写xml的几个注意点 ...
- 2020 AC Saber夏季赛 游记
看着 \(\text{Acwing}\) 成长的我,还是写一下游记吧(?). 刚刚中考完,手速本来就老年,更慢,算法每次写完都要调,而且还查不出错.. Day 1 初赛.紧张,因为中考四五个月没打了, ...