前言
在日常的编程中,bug似乎是程序员绕不开的一个话题,有时候已经提交上去的代码再次检查的时候就会发现遇到致命问题,但是短时间修复也已经来不及。
又或者是手欠,不小心将自己的隐私信息和一些没来得及删除的内容提交上去。
不管怎么样,撤回是一个很好的功能,本篇的内容就是这样。
总览
嘛,基于前言的哪些问题,看了本篇说不定就会学到一点小知识呢。不过如果你有更好的方法,也可以在评论区说一下,大家一起学习进步。
本篇主要针对以下情况:
是否有你的情况呢,可以点击对应的条目跳转哦……
时间回溯
The World !!!!
回档到某个特定的提交
要撤回已经推送到 GitHub 的提交并强制覆盖 GitHub 上的提交历史,你可以使用 Git 的 reset
和 push
命令。以下是详细步骤:
使用git reset撤回本地提交
首先,你可以使用 git reset
将提交回滚到你想保留的那个版本。
1 | git reset --hard <commit-hash> |
<commit-hash>
是你希望保留的那个提交的哈希值。你可以通过 git log
查看提交历史并找到这个哈希值。
例如,如果你想回滚到倒数第三个提交,你可以执行:
1 | git reset --hard HEAD~3 |
关于 --hard
,以及其他几种 reset
模式的介绍
git reset --soft <commit-hash>
:仅重置
HEAD
到指定提交,保持暂存区和工作目录的内容不变。撤销的提交仍然保留在暂存区,你可以进行新的提交。
git reset --mixed <commit-hash>
:重置
HEAD
到指定提交,并且清空暂存区(索引)。但工作目录的文件保持不变。适合想要撤销提交但保留更改以重新组织时使用。
git reset --hard <commit-hash>
:重置
HEAD
、暂存区和工作目录,彻底抹去所有自指定提交以来的更改。不可恢复,除非有备份或者通过
git reflog
恢复。
强制推送到 GitHub
在本地回滚到目标提交后,你可以强制推送更改到远程仓库。这将覆盖 GitHub 上的提交历史。
1 | git push origin <branch-name> --force |
<branch-name>
是你正在推送的分支名称,通常是 main
或 master
,具体取决于你的项目设置。
记忆消除
忘了刚刚发生的事吧…………
修改最近一次提交
如果你只想修改最近一次的提交,可以直接使用 git commit --amend
命令:
修改提交信息
1 | git commit --amend |
这个命令会让你进入编辑器,修改上次提交的提交信息。修改完成后,保存退出。
修改提交的内容
如果想修改最近提交的内容,可以先编辑需要修改的内容,然后再运行 git commit --amend
:
1 | git add <file> |
这样会更新最近的提交内容,而不会生成新的提交。
强制推送到 GitHub
在本地回滚到目标提交后,你可以强制推送更改到远程仓库。这将覆盖 GitHub 上的提交历史。
1 | git push origin <branch-name> --force |
<branch-name>
是你正在推送的分支名称,通常是 main
或 master
,具体取决于你的项目设置。
思想控制
你每天都会忘记成千上万的事,为什么不把这件事也忘了呢?
精确控制提交历史
重写 commit 历史
使用 git rebase -i
命令来修改前面的 commit 并删除最新的 commit。
- 使用
git rebase -i
命令选择要修改的 commit 历史。例如,如果你要修改最后 5 个 commit:
1 | git rebase -i HEAD~5 |
当然你也可以用下面这条:
执行以下命令,选择要修改的提交的哈希值(通常是它的父提交)。
1 git rebase -i <commit-hash>^
- 在打开的编辑器中,你会看到类似以下的内容:
1 | pick f1e2d3c Commit message 5 |
这个界面是vim编辑器界面,用vim编辑器的方法编辑即可,如果实在不会,就记住下面几个点:
按下i
键进入编辑状态,按下esc退出编辑状态,然后输入:wq
即可保存退出
- 修改文件中的命令:
- 将
pick
改为edit
以修改特定的 commit。 - 将
pick
改为drop
以删除特定的 commit。 - 将
pick
改为reword
以修改特定 commit 的提交信息(不更新代码)。
不常用的指令:
squash
(或s
):将该提交与前一个提交合并,允许你修改提交信息。适合合并多个小提交。
fixup
(或f
):与squash
类似,但不会提示你修改提交信息,直接使用前一个提交的信息。
例如,假设你要修改 Commit message 3
并删除最新的 commit Commit message 5
:
1 | drop f1e2d3c Commit message 5 |
保存并关闭编辑器。Git 会开始 rebase 过程并在需要修改的 commit 处暂停。
当 Git 停止在你需要修改的 commit 处时,进行你的修改,修改完以后执行下面的命令即可:
1 | git add <file> |
- 完成修改后,继续 rebase 过程:
1 | git rebase --continue |
- 如果有冲突,解决冲突后继续 rebase 直到完成。
强制推送到 GitHub
在本地回滚到目标提交后,你可以强制推送更改到远程仓库。这将覆盖 GitHub 上的提交历史。
1 | git push origin <branch-name> --force |
<branch-name>
是你正在推送的分支名称,通常是 main
或 master
,具体取决于你的项目设置。
结尾说点该说的
注意事项
- 谨慎使用
--force
,因为这会覆盖 GitHub 上的历史,其他协作者可能会受到影响。如果有人基于之前的历史进行开发,可能会导致冲突。 - 在团队协作时,建议先与团队沟通,确保他们知道历史即将被重写。
这样操作后,你就能成功撤回本地和远程的提交,并将 GitHub 的历史覆盖为你本地的状态。
但是,大部分存储库,类似Github有活跃记录,你还是可以在Activity记录里面查看到你的强制推送的。