Skip to content
Go back

如何修改已经提交的 commit 信息

Edit page
[alias]
	# 删除最近一个提交,保留文件修改
	undo = reset --soft HEAD^
	# 删除最近一个提交,不保留文件
  cancel = reset --hard HEAD^
  # 提交完了,发现还需要一点小修改,不想新建一个提交
  onemore = commit -a --amend --no-edit

场景一:第一条我开发完了一个功能,高高兴兴的提交了代码,但是这个时候我发现有点小问题,比如单词拼写错了。比如运行 linter 告诉我少加了一个空格,我不想为了这个小错误添加一个新的 commit。那样显得提交历史特别傻?那么该怎么办呢?

# 添加这个对应的小的修改
git add .
# 提交并且使用两个特殊的参数
# --amend 修改最新的一次 commit,将现在 staged change 直接添加到上一次 commit 去,不生成新的 commit
# --no-edit amend 的提交不修改提交信息
git commit --amend --no-edit

特别注意,假如你的代码已经 push 了的话,要慎用,因为会修改提交历史。 这里还可以变种出另外的场景,第二条 比如你发现上次的提交的 commit 有一个 typo,单词拼写错了,处女座的你,必须给他修改一下。

# 直接运行
git commit --amend
# 在弹出的界面中提交新的信息

**场景二:**Git 时光机,有的时候我们特别需要一个时光机器,来记录你的操作步骤,而不是仅仅有你的提交信息,尤其当你 clone 下来一个代码库,然后一阵操作,merge 一些 branch,添加删除一些代码,当你发现你误删了东西,弄坏了整个 build 等等,那么你就需要 reflog + reset 这两个命令的组合。

我们来举个例子,比如我现在一阵操作,提交了一个对应的 commit,然后又修改了一个文件,现在我发现不行了,我希望倒带到之前的某个提交去。来看看第三条:

# 显示你的 git 操作记录
# 特别注意它和 git log 的区别,它不仅仅是提交的记录,还有其他git的操作记录
git reflog
# 会看到一系列的操作记录
# 对应的记录号
# 7b6e4f8 HEAD@{0}
# e7d2c90 HEAD@{1} 等等
git reset HEAD@{index}
# 这个时候你就会回到之前的那个状态了

这里还有两个参数 —hard,就是啥都不要了,当前已经修改没有提交的文件我也不要了,我就想回到那个操作对应的状态。一下就清净了。 —soft 保留当前的修改回到对应的状态。

通过这个命令以及上面这两个参数, 可以衍生出其他的操作,

比如新的场景 :我想删除最前面的一个或者几个提交,我就可以直接跳转到对应的上次提交的 log,这个时候大家看它我们最前面的提交已经消失了。来看看第四条:

git reflog

# 7b6e4f8 (HEAD -> master) HEAD@{0}: commit: update test2.txt
# ....
# e7d2c90 HEAD@{13}: commit: add test2.txt
# 找到对应的提交
git reset HEAD@{13}

场景三:Git 后悔药。程序员很长时间都是在和 bug 奋战,而 bug 的来源经常是某次 commit 的提交,有可能是很久以前的,那么想要修改很久之前的一次提交,那么该怎么办呢?

我们可以通过几种方式来吃后悔药,第一个最传统也是最复杂的方式,就是使用 git rebase -i,rebase 是比较让人蛋疼的命令之一,它的复杂性以及操作性都让新手敢到害怕,比如说我们要修改或者删除之前的一次提交,要使用 rebase 会这样。

# 先看提交
git log
# f9f6f3b commit 3
# 2feb45f commit 2
# 07a3cb6 commit 1
# 我们要修改 2 的话,rebase 到它的下一个 commit,这里是 1
git rebase 07a3cb6 -i
# 然后在打开的对话框里面修改,之后还要一个个 rebase continue,非常容易出错

现在我给大家来使用一个命令就完成对应的功能,我们希望将某个特定提交中,特定的文件恢复到修改之前的内容。大家平时应该会这么做:在 github 的界面中,看之前版本的提交,然后拷贝到文件当中去。现在我们来用一个命令完成对应的任务,来看看第五条:

# 先看提交
git log
# f9f6f3b commit 3
# 2feb45f commit 2
# 07a3cb6 commit 1
# commit2 出问题了,我们要恢复某个文件在 commit 1中的内容,先看看它修改了什么
git show 2feb45f
test.txt
-hello there updated
+hello there deleted
# 可以发现它将 test.txt 从 updated 换成了 deleted,我们希望恢复,使用一条命令
git checkout 07a3cb6[之前提交的hash,也就是 commit1 的hash] -- test.txt[文件的路径]
# 这个时候你就会发现 test.txt 恢复到了 hello there updated
# 🎉 一条命令搞定

最后一个场景:我希望删除对应的commit,这次 commit 带来了各种 bug,我想一步清净一下。第六条:

# 先看提交
# f9f6f3b commit 3
# 2feb45f commit 2
# 07a3cb6 commit 1
# commit2 出问题了,我们要一次性删除掉对应的提交,找到上面第二条对应的 hash 值
git revert 2feb45f[第二条对应的 hash]
# 这个时候它会创建一个新的 commit,并且弹出提交的对话框,修改保存就可以了。

Edit page
Share this post on:

Previous Post
Ollama Docker Compose 部署指南
Next Post
Oracle Cloud 免费 VPS 申请成功经验分享