文章目录
- [一、Git 中的常见操作](#一、Git 中的常见操作)
- 二、不同情况的使用场景
-
- [1. 有改动,未 add、未 commit、未 push](#1. 有改动,未 add、未 commit、未 push)
- [2. 有改动,已 add,未 commit、未 push](#2. 有改动,已 add,未 commit、未 push)
- [3. 有改动,已 add 和 commit,未 push](#3. 有改动,已 add 和 commit,未 push)
- [4. 有改动,已 add、commit 和 push](#4. 有改动,已 add、commit 和 push)
- [三、Revert vs Reset:何时使用](#三、Revert vs Reset:何时使用)
- 四、总结
在 Git 版本控制中,如何有效地管理代码修改至关重要。特别是当代码出现问题或需要回退时,Git 提供了多种方法来撤销、回退和重置代码状态。常见的操作有 CheckOut 、Revert 和 Reset,它们的应用场景和效果各不相同。本文将对这三个命令的异同进行详细分析,并根据不同的代码状态提供相应的使用建议。
一、Git 中的常见操作
1. CheckOut
CheckOut 主要用于切换分支或恢复文件的状态。它可以帮助我们丢弃未提交的修改,并恢复到上一次提交的版本。
适用场景:
- 有改动,但未
add、未commit、未push:本地修改了文件,但并未将其加入暂存区(git add)或提交(git commit)。此时,你可以使用git checkout来恢复文件到上次提交的状态,撤销本地修改。 - 切换分支 :如果需要切换到其他分支进行工作,使用
git checkout即可。
示例:
bash
# 恢复文件到上次提交的状态
git checkout -- <file-name>
# 切换到其他分支
git checkout <branch-name>
2. Revert
Revert 用于撤销已经提交的更改。不同于 reset,revert 创建一个新的提交来反转前一个提交的修改,因此不会破坏提交历史。这是一个非常安全的撤销方式,尤其适用于已经推送到远程仓库的更改。
适用场景:
- 已提交并推送到远程仓库的更改 :如果你已经推送到远程仓库,但需要撤销某次提交,
git revert是最安全的选择。它通过创建一个新的提交来反转之前的更改,而不会修改历史记录。 - 撤销某次提交 :如果你想撤销某个已提交的更改,可以使用
git revert。
示例:
bash
# 撤销某次提交,创建一个新的提交来反转修改
git revert <commit-id>
3. Reset
Reset 是 Git 中最强大的命令之一,用于重置当前分支的指针到某个指定提交。reset 可以分为三种模式:--soft、--mixed 和 --hard,每种模式的行为有所不同。reset 可以修改本地的提交历史,甚至丢弃本地的修改。
适用场景:
- 有改动且已
add,但未commit或push:如果你已经将文件添加到暂存区(git add),但尚未提交(git commit),可以使用git reset来撤销add,将文件从暂存区移除,保留修改。 - 已提交但未推送的修改 :如果你已经进行了提交,但还未推送,可以使用
git reset来撤销提交,并根据需要决定是否保留修改。reset会重写历史记录,适用于清理本地提交。 - 彻底重置 :如果你需要完全丢弃所有修改,可以使用
git reset --hard,它会清除暂存区和工作区的所有更改,恢复到某个提交的状态。
示例:
bash
# 撤销最近的提交,但保留修改在暂存区
git reset --soft HEAD~1
# 撤销最近的提交,并将更改移出暂存区
git reset --mixed HEAD~1
# 完全撤销最近的提交,丢弃所有更改
git reset --hard HEAD~1

二、不同情况的使用场景

1. 有改动,未 add、未 commit、未 push
-
使用 CheckOut 恢复文件到上次提交的状态:
bashgit checkout -- <file-name>

2. 有改动,已 add,未 commit、未 push
-
使用 Reset 将文件从暂存区移除:
bashgit reset <file-name>


-
或者使用 CheckOut 恢复文件:
bashgit checkout -- <file-name>
3. 有改动,已 add 和 commit,未 push
-
使用 Reset 撤销提交并保留修改:
bashgit reset --soft HEAD~1 -
使用 Reset 完全撤销提交并丢弃修改:
bashgit reset --hard HEAD~1
4. 有改动,已 add、commit 和 push
-
使用 Revert 撤销已经推送的提交:
bashgit revert <commit-id>
然后再次push

三、Revert vs Reset:何时使用
Revert
- 适用场景:撤销已提交并推送到远程仓库的修改。不会修改历史记录,而是创建一个新的提交来反转修改。
- 优点:非常安全,不会破坏公共仓库的历史。
- 缺点:会在历史记录中添加新的提交。
Reset
- 适用场景:撤销本地修改或未推送的提交,适用于需要修改本地历史的情况。
- 优点:可以撤销多个提交,完全修改本地历史。
- 缺点:会改变历史记录,尤其是在多人协作时需要小心使用,避免丢失重要的提交。
四、总结
- CheckOut:适用于恢复本地未提交的修改或切换分支,通常用于撤销工作区的修改。
- Revert:适用于撤销已推送到远程的提交,不会修改历史记录,适用于公共仓库。
- Reset:适用于撤销本地提交或修改历史,特别适合尚未推送的修改。
根据不同的场景,选择合适的命令来管理你的代码历史,确保代码库的清晰与一致性。