【Git】git restore 命令使用介绍

git restore 是 Git 在 2.23 版本引入的一个专门用于恢复工作树(工作目录)和暂存区(索引)文件状态的命令。它旨在取代之前用 git checkout -- git reset HEAD 来完成的部分功能,使操作意图更清晰。

核心功能:撤销更改

git restore 主要根据你提供的选项,将文件从以下两个来源恢复到指定状态:

  1. 暂存区(--staged 选项): 将文件恢复到上次 git add 后的状态(即 HEAD 提交或上一次暂存的状态)。
  2. 工作目录(默认或无选项): 将文件恢复到上次提交(HEAD)的状态,或者恢复到暂存区的状态(如果使用了 --source 选项)。

常用场景和命令格式:

  1. 放弃工作目录中对某个文件的修改(未暂存):

    git restore <file>
    
    • 效果:丢弃你在工作目录中对 所做的、尚未暂存 (git add) 的所有修改。
    • 相当于旧的 git checkout --
    • 警告: 这会永久丢弃你工作目录中的这些更改!确保这些更改是你确实不需要的。
  2. 取消暂存某个文件(将文件从暂存区移回工作目录,但保留工作目录的修改):

    git restore --staged <file>
    
    • 效果:将 从暂存区移除(unstaged),但保留你在工作目录中对它所做的修改。
    • 相当于旧的 git reset HEAD --
    • 这在你 git add 了一个文件但后悔了,想重新修改后再暂存时非常有用。
  3. 同时恢复工作目录和暂存区(放弃所有修改):

    git restore --staged --worktree <file>
    # 或者更简洁的(Git 2.25+):
    git restore --source=HEAD --staged --worktree <file>
    # 或者最简洁的(效果相同):
    git restore -SW <file>  # -S 是 --staged, -W 是 --worktree 的缩写
    
    • 效果:彻底丢弃你对 所做的所有更改,包括:
      • 丢弃暂存区的更改(取消暂存)。
      • 丢弃工作目录中的更改。
    • 文件将完全恢复到最近一次提交 (HEAD) 时的状态。
  4. 从特定提交恢复文件:

    git restore --source=<commit> <file>
    
    • 效果:将工作目录中的 恢复到指定 时的状态。暂存区不受影响。
    • 例如:git restore --source=HEAD~1 README.mdREADME.md 恢复到上一次提交的状态(覆盖工作目录的更改)。
    • 如果想同时恢复工作目录和暂存区到某个提交的状态:
      git restore --source=<commit> -SW <file>
      
  5. 恢复整个目录或所有文件:

    • 恢复工作目录中当前目录及其所有子目录下所有文件的更改:
      git restore .
      
    • 恢复工作目录中所有文件的更改:
      git restore :/
      
    • 取消暂存所有已暂存的文件(保留工作目录修改):
      git restore --staged .
      
    • 警告: 使用 .:/ 时要极其小心,这会影响很多文件!

重要区别和提示:

  • git restore vs git checkout (旧方式):
    • git checkout -- 现在等同于 git restore (放弃工作目录修改)。
    • git checkout git checkout (用于切换分支或检出提交)仍然是 git checkout 的主要职责。git restore 不用于切换分支或检出整个提交。
  • git restore vs git reset:
    • git reset HEAD 现在等同于 git restore --staged (取消暂存)。
    • git reset --hard 会重置整个分支引用、暂存区和工作目录,功能更强大也更危险。git restore 专注于单个文件或路径的恢复。
  • 安全第一: git restore(尤其是没有 --staged 时)会丢弃未提交的更改。在执行 git restore 之前,强烈建议:
    1. 使用 git status 确认哪些文件有更改以及它们的状态(已修改/已暂存)。
    2. 使用 git diffgit diff --staged 查看你将要丢弃的具体更改内容。确保这些更改确实不需要了。
    3. 如果对某些更改不确定,可以先使用 git stash 将它们暂时储藏起来,以后可以恢复。
  • 作用域: git restore 默认作用于工作目录。要操作暂存区,必须显式使用 --staged (-S) 选项。-SW 可以同时操作两者。

总结:

git restore 是一个强大且精确的工具,用于:

  • git restore : 丢弃工作目录中未暂存的修改。
  • git restore --staged : 取消文件的暂存状态(保留工作目录修改)。
  • git restore -SW : 彻底丢弃文件的所有更改(工作目录+暂存区),恢复到 HEAD
  • git restore --source= : 将工作目录中的文件恢复到指定提交的状态。

理解 --staged--worktree(或其缩写 -S-W)的作用是掌握 git restore 的关键。始终在操作前检查 git statusgit diff 以避免意外数据丢失。

你可能感兴趣的:(Git,git)