共计 2354 个字符,预计需要花费 6 分钟才能阅读完成。
大家好,明天咱们来聊聊 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 了,没有人会晓得你到底批改了什么,只倡议在本人独有的分支上如此操作,肯定肯定要审慎应用。
明天的文章就到这里,衷心祝愿大家每天都有所播种。如果还喜爱明天的内容的话,请来一个 三连反对 吧~(点赞、关注、转发)