Discuss / Git / 廖大神这里是不是有点小问题

廖大神这里是不是有点小问题

Topic source

前一节写的:

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

这节里面后面写:

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- test.txt

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

所以后面加粗的这句还是有点问题的,要区分上面的情况,读者也要注意下。

这样更容易理解吧,暂存区也是维持文件版本的,当git commit后暂存区和分支版本一致。只git add ,没有git commit,此时,暂存区比分支新一个版本。

那么,git checkout -- <file>  就是在工作区恢复暂存区版本而已,它只和暂存区打交道。只不过当git commit后,没有再进行git add,此时暂存区和分支版本一致,

看起来是恢复的分支版本,其实还是恢复的暂存区版本。所以<b>只是让文件回到最近一次 git add而已</b>

Kandelar

#3 Created at ... [Delete] [Delete and Lock User]

为什么我checkout的这步操作后,提示我下面错误:

error: pathspec 'test.txt' did not match any file(s) known to git

玩转ACE

#4 Created at ... [Delete] [Delete and Lock User]

同学你好。

因为你用的是【git rm】命令来删除的文件,这个命令是删除了Git暂存区的test.txt文件,此时你再用【git checkout -- <filename>】命令的话,Git就会提示你匹配不到文件。

。【git checkout -- <filename>】:是将工作区恢复成暂存区样子;

你必须先使用【git reset  <file>】命令,将删除的文件从Git版本库拉回到你的暂存区中,然后再使用【git checkout -- <filename>】命令来将该文件拉回到你的工作区中。

* 请注意1:【git reset  HEAD <file>】命令,如果HEAD上也没有这个test.txt文件的话,执行该命令后Git同样会报错,提示你匹配不到文件。原因是你按照廖老师的学习步骤学习的:

【git rm <file>】删除文件 → 【git add 'add test.txt'】暂存本次删除申请 → 【git commit -m'remove test.txt'】提交本次删除申请到HEAD

所以,如果你直接使用命令【git reset  HEAD test.txt】想想问什么会提示你匹配不到文件呢?因为现在HEAD上已经没有这个test.txt文件了!

怎么办呢?我们使用下面的命令顺序可以找回删除的文件:

【git log --pretty=oneline】查看提交的版本日志 → 【git reset commitID test.txt】这里的commitID使用的是'add test.txt'这次的提交ID → 【git checkout -- test.txt】将文件从暂存区拿回到工作区

* 请注意2:如果在'add test.txt'中间对test.txt有多次修改,并且没有提交被Git管理起来的话,这些修改就都丢失了!

didjfkfkvjwif

#5 Created at ... [Delete] [Delete and Lock User]

版本库包括暂存区和仓库,廖老师说的没问题


  • 1

Reply