1. Git Config Layer

  • System: All users
  • Global: All repositories of the current user
  • Local: The current repository

2. Git Snapshop

image-20250105144309655

3. Git Workflow

image-20250105145229310

img

4. Git Revert Changes

4.1 撤销工作区的修改

如果你在工作区修改了文件,但还没有将这些修改添加到暂存区(即未使用 git add),可以使用以下命令撤销修改:

git restore <file>  # 撤销指定文件的修改
git restore .       # 撤销所有文件的修改

4.2 撤销暂存区的修改

如果你已经将修改添加到暂存区(使用了 git add),但还没有提交,可以使用以下命令将文件从暂存区撤回到工作区:

git restore --staged <file>  # 将指定文件从暂存区撤回到工作区
git restore --staged .       # 将所有文件从暂存区撤回到工作区

注意:这不会撤销工作区的修改,只是将文件从暂存区移除。

4.3 撤销已提交的更改

如果你已经提交了更改,但还没有推送到远程仓库,可以使用以下方法撤销提交。

4.3.1 撤销最近一次更改

如果你想撤销最近一次提交,但保留工作区和暂存区的修改:

git reset --soft HEAD~1
  • --soft:保留工作区和暂存区的修改,只撤销提交。
  • HEAD~1:表示撤销最近一次提交。
  • HEAD:local repository的最新版本。

如果你想撤销最近一次提交,但只保留工作区的修改:

git reset --mixed HEAD~1

如果你想撤销提交并丢弃工作区的修改:

git reset --hard HEAD~1
  • --hard:彻底丢弃工作区和暂存区的修改,恢复到上一次提交的状态。

4.3.2 撤销某次提交

git reset --soft <commit-hash>

4.4 撤销已推送到远程仓库的更改

如果你已经将提交推送到远程仓库,通常不建议直接修改历史记录(如使用 git reset),因为这会影响其他开发者的工作。推荐使用 git revert

git revert <commit-hash>  # 撤销指定提交
git push origin <branch>  # 将撤销提交推送到远程仓库

4.5 git revert和git reset的区别

4.5.1 git revert

  • 作用:撤销某次提交,并生成一个新的提交来记录这次撤销操作。
  • 特点

    • 不会修改历史记录,而是通过新增一个提交来撤销之前的更改。
    • 适合用于已经推送到远程仓库的提交,因为不会破坏协作历史。
  • 使用场景

    • 撤销已经推送到远程仓库的提交。
    • 需要保留完整的历史记录(例如在团队协作中)。
  • 命令示例

    git revert <commit-hash>
    • 这会创建一个新的提交,撤销指定提交的更改。
    • 如果有冲突,Git 会提示你解决冲突并完成提交。

4.5.2 git reset

  • 作用:将当前分支的 HEAD 指针移动到指定的提交,并可以选择是否修改工作区和暂存区。
  • 特点

    • 会修改历史记录,将 HEAD 指针回退到指定的提交。
    • 适合用于本地仓库的撤销操作,尚未推送到远程仓库的提交。
  • 使用场景

    • 撤销本地的提交(尚未推送到远程仓库)。
    • 需要彻底丢弃某些提交或修改历史记录。
  • 模式

    • --soft:只移动 HEAD 指针,不修改暂存区和工作区。
    • --mixed(默认):移动 HEAD 指针,并重置暂存区,但不修改工作区。
    • --hard:移动 HEAD 指针,并重置暂存区和工作区(丢弃所有更改)。
  • 命令示例

    git reset --soft HEAD~1   # 撤销最近一次提交,保留修改
    git reset --mixed HEAD~1  # 撤销最近一次提交,重置暂存区
    git reset --hard HEAD~1   # 彻底撤销最近一次提交,丢弃所有修改

4.5.3 主要区别

特性git revertgit reset
是否修改历史记录不修改历史记录,生成一个新的提交。修改历史记录,移动 HEAD 指针。
适用场景已推送到远程仓库的提交。本地未推送的提交。
工作区和暂存区不影响工作区和暂存区。根据模式(--soft/--mixed/--hard)影响工作区和暂存区。
协作影响安全,适合团队协作。可能破坏协作历史,需谨慎使用。
命令示例git revert <commit-hash>git reset --hard HEAD~1

4.5.4 使用场景示例

git revert

假设你已经将提交 A -> B -> C 推送到远程仓库,现在想要撤销提交 B

  • 使用 git revert

    git revert B
    • 这会生成一个新的提交 D,撤销 B 的更改。
    • 历史记录变为 A -> B -> C -> D,远程仓库可以安全地接受这次更改。
git reset

假设你本地有提交 A -> B -> C,但尚未推送到远程仓库,现在想要撤销提交 BC

  • 使用 git reset

    git reset --hard A
    • 这会将 HEAD 指针移动到提交 A,并丢弃 BC 的更改。
    • 历史记录变为 A,但仅适用于本地仓库。
最后修改:2025 年 01 月 05 日
如果觉得我的文章对你有用,请随意赞赏