美文网首页
Git - 重写历史

Git - 重写历史

作者: 清十郎sama | 来源:发表于2020-01-02 14:40 被阅读0次

    介绍

    许多时候,在使用 Git 时,可能会因为某些原因想要修正提交历史。 Git 很棒的一点是它允许你在最后时刻做决定。 你可以在将暂存区内容提交前决定哪些文件进入提交,可以通过 stash 命令来决定不与某些内容工作,也可以重写已经发生的提交就像它们以另一种方式发生的一样。 这可能涉及改变提交的顺序,改变提交中的信息或修改文件,将提交压缩或是拆分,或完全地移除提交 - 在将你的工作成果与他人共享之前。

    这段话节选于 Pro Git, Chapter 7.6 Git Tools - Rewriting History 的开头。与 SVN 不同,Git 是允许重写历史的。这样的优点之一,就是在 push 前我们可以将我们的 commit 记录整理的更加整洁并且可追溯一些。接下来我们会介绍在 Git 中如何实现重写历史的。

    如何重写历史

    修改最近一次的 commit(提交)

    最常见的重写历史操作是重写“上一次”的 commit。这个修改动作可能是修改 comment 信息,或者修改你添加、修改和移除的文件的快照。它的操作十分简单:
    $ git commit --amend
    这条命令会把你带入文本编辑器,里面包含了你最近一条提交信息,供你修改。 当保存并关闭编辑器后,编辑器将会用你输入的内容替换最近一条提交信息。

    如果这个重写动作涉及到新增或者减少文件,可以先执行$ git add 添加文件到 Git 管理,或 $ git rm 删除某个已被 Git 管理的文件,随后运行 $ git commit --amend 来完成重新。

    使用这个技巧的时候需要小心,因为重写会改变提交的 SHA-1 校验和。 相当与一个小的编辑操作(rebase)。如果上一个 commit 已经被 push 过了,则不要轻易对其进行重写操作。了最后一次提交就不要修正它。

    除此以外,使用一些 GUI 软件比如 TortoiseGit,也可以很方便的通过图形界面来重写最后一次的提交:

    1. 单击右键,选择 commit
    2. 勾选 Amend Last Commit


      TortoiseGit Amend 操作截图

    修改多个 commit 历史

    如果想要修改多个 commit 历史,我们可以用到如下命令:
    $ git rebase -i HEAD~3
    敲完以上命令后,你会看到类似于下图的界面:

    • 修改多个历史 commit

      根据 Commands 中规则,修改提交记录,然后保存并退出,这些 commit 记录就会被重写了。

    注意:git 并没有修改多个历史的工具,从命令中大家就可以看出来这实际上是一个变基操作。在如上的命令中, HEAD~3..HEAD 范围内的每一个提交都会被重写,无论你是否修改信息。由于是变基操作(rebase),此处应该注意不要涉及任何已经推送到中央服务器的 commit - 这样做会产生一次变更的两个版本,因而使他人困惑。在不考虑这种困惑的情况下,比如你就是希望修改和整合服务器上一些错误和碎片化的提交记录的话,通过 git push -f 就可以强行将本地修改后的 commit 历史覆盖到服务器了。不过该操作一定要谨慎!

    相关文章

      网友评论

          本文标题:Git - 重写历史

          本文链接:https://www.haomeiwen.com/subject/cdcooctx.html