文章目录
前言
在团队开发和个人项目中,代码变更是不可避免的。有时我们可能会提交错误的代码、误操作导致文件的更改,或者在合并分支时出现问题。这时候,了解如何撤销这些不必要的更改就显得尤为重要。Git 提供了一系列强大的命令来处理不同场景下的变更撤销操作。在本文中,我们将详细介绍 git reset
和 git revert
的使用方法,并通过实际例子帮助你选择合适的操作方式,以便安全、快速地恢复代码状态。
一、Git Reset
git reset
是一个非常强大的命令,可以用于撤销提交、修改暂存区的内容,以及恢复工作区中的文件,原来指向的提交记录就跟从来没有提交过一样。根据不同的选项,git reset
可以有不同的效果,适用于不同的场景。
1. --soft:保留变更在暂存区
- 场景:当你已经提交了代码,但想要撤销这个提交,同时保留所有变更在暂存区中,以便可以重新提交或修改提交信息。
- 效果:将当前分支的指针(
HEAD
)移动到上一个提交,暂存区的文件保持不变,允许你对这些文件进行进一步操作。
git reset --soft HEAD~1
2. --mixed(默认选项):保留变更在工作区
- 场景: 当你希望撤销最近的提交,并且将这些更改从暂存区移除,但保留在工作区中。
- 效果: 将当前分支的指针移动到上一个提交,同时将暂存区的内容重置为该提交的状态,但工作区中的更改仍然存在。你可以进一步检查这些更改,然后决定如何处理。
git reset --mixed HEAD~1
3. --hard:彻底丢弃所有变更
- 场景: 当你希望完全撤销最近的提交和所有未提交的变更,不保留任何修改。
- 效果: 将当前分支的指针、暂存区和工作区都恢复到上一个提交的状态,所有的更改将被彻底丢弃。使用这个命令时要特别小心,以免丢失重要的工作。
git reset --hard HEAD~1
二、Git Revert
git revert
是另一种常用的撤销方法,它的特点是通过创建一个新的提交来反转之前的提交,而不会直接修改提交历史。这使得 git revert
非常适合在已经推送到远程仓库的提交上使用,特别是在团队协作中。
1. 撤销单个提交
- 场景: 当你发现最近的一次或某个历史提交中有错误,需要撤销该提交的更改,但保留提交历史。
- 效果: 生成一个新的提交,内容是对
<commit_hash>
所指向的提交的反转。这个新提交将被添加到当前分支的末尾,历史记录将完整保留,并且撤销操作是可追踪的。
假设C2的<commit_hash>
为e5f6g7h8
,运行下面的命令会得到
git revert e5f6g7h8
在我们要撤销的提交记录后面居然多了一个新提交,是因为新提交记录 C2'
引入了更改 —— 这些更改刚好是用来撤销 C2
这个提交的。也就是说 C2'
的状态与 C1
是相同的。
2. 撤销多个提交
- 场景:当不止撤销一个提交时,要撤销多个连续的提交
- 该命令会依次对从
<start_commit_hash>
(不包括)到<end_commit_hash>
(包括)之间的每一个提交进行反转,并创建对应的新提交。
git revert <start_commit_hash>..<end_commit_hash>
3. 撤销合并提交
- 场景: 在处理合并时,如果发现合并有误,需要撤销合并提交,但保留分支的其余部分。
- 效果: 这个命令将撤销指定的合并提交,同时保留一个父分支的内容。
-m 1
参数指定了要保留的父分支编号(通常为1
),这确保了合并的另一部分内容不会被撤销。
git revert -m 1 <merge_commit_hash>
三、实际例子
当不小心推送了不能上传的文件到远程仓库中,直接删除记录该怎么删掉呢,使用git revert
会保留历史记录,那我们只能使用git reset
来“改写历史”
- 用以下
git log
命令查看要撤回的提交哈希是什么,输出的commit
后跟着的字符串就是版本号
commit 91089df9cc4581d82d454a16fc15b8501d239128
- 用
--hard
参数将本地仓库回滚到之前某版本,此时本地已经回滚,远程仓库还未回滚
git reset --hard 版本号
--force
(或-f
): 强制推送选项。这会覆盖远程仓库的提交历史,即使本地分支的提交历史不是远程分支的子集也会强制推送。也就可以将本地仓库的历史直接覆盖掉远程仓库的历史
git push -f
注意:强制推送会覆盖远程仓库的现有内容,因此团队成员的提交可能会丢失。确保所有相关人员已经备份或同意这个操作。如果其他人已经从远程仓库拉取了代码,强制推送可能会导致他们的本地分支和远程分支不一致。
总结
撤销变更是 Git 日常使用中的一项重要操作。无论是通过 git reset 重置提交历史,还是使用 git revert 创建新的反转提交,这些命令都能帮助我们在不同的场景中有效地处理代码问题。在进行这些操作时,理解每个命令的作用和潜在影响尤为重要,特别是在团队协作环境中。希望通过本文的讲解,你能够更加熟练地使用 Git 来管理项目中的代码变更,确保代码库的整洁和稳定。
标签:reset,git,更改,--,撤销,Git,提交 From: https://blog.csdn.net/Huahua_1223/article/details/141365280