Felix_SANA 'S BLOG
1627 words
8 minutes
git强制修改提交历史

前言#

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

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

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

总览#

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

本篇主要针对以下情况:

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

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

时间回溯#

回档到某个特定的提交

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

使用git reset撤回本地提交#

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

git reset --hard <commit-hash>

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

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

git reset --hard HEAD~3

关于 --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 上的提交历史。

git push origin <branch-name> --force

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

记忆消除#

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

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

修改提交信息#

git commit --amend

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

修改提交的内容#

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

git add <file>
git commit --amend

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

强制推送到 GitHub#

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

git push origin <branch-name> --force

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


思想控制#

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

重写 commit 历史#

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

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

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

git rebase -i <commit-hash>^
  1. 在打开的编辑器中,你会看到类似以下的内容:
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

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 处时,进行你的修改,修改完以后执行下面的命令即可:

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

强制推送到 GitHub#

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

git push origin <branch-name> --force

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

结尾说点该说的#

注意事项#

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

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

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

git强制修改提交历史
https://blog.systemannounce.com/posts/learning/git/git-undo-commmit/
Author
Felix_SANA
Published at
2024-09-16