Git撤回已push的提交 #
要撤回已经 push 到远程仓库的提交,同时保留这些更改,你可以使用以下步骤:
- 首先,使用
git reset命令将本地仓库回退到指定的提交,但保留更改在工作区:
git reset --soft HEAD^
这个命令会撤销最近的一次提交,但所有更改会保留在你的工作目录中。如果你想回退多个提交,可以使用 HEAD~n,其中 n 是要回退的提交数量。
- 然后,将这些更改添加到暂存区并创建一个新的提交:
git add .
git commit -m "新的提交信息"
- 最后,强制推送到远程仓库:
git push --force
## 或 指定远程分支
git push origin <your-branch> --force
⚠️ 注意:使用
--force选项时要非常小心,因为它会覆盖远程仓库的历史记录。如果是多人协作的项目,这可能会影响其他开发者。
如果你担心强制推送的风险,可以使用更安全的 --force-with-lease 选项:
git push --force-with-lease
这个选项会在远程分支被其他人更新的情况下拒绝推送,从而避免覆盖他人的工作。
如果你需要回退到特定的提交,可以使用提交的哈希值:
git reset <commit-hash>
Git Reset 参数解释 #
git reset 命令有几个不同的参数选项,它们决定了重置操作如何影响你的工作目录和暂存区。以下是主要参数的解释:
主要模式 #
--soft
#
git reset --soft <commit>
- 将 HEAD 指针移动到指定的提交
- 不改变暂存区(index)
- 不改变工作目录
- 所有更改会保留在暂存区中,准备好进行新的提交
这种模式适合当你想合并几个提交为一个新提交时使用
--mixed(默认模式)
#
git reset --mixed <commit>
## 或简写为
git reset <commit>
- 将 HEAD 指针移动到指定的提交
- 重置暂存区以匹配指定的提交
- 不改变工作目录
- 所有更改会保留在工作目录中,但需要重新
git add才能提交
这是默认模式,适合当你想重新组织更改时使用。
--hard
#
git reset --hard <commit>
- 将 HEAD 指针移动到指定的提交
- 重置暂存区以匹配指定的提交
- 重置工作目录以匹配指定的提交
- 所有未提交的更改都会丢失
这种模式适合当你想完全放弃所有更改,回到指定提交的状态时使用。
其他常用参数 #
--merge
#
git reset --merge <commit>
- 在合并冲突后重置,保留未冲突的更改
--keep
#
git reset --keep <commit>
- 类似于
--hard,但如果工作目录中有未保存的更改且会被重置操作覆盖,则会中止操作
--patch 或 -p
#
git reset -p
- 交互式地选择要重置的部分
常见用法示例 #
- 撤销最近一次提交,但保留更改在暂存区:
git reset --soft HEAD^
- 撤销最近一次提交,并将更改移出暂存区:
git reset HEAD^
- 完全放弃最近的提交和所有更改:
git reset --hard HEAD^
- 回到特定提交,保留工作目录中的更改:
git reset <commit-hash>