git强制修改提交历史

  1. 1. 前言
  2. 2. 总览
  3. 3. 时间回溯
    1. 3.1. 使用git reset撤回本地提交
    2. 3.2. 关于 --hard ,以及其他几种 reset模式的介绍
    3. 3.3. 强制推送到 GitHub
  4. 4. 记忆消除
    1. 4.1. 修改提交信息
    2. 4.2. 修改提交的内容
    3. 4.3. 强制推送到 GitHub
  5. 5. 思想控制
    1. 5.1. 重写 commit 历史
    2. 5.2. 强制推送到 GitHub
  6. 6. 结尾说点该说的
    1. 6.0.1. 注意事项

前言

在日常的编程中,bug似乎是程序员绕不开的一个话题,有时候已经提交上去的代码再次检查的时候就会发现遇到致命问题,但是短时间修复也已经来不及。

又或者是手欠,不小心将自己的隐私信息和一些没来得及删除的内容提交上去。

不管怎么样,撤回是一个很好的功能,本篇的内容就是这样。

总览

嘛,基于前言的哪些问题,看了本篇说不定就会学到一点小知识呢。不过如果你有更好的方法,也可以在评论区说一下,大家一起学习进步。

本篇主要针对以下情况:

  1. 回档到某个特定的提交。(时间回溯)
  2. 修改最近的提交。(记忆消除)
  3. 修改前面某次特定的提交。(思想控制)

是否有你的情况呢,可以点击对应的条目跳转哦……


时间回溯

The World !!!!
回档到某个特定的提交

要撤回已经推送到 GitHub 的提交并强制覆盖 GitHub 上的提交历史,你可以使用 Git 的 resetpush 命令。以下是详细步骤:

使用git reset撤回本地提交

首先,你可以使用 git reset 将提交回滚到你想保留的那个版本。

1
git reset --hard <commit-hash>

<commit-hash> 是你希望保留的那个提交的哈希值。你可以通过 git log 查看提交历史并找到这个哈希值。

例如,如果你想回滚到倒数第三个提交,你可以执行:

1
git reset --hard HEAD~3
--hard的其他几种选择

关于 --hard ,以及其他几种 reset模式的介绍

  1. git reset --soft <commit-hash>

    • 仅重置 HEAD 到指定提交,保持暂存区和工作目录的内容不变。

    • 撤销的提交仍然保留在暂存区,你可以进行新的提交。

  2. git reset --mixed <commit-hash>

    • 重置 HEAD 到指定提交,并且清空暂存区(索引)。但工作目录的文件保持不变。

    • 适合想要撤销提交但保留更改以重新组织时使用。

  3. git reset --hard <commit-hash>

    • 重置 HEAD、暂存区和工作目录,彻底抹去所有自指定提交以来的更改。

    • 不可恢复,除非有备份或者通过 git reflog 恢复。

强制推送到 GitHub

在本地回滚到目标提交后,你可以强制推送更改到远程仓库。这将覆盖 GitHub 上的提交历史。

1
git push origin <branch-name> --force

<branch-name> 是你正在推送的分支名称,通常是 mainmaster,具体取决于你的项目设置。


记忆消除

忘了刚刚发生的事吧…………
修改最近一次提交

如果你只想修改最近一次的提交,可以直接使用 git commit --amend 命令:

修改提交信息

1
git commit --amend

这个命令会让你进入编辑器,修改上次提交的提交信息。修改完成后,保存退出。

修改提交的内容

如果想修改最近提交的内容,可以先编辑需要修改的内容,然后再运行 git commit --amend

1
2
git add <file>
git commit --amend

这样会更新最近的提交内容,而不会生成新的提交。

强制推送到 GitHub

在本地回滚到目标提交后,你可以强制推送更改到远程仓库。这将覆盖 GitHub 上的提交历史。

1
git push origin <branch-name> --force

<branch-name> 是你正在推送的分支名称,通常是 mainmaster,具体取决于你的项目设置。


思想控制

你每天都会忘记成千上万的事,为什么不把这件事也忘了呢?
精确控制提交历史

重写 commit 历史

使用 git rebase -i 命令来修改前面的 commit 并删除最新的 commit。

  1. 使用 git rebase -i 命令选择要修改的 commit 历史。例如,如果你要修改最后 5 个 commit:
1
git rebase -i HEAD~5

当然你也可以用下面这条:
执行以下命令,选择要修改的提交的哈希值(通常是它的父提交)。

1
git rebase -i <commit-hash>^
  1. 在打开的编辑器中,你会看到类似以下的内容:
1
2
3
4
5
pick f1e2d3c Commit message 5
pick a4b5c6d Commit message 4
pick 789abcd Commit message 3
pick 123efgh Commit message 2
pick 456ijkl Commit message 1

这个界面是vim编辑器界面,用vim编辑器的方法编辑即可,如果实在不会,就记住下面几个点:
按下 i 键进入编辑状态,按下esc退出编辑状态,然后输入 :wq 即可保存退出

  1. 修改文件中的命令:
  • pick 改为 edit 以修改特定的 commit。
  • pick 改为 drop 以删除特定的 commit。
  • pick 改为 reword 以修改特定 commit 的提交信息(不更新代码)。

不常用的指令:

squash(或 s):将该提交与前一个提交合并,允许你修改提交信息。适合合并多个小提交。

fixup(或 f):与 squash 类似,但不会提示你修改提交信息,直接使用前一个提交的信息。

例如,假设你要修改 Commit message 3 并删除最新的 commit Commit message 5

1
2
3
4
5
drop f1e2d3c Commit message 5
pick a4b5c6d Commit message 4
edit 789abcd Commit message 3
pick 123efgh Commit message 2
pick 456ijkl Commit message 1
  1. 保存并关闭编辑器。Git 会开始 rebase 过程并在需要修改的 commit 处暂停。

  2. 当 Git 停止在你需要修改的 commit 处时,进行你的修改,修改完以后执行下面的命令即可:

1
2
git add <file>
git commit --amend
  1. 完成修改后,继续 rebase 过程:
1
git rebase --continue
  1. 如果有冲突,解决冲突后继续 rebase 直到完成。

强制推送到 GitHub

在本地回滚到目标提交后,你可以强制推送更改到远程仓库。这将覆盖 GitHub 上的提交历史。

1
git push origin <branch-name> --force

<branch-name> 是你正在推送的分支名称,通常是 mainmaster,具体取决于你的项目设置。

结尾说点该说的

注意事项

  • 谨慎使用 --force,因为这会覆盖 GitHub 上的历史,其他协作者可能会受到影响。如果有人基于之前的历史进行开发,可能会导致冲突。
  • 在团队协作时,建议先与团队沟通,确保他们知道历史即将被重写。

这样操作后,你就能成功撤回本地和远程的提交,并将 GitHub 的历史覆盖为你本地的状态。

但是,大部分存储库,类似Github有活跃记录,你还是可以在Activity记录里面查看到你的强制推送的。

召唤伊斯特瓦尔