如何优雅地玩转 commit 信息

881 阅读4分钟

js

git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。在开发过程中,我们经常会使用到 git 的 commit 命令,使用多了分支的历史信息就会显得杂乱无章,最后合并到主分支时会影响主分支历史信息的优雅性。那么这个情况发生时我们应该如何解决呢?

接下来我们看一下一些常见的场景:

  • 场景1:

本地已经提交过一次 commit,之后我又修改了内容,但是又不想再提交一次 commit 信息。

这种情况可以使用 git commit --amend (--no-edit), 这个命令来更改 commit 信息,把这一次的修改合并到该 commit 中,然后保存退出。这样就达到了保存这次修改的全部内容,并且只提交了一个 commit 信息。

  1. 使用 git log 查看提交历史

log

  1. 修改内容后,使用 git status 查看

status

  1. 使用 git add . 然后 git commit --amend

amend

  1. 修改 commit 信息(如果信息能够描述你后提交的内容,也可以不修改 commit 信息)后,wq 保存并退出。

fix

  1. 现在我们再用 git log 查看历史记录

log

perfect !!

  • 场景2

本地已经多次 commit,但是显得杂乱无章,想要把多次 commit 合并成一次 commit 提交。

首先,使用 git log 查看历史提交信息

log

这个场景介绍两种方法解决

方法一:git reset --soft

  1. 使用 git reset --soft somecommitid

reset

注意箭头所指的地方是你要回退的版本的 commitid

  1. 使用 git status 和 git log 查看当前状态

status

log

通过 git status 可以看到已经回退了,需要 git commit 保存该修改;通过 git log 可以看到目前已经回退到第一次提交的版本。

  1. 之后的操作跟场景一相同,使用 git commit --amend 提交信息,这里就不再累赘阐述了。

方法二:git rebase -i

  1. 使用 git rebase -i 命令

出现如下界面,红色框内是操作区域,蓝色框内是指令说明区域

rebase

指令说明
pick:意味着包括提交。重新进行命令时,重新安排pick命令的顺序会更改提交的顺序。如果选择不包括提交,则应删除整行。
reword:与相似pick,但是使用后,重新设置过程将暂停并为您提供更改提交消息的机会。提交所做的任何更改均不受影响。
edit:将有机会修改提交,这意味着您可以完全添加或更改提交。您还可以进行更多提交,然后再继续进行变基。这使您可以将大型提交拆分为较小的提交,或者删除在提交中所做的错误更改。
squash:该命令使您可以将两个或多个提交合并为一个提交。提交被压缩到其上方的提交中。Git使您有机会编写描述这两个更改的新提交消息。
fixup:这类似于squash,但是要合并的提交已丢弃其消息。提交仅合并到其上方的提交中,并且较早提交的消息用于描述这两个更改。
exec:这使您可以对提交运行任意的Shell命令。
  1. 把第二次提交和第三次提交都改为 s,之后 wq 保存并退出

ws

  1. 接下来,我们会进入以下界面,输入这三次提交的组合commit 信息(箭头所指之处是这三次提交合并为一次提交后的 commit 信息),再次 wq 保存并退出。

ws

  1. 再次用 git log 看下历史状态

log

perfect !!

git reset --soft commitid 和 git rebase -i 的区别:

git reset --soft commitid: 将代码回退到某个版本,然后再进性一次提交,这个时候我们可以选择上一个 commit 信息或者新建一个 commit。

git rebase -i: 只是合并 commit 没有对代码进性提交,而且 git rebase 可以合并一个区间,比如我提交了6次,但是我想保留第一次和第六次,那么我们就可以使用 git rebase -i [startpoint] [endpoint] 将中间的commit 信息合并,如果不指定就是开区间。

  • 情场景三

当我们的代码已经推到远程仓库后,这个时候我们该怎么办呢?

遇到这样的情况也是可以解决的,我们可以按照一二场景合并成我们需要的 commit message 后,使用 git push -f 命令,这个命令可以覆盖掉之前提交的 commit message。但是不建议这样做,有一定风险存在。如果只是为了好看的 commit 最终引发系统 bug,那也就得不偿失了。