一个超万能的 git restore 命令

99 阅读2分钟

最近生病,躺在床上,准备写点东西

我是拖延症晚期患者 , 比如一直想把git源码翻一翻 , 向 linus Torvalds 致敬

无奈, c语言还不会

好吧, 先从简单的开始, 学习一下 git 使用, 记录下来, 可能有点用吧

git 的源码由社区贡献,相关书籍也同样由社区编写和维护

我就想知道,本领高的程序员,不用吃饭的吗

言归正传

git restore 说明

git restore 用于还原工作区或暂存区中的文件,使其恢复到指定状态(通常是 HEAD、index 或其他 commit)

它的主要用途

•	撤销对工作区的更改(恢复到 index, HEAD 状态)。
•	撤销对暂存区的更改(恢复到 HEAD 状态)。
•	同时恢复工作区和暂存区的更改。

先搭个环境


# 新建工作目录 
mkdir gitwk 

# 初始化仓库 
git init


# 提交  
echo "000" >> test.txt 
git add test.txt
git commit -a -m "000"

# 暂存   
echo "111" > test.txt
git add test.txt

# 修改
echo "222" > test.txt


retore 撤销工作区的更改

restore 可以恢复 工作区的文件


# 文件恢复了,内容没有丢失
`git restore test.txt`  

效果


Before:
  Worktree:  [222]
  Index:     [111]
  HEAD:      [000]

After:
  Worktree:  [111]  <- Recovered from Index
  Index:     [111]
  HEAD:      [000]

撤销暂存区的更改

restore 可以恢复 暂存区的文件


git restore --staged test.txt

效果

Before:
  Worktree:  [222]
  Index:     [111]
  HEAD:      [000]

After:
  Worktree:  [222]
  Index:     [000]  <- Recovered from HEAD
  HEAD:      [000]

取消暂存是有条件的

如果第一次把文件误加入到 暂存 中

touch b
git add b 

这样就可以了取消暂存 , 因为 HEAD 中没有该文件

git restore --staged b

如果文件已经提交过多次, restore 只是恢复了 index 的内容, 并不能取消暂存

可以这样做,来取消暂存

git rm --cached b
git commit -m "delete b"

可以恢复任意文件

可以恢复 工作区或index 中任意文件 到指定 分支结点

下面是 恢复工作区文件的示例

git restore --source master test.txt

效果


Before:
  Worktree:  [222]
  Index:     [111]
  HEAD:      [000]

After:
           Worktree:  [000]  <- Recovered from master HEAD 
          Index:     [111]
  (master)HEAD:      [000]

我太天才了, 解决了这么一个大问题

我竟然,从仓库恢复了一个文件的内容

问题还没有完

恢复到任意版本

我想把文件 恢复到 任意版本

git restore --source master~1 test.txt

master~1 ~1 是恢复到 master 分支的前一个版本

当然,也可以用提交结点的哈希码

git restore --source 79b2ba36 test.txt