17 September 2020
号外号外:我的新书《现代JavaScript库开发:原理、技术与实战》出版啦!!!快点我查看
号外号外:一组小而美的JavaScript迷你库!!!快点我查看
号外号外:猿辅导招聘前端,后端,客户端啦!地点:北京!!!快点我查看

最近发现git在修改完文件后,提示恢复修改的命令是restore,如下所示,印象中应该是checkout,所以就研究了下,总结一下分享给大家

$ git status

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   _posts/git/2020-8-24-how-to-transfer-a-git-repo.md

原来是git中的checkout命令承载了分支操作和文件恢复的部分功能,有点复杂,并且难以使用和学习,所以社区解决将这两部分功能拆分开,在git 2.23.0中引入了两个新的命令switch和restore用来取代checkout

下面分别来说说分支操作和文件恢复,如果你对git还不太熟悉,可以先阅读我的git入门文章

分支操作

原来git有两个命令用来操作分支,分别是branch和checkout

其中branch用来管理分支

$ git branch ## 查看当前所在分支
$ git branch aaa # 新建分支aaa
$ git branch -d aaa # 删除分支aaa

checkout用来切换分支,切换分支时,也可以新建分支

由于git中分支仅仅是一个commit id的别名,所以checkout也可以切换到一个commit id

$ git checkout aaa # 切换到 aaa分支
$ git checkout -b aaa # 创建aaa,然后切换到 aaa分支
$ git checkout commitid # 切换到某个commit id

checkout命令会用仓库中的文件,覆盖索引区(staged or index)和工作目录(work tree)

新的switch命令用来接替checkout的功能,但switch不能切换到commit id

$ git switch aaa # 切换到 aaa分支
$ git switch -c aaa # 创建aaa,然后切换到 aaa分支

下面来总结对比下

操作 2.23- 2.23+
管理分支 git branch git branch
切换分支 git checkout git switch
新建+切换分支 git checkout -b git switch -c
切换到commit id git checkout git checkout

文件恢复

原来git中文件恢复涉及到两个命令,一个是checkout,一个是reset,reset除了重置分支之外,还提供了恢复文件的能力

$ git checkout -- aaa # 从staged中恢复aaa到worktree
$ git reset -- aaa # 从repo中恢复aaa到staged
$ git checkout -- HEAD aaa # 从repo中恢复aaa到staged和worktree
$ git reset --hard -- aaa # 同上

一图胜千言系列

新的restore命令专门用来恢复staged和worktree的文件

$ git restore [--worktree] aaa # 从staged中恢复aaa到worktree
$ git restore --staged aaa # 从repo中恢复aaa到staged
$ git restore --staged --worktree aaa # 从repo中恢复aaa到staged和worktree
$ git restore --source dev aaa # 从指定commit中恢复aaa到worktree

一图胜千言系列

可以看到restore提供checkout和reset两个命令才能提供的文件恢复能力,也提供了更好的语义

总结

大家可以继续使用自己熟悉的命令,毕竟熟悉的才好用,本文希望能够帮助大家理清这个问题,满足大家的好奇心

git这样一个成熟的项目,一直处在不停的演进进化中,我们作为开发者也要保持持续学习演进的能力,共勉👊

原文网址:http://yanhaijing.com/git/2020/09/17/git-switch-and-restore/

微信公众号:颜海镜
关注微信公众号 颜海镜
微信支付二维码
赞赏支持 微信扫一扫