git commit --amend 和 git rebase使用介绍

420 阅读2分钟

参考:www.atlassian.com/git/tutoria…

“git 主要的作用是保障你不会丢失任何一次提交,但也支持你完全控制开发时的工作流。

这包括你可以自己定义一个项目的历史长什么样,但这也意味着可能产生提交丢失的潜在风险。

git 提供一系列改写历史的命令,但使用不当可能会丢失内容。”

git commit --amend(修正,改进)

git commit --amend 允许你修改最近的一次提交

用例1:修改最近一次提交的 message

git commit --amend 可进入交互模式修改最近一次提交的 message

git commit --amend -m "new message" 可在非交互模式修改最近一次提交的 message

(类似 git commit -m "xx")

用例2:追加遗漏的改动文件

如果最近一次提交遗漏了某些发生改动的文件,比如你同时改了 a 文件和 b 文件,但 git add 时只添加了 a 文件(a 文件进入了暂存区,但 b 文件还在工作区)并且进行了提交

此时如下将 b 也加入暂存区并且通过 git commit --amend 将这个文件也合入前一次提交而不会产生一次新的提交

git add b
git commit --amend --no-edit

注意⚠️:不要对公共提交使用 amend

因为 amend 会修改最近一次提交并产生一个完全崭新的提交取而代之,因此不要对公共(非个人)的提交进行该操作,否则会“改写历史”

git rebase(变基)

rebase 可以将一系列提交合并成一个新的提交

简单解释:rebase,变基,旨在变更当前分支的基准分支,因为当前分支一般是从某个分支切出来的,这个源分支就是当前分支的基准分支,也就是 base。

而 base 指的是你切出分支时源分支的 HEAD 提交,即该分支彼时最后一次提交,因此虽然 rebase 一般指定的分支仍然是你切出分支的那个源分支,但是会将你的 base 变为该分支当前的 HEAD,这就是变基。

注意⚠️:不要对公共提交使用 rebase

rebase 标准模式会将当前工作区的提交应用到指定分支,新的提交会取代旧的,因此不要对公共提交使用 rebase 操作,否则会造成原本一些提交历史消失。

git rebase -i 允许你单独调整每个提交,而不是一次性全部应用到指定分支,详见:www.atlassian.com/git/tutoria…

修改已提交的文件

在 rebase 的过程中,使用 e(dit) 可以暂停在该提交并允许你使用 git commit --amend 来进行额外修改

squash 多次提交

s(quash) 命令是能让你真正感受到 rebase 作用的工具,它允许你将哪些指定的提交合入之前的提交中,从而保持“干净的历史”。