{"meta":{"title":"关于 Git 变基","intro":"git rebase 命令使您能够轻松更改一系列提交，修改仓库历史。 您可以重新排序、编辑提交或将提交压缩到一起。","product":"开始","breadcrumbs":[{"href":"/zh/get-started","title":"开始"},{"href":"/zh/get-started/using-git","title":"使用 Git"},{"href":"/zh/get-started/using-git/about-git-rebase","title":"关于 Git 变基"}],"documentType":"article"},"body":"# 关于 Git 变基\n\ngit rebase 命令使您能够轻松更改一系列提交，修改仓库历史。 您可以重新排序、编辑提交或将提交压缩到一起。\n\n通常，你会使用 `git rebase` 来：\n\n* 编辑之前的提交消息\n* 将多个提交合并为一个\n* 删除或还原不需要的提交\n\n> \\[!WARNING]\n> 由于更改提交历史记录可能会给其他使用该存储库的人带来困难，因此通常认为如果提交已经推送到存储库，执行提交变基是不好的做法。 若要了解如何安全地变基，请参阅 [合并拉取请求](/zh/pull-requests/reference/pull-request-merges)。\n\n## 对分支变基提交\n\n若要重新设置另一个分支和当前分支状态之间的所有提交，可以在 shell 中输入以下命令（Windows的命令提示符或 Mac 和 Linux 的终端）：\n\n```shell\ngit rebase --interactive OTHER-BRANCH-NAME\n```\n\n## 在某一时间点上重新定基提交\n\n要对当前分支中最近的几个提交进行变基，可以在命令行中输入以下命令：\n\n```shell\ngit rebase --interactive HEAD~7\n```\n\n## 变基时可用的命令\n\n变基时有六个命令可用：\n\n<dl>\n<dt><code>pick</code></dt>\n<dd>\n<code>pick</code> 只表示包含提交。 在进行变基时，重新排列 <code>pick</code> 命令的顺序会更改提交的顺序。 如果选择不包含提交，应删除整行。 </dd>\n\n<dt><code>reword</code></dt>\n<dd>\n<code>reword</code> 命令类似于 <code>pick</code>，但在使用后，变基过程就会暂停，让你有机会改变提交消息。 提交所做的任何更改都不受影响。 </dd>\n\n<dt><code>edit</code></dt>\n<dd>如果选择<code>edit</code>提交，你将有机会修改该提交，也就是说，你可以完全添加或更改整个提交。 在继续变基之前，您也可以进行更多提交。 这样您可以将一个大的提交记录拆分为多个较小的提交记录，或者删除在提交记录中执行的不正确的更改。 </dd>\n\n<dt><code>squash</code></dt>\n<dd>此命令可用于将两个或以上的提交合并为一个。 上面的提交被压缩进其下面的提交。 Git 让您有机会编写描述两次更改的新提交消息。</dd>\n\n<dt><code>fixup</code></dt>\n<dd>这类似于 <code>squash</code>，但将要合并的提交将丢弃其信息。 提交简单地合并到上面的提交中，并使用之前提交的信息来描述这两个更改。</dd>\n\n<dt><code>exec</code></dt>\n<dd>这使您能够对提交记录运行任意的 shell 命令。</dd>\n</dl>\n\n## 使用 `git rebase` 的示例\n\n无论使用哪个命令，Git 都将启动[默认文本编辑器](/zh/get-started/git-basics/associating-text-editors-with-git)，并且打开一个文件，其中详细说明了所选范围的提交信息。 该文件看起来像这样：\n\n```text\npick 1fc6c95 Patch A\npick 6b2481b Patch B\npick dd1475d something I want to split\npick c619268 A fix for Patch B\npick fa39187 something to add to patch A\npick 4ca2acc i cant' typ goods\npick 7b36971 something to move before patch B\n\n# Rebase 41a72e6..7b36971 onto 41a72e6\n#\n# Commands:\n#  p, pick = use commit\n#  r, reword = use commit, but edit the commit message\n#  e, edit = use commit, but stop for amending\n#  s, squash = use commit, but meld into previous commit\n#  f, fixup = like \"squash\", but discard this commit's log message\n#  x, exec = run command (the rest of the line) using shell\n#\n# If you remove a line here THAT COMMIT WILL BE LOST.\n# However, if you remove everything, the rebase will be aborted.\n#\n```\n\n从上到下分解此信息，我们可以看出：\n\n* 列出了七个命令，表示从起点到当前分支状态之间有七处更改。\n* 您选择要变基的提交按从最早更改（顶部）到最新更改（底部）的顺序排序。\n* 每行列出一个命令（默认为 `pick`）、提交 SHA 和提交消息。 整个 `git rebase` 过程以这三列的操作为中心。 你所做的更改会被重新基变到你的存储库中。\n* 提交完成后，Git 会告知正在处理的提交范围 (`41a72e6..7b36971`)。\n* 最后，Git 会提供一些帮助，告知在变基提交时可用的命令。\n\n## 其他阅读材料\n\n* [在命令行中使用 Git rebase](/zh/get-started/using-git/using-git-rebase-on-the-command-line)\n* *Pro Git 书籍中的“Git 分支”一章*\n* *Pro Git 书籍中的“交互式变基”一章*\n* [使用变基压缩提交](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html)\n* [\n  ](/zh/desktop/working-with-your-remote-repository-on-github-or-github-enterprise/syncing-your-branch-in-github-desktop)文档中的GitHub Desktop"}