Reset
git reset用来回退到某个历史提交,它可以修改Git仓库中的提交记录和工作目录,常用于撤销更改或在错误的提交后进行修复
根据使用场景不同,git reset主要有三个模式
git reset --soft <commit>
- 作用:将当前分支的指针(HEAD)移动到指定的提交,但是不会修改工作区和暂存区的内容。这意味着你回到了某个提交,但是修改的文件仍然会保持在暂存区,可以重新提交
- 场景:常用于在提交错误或想要合并多个提交时。例如,你提交了多个小的更改,但是希望将它们合并成一个提交,使用
--soft可以把多个提交合并成一个新的提交
git reset --soft HEAD~1
这将把分支回退到上一个提交,同时保留当前的更改
git reset --mixed <commit>
作用:将当前分支的指针(HEAD)回退到指定的提交,并且将暂存区退回到那个提交时的状态。工作目录(文件内容)不会改变。如果你已经将更改添加到暂存区但还没有提交,
--mixed会将这些更改从暂存区移除,但保留在工作目录场景:用于想撤销
git add(将文件添加到暂存区)的情况,但不丢失工作区的更改。可以用这个命令撤销已经暂存的文件,但是不影响未暂存的文件
git reset --mixed HEAD~1
这将撤销最近的提交,并将暂存区的内容恢复到上一个提交的状态
git reset --hard <commit>
- 作用:将分支指针(HEAD)退回到指定提交,并且彻底清除暂存区和工作区的所有更改。所有未提交的更改都会丢失,包括文件的修改和已添加到暂存区的更改
- 场景:当你不再需要某些更改,想要彻底恢复到某个历史提交时使用。要小心
--hard,因为它会丢弃你所有的未提交更改,无法恢复
git reset --hard HEAD~1
这会将分支回退到上一个提交,并且删除所有未提交的更改
其他
git reset <commit>默认是--mixed,即回退到指定的提交并更新暂存区,工作区不变- 使用
git log或git reflog来查看历史提交,找到需要重置的提交 git reset不会删除提交,只是改变了分支指针的位置,所以被重置的提交仍然在Git历史中,除非使用git gc来清理
注意事项
git reset主要是改变分支的历史记录,通常只对本地仓库有效。对已经推送到远程的提交使用reset后会导致本地和远程分支不同步- 如果已经推送到远程仓库,重置可能会导致其他人无法拉取(pull)历史版本。这种情况下,应该避免使用
git reset,可以使用git revert来创建反向提交,保持历史记录的完整性
Revert
git revert与git reset不同,它不会修改历史记录,而是通过创建一个新的提交来“撤销”指定提交的效果。它通常用于已经推送到远程仓库的情况,能够保持项目历史的完整性,避免破坏其他协作开发者的工作
基本使用
- 作用:撤销某个提交的影响,但不会删除这个提交,它通过创建一个新的“反向”提交来实现
- 适用场景:
git revert适合用于已经推送到远程仓库并共享给其他开发者的提交,因为它保持了项目的历史记录。相比之下,git reset会改变历史记录(如果已经推送到远程仓库的话会引发问题),不适合这种场景
git revert <commit>
<commit>:指定想要撤销的那个提交的哈希值(或引用,例如HEAD~1)
例如,撤销上一个提交
git revert HEAD
这会创建一个ie新的提交,撤销HEAD提交的所有更改
撤销多个提交
git revert HEAD~3..HEAD
这会撤销从HEAD~3到HEAD之间的所有提交,每个提交都会生成一个新的反向提交
工作原理
git revert会生成一个新的提交,它的内容是“撤销”指定的提交所做出的更改。这是通过将修改应用到工作区来实现的,并创建一个新的提交记录。这个新的提交不会改变现有的提交历史,而是把原始提交的影响反转
常见参数
-n或--no-commit:会撤销指定提交的更改,但不会自动创建一个新的提交。可以在工作区查看更改,手动合并后再提交
git revert -n <commit>
这种方式允许你将多个撤销的更改合并到一个新的提交中
-m或--mainline:在合并提交时使用,指明哪个父提交是主要的,指定主线父提交来正确地生成反向提交
git revert -m 1 <merge-commit>
-m 1表示选择第一个父提交作为主线
使用场景
- 撤销某个不合适的提交
- 你已经提交了某个错误的功能或者bug修复,但是已经推送到了远程仓库,其他团队成员也基于此进行了工作
- 这时使用
git revert可以撤销这个错误提交,而不会破坏项目的历史和其他人的工作
- 撤销合并提交
- 如果你错误地合并了一个分支,可以通过
git revert -m 1 <merge_commit>来撤销合并提交,并保持历史不变
- 撤销多个提交
- 如果你需要撤销一系列的错误提交,可以使用
git revert对每个提交进行撤销,生成新的提交。也可以通过-n选项将这些更改暂时合并到一起,之后一次性提交
Reset vs Revert
git revert
- 创建一个新的提交,撤销指定提交的内容
- 不会改变提交历史(适合于推送到远程仓库后的情况)
- 适用于多人协作项目
git reset
- 改变当前分支的指针,重写历史记录
- 可以删除提交记录
- 适用于仅限本地仓库的更改,通常不推荐对已经推送的提交使用