1.暂存区文件的移除
当我们使用git add
将未追踪或者修改后的文件添加到暂存区以后,想要从暂存区移除该文件,我们使用git rm fileName --cached
命令
针对上图做一些解释
首先我们修改了一个已经存在暂存区的文件
newFile2
然后执行
git rm fileName --cached
命令,删除了暂存区中的该文件,但是因为使用了-- cached
参数,Git不会删除工作目录下的该文件。我们再使用
git status
命令,会发现该文件已处于未跟踪状态也就是说,该文件被从暂存区移除,但是依旧存在于工作目录,所以Git会认为它是一个新文件,所以是未跟踪状态。
当然,我们也可以使用git rm fileName -f
命令,将文件从暂存区和工作目录一并删除。
可以看到暂存区文件处于删除状态,而且工作目录下该文件已经被删除。
只要记住一点 git rm
命令会从暂存区删除文件
2.工作目录下文件的移除和恢复
我们可以手工删除工作目录下的文件
当我们在操作系统中删除了工作目录下的文件以后,使用git status
会提deleted信息,但很明显,这个文件依旧存在于暂存区中,如果要将其从暂存区也删除,使用git rm
命令。
但是如果误删工作目录下文件,我们就可以从暂存区恢复该文件,使用git checkout -- fileName
命令,改名了会从暂存区恢复这个文件(无论是删除还是更改了内容都可恢复)
可以看到已经删除的文件已经被恢复。
同时如果我们修改了该文件,但没有add
到暂存区,我们也可以使用git checkout -- fileName
恢复到暂存区中的文件内容。
对上图进行一些解释:
首先我们修改了
newFile2
的内容然后使用
git status
查看,发现该文件处于修改状态,但并没有被add
到暂存区使用
git checkout -- newFile2
从暂存区恢复了此文件内容使用git status 发现工作目录和暂存区完全一致(因为文件已经恢复到暂存区的状态)
只要记住一点,git checkout --fileName
命令会从暂存区恢复文件到工作目录
3.重新提交(修改最后一次提交)
我们新建了一个文件 newFile3
然后我们使用了git commit
命令将暂存区文件提交到版本仓库(repository)以后,如果对该次提交不满意或者有修改,可以使用 git commit --amend
进行修改。
先使用git commit -m"第二次提交"
,然后使用git log
这时我们使用 git commit --amend -m"第二次重新提交"
可以发现已经修改了提交的内容(包括文件和各种信息)
4.版本切换
使用git reset 版本校验和缩写
命令可以进行版本的切换
首先我们要清楚地是,Git中版本快照的存储,是一个线性的列表
每一个结点对应一个commit
的版本快照(snapshot),同时git默认的分支名为master(主分支),我们可以先不用理解什么是分支。而同时,又存在一个HEAD
指针指向当前分支的当前版本
这是我们就可以使用git reset 版本校验和缩写
的命令,来更改版本(Git并不推荐)
例如使用git reset HEAD^
,就可以退回到上一个版本,HEAD^
指针就代表上一个版本的版本校验和缩写
可以看到暂存区已经退回了上一个版本的版本内容,但是工作目录并没有改变,因此新建的文件newFile3
会被提示未追踪。
这时使用git log
命令会发现只剩第一次的版本提交信息。
但是我们如果要回到最新的版本,我们发现在git log
中是没有下一次更新的信息的(历史记录是没有未来的),我们可以使用git reflog
可以看到所有版本的校验和缩写,我们回到第二次重新提交以后的暂存区。
可以看到确实已经切换到了第二次重新提交的版本。
廖雪峰廖大制作的一个小视频可能会更容易理解一些点击观看
要清楚的是:
git reset 版本校验和缩写
会使暂存区变为该版本的目录文件结构,也就相当于跳转到某个版本。HEAD指针指向当前版本的版本快照,HEAD^指向上一个版本的版本快照。
git reset HEAD 可以将暂存区的一切操作恢复到原来状态(还没有commit)的情况下。
git reset HEAD^ 可以将暂存区恢复到上个版本快照的状态。
git reset
不会影响Git仓库中的版本快照链表,只会移动HEAD指针,并且将暂存区恢复到快照状态。
5.撤销已经暂存的文件
这一个命令其实基于版本切换的命令
当暂存区的文件被修改以后,我们可以使用如下命令恢复暂存区中的这个文件
git reset HEAD fileName
理解了版本切换,就很容易理解这个命令,git reset HEAD
是将暂存区恢复到当前版本的版本快照,后跟fileName
就会恢复特定的文件,也就是说这个命令其实是git reset
的一个特殊形式