大家好,明天咱们来聊聊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了,没有人会晓得你到底批改了什么,只倡议在本人独有的分支上如此操作,肯定肯定要审慎应用。

明天的文章就到这里,衷心祝愿大家每天都有所播种。如果还喜爱明天的内容的话,请来一个三连反对吧~(点赞、关注、转发