Git(二):文件操作总结

基本概念

首先理解Git 工作区、暂存区和版本库概念:

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫stage或index。一般存放在".git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。暂存区属于版本库的一部分。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git为我们自动创建了第一个分支master,以及指向master的一个指针叫HEAD。

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:在这里插入图片描述

文件状态

Git管理的文件有下面四种状态:

  • Untracked: 未跟踪。此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
  • Staged: 暂存状态。执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致,文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified。
  • Unmodify: 文件已经入库, 未修改。 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改,
    而变为Modified. 另外如果使用git rm就移出版本库并被删除。
  • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作。 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改

文件操作

一、状态查看

查看工作区和暂存区的状态的命令:

 #查看所有文件状态
git status
#查看指定文件状态
git status [filename] 

刚刚创建仓库后,查看仓库的状态:
在这里插入图片描述
根据描述可以知道,在仓库中,我们处在master分支下,暂时没有已经提交的文件,也没有可以提交的文件。还提示我们使用git add命令创建或复制一个文件在仓库中,以使用git的追踪文件的功能,

二、添加

首先明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

值得一提的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的。

1.命令

将工作区的文件添加到暂存区的命令:

 #添加指定文件到暂存区
git add [file name1][file name2].. 
#添加当前目录的所有文件到暂存区
git add 
 #添加指定目录(包括子目录)到暂存区
git add [dir]

2.创建文件

为了使用git add命令,首先使用vim创建一个test.txt文本文件,内容为随便编辑了三行字母。此时查看仓库的状态:
在这里插入图片描述
这时的状态是untracked,可以看到提示我们当前仓库中有一个名为test.txt文件没有被git跟踪。

3.添加文件到暂存区

按照提示将这个新建的文本文件添加到暂存区中:
在这里插入图片描述
这里的仓库状态又改变了,改为staged状态,提示我们可以将test.txt文件保存到本地仓库。

此时我们还可以使用以下命令将文件从暂存区中移出:

#直接从暂存区删除文件
git rm --cached <file>...

三、提交

1.命令

将暂存区的内容提交到本地库的命令:

git commit -m "commit message" [file name]

# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m "commit message"

# 提交工作区自上次commit之后的变化,直接到仓库区,跳过了add,对新文件无效
$ git commit -a

# 提交时显示所有diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m "commit message"

# 重做上一次commit,幷包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

这里的commit message为备注信息,我们要在这里说明自己改了什么地方。当我们需要写很多备注信息时,可以不使用-m 参数就会跳到vim编辑器再输入备注信息。

因为commit命令不指定文件时可以一次提交多个暂存区中的文件,所以我们可以先多次add不同的文件

2.具体使用

test.txt提交到本地仓库,提交成功后可以看到一些文件信息:
在这里插入图片描述
当我们对文件进行修改后再查看仓库的状态:
在这里插入图片描述
test.txt的状态改为modified,这里提示我们test.txt文件被修改了,还没有保存到本地库。可以使用git add <file>命令来更新,这命令会再提交一次文件,或者使用git restore <file>来撤销工作区中的修改。

这里使用commit命令提交test.txt文件来保存
在这里插入图片描述
这里可以看到版本号更改了,这是为了我们以后进行版本回退做准备的。

四、重写暂存区

#如果已经用add 命令把文件加入stage了,就先需要从stage中撤销
git reset HEAD <file>...

当执行 git reset HEAD命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

例子:将添加到暂存区的t1.txt必重写暂存区的方式移出暂存区
在这里插入图片描述

五、删除所有未跟踪文件

删除所有未跟踪文件的命令是:

#移除所有未跟踪文件
#一般会加上参数-df,-d表示包含目录,-f表示强制清除。
git clean [options] 

在这里插入图片描述
其他一些删除文件的命令:

#只从暂存区中删除,保留物理文件
git rm --cached readme.txt 

#不但从暂存区中删除,同时删除物理文件
git rm readme.txt 

#linux自带的命令,只删除工作区中的物理文件
rm readme.txt 

六、检出

如果仓库中暂存区中已经保存了文件,当我们修改出错了,就可以直接使用git checkout命令来撤销修改。另外我们还可以直接使用版本库中文件覆盖暂存区和工作区等。检出的相关命令:

$ git checkout branch
#检出branch分支。更新HEAD以指向branch分支,以及用branch  指向的树更新暂存区和工作区。

$ git checkout
#会用暂存区全部或指定的文件替换工作区的文件。

$ git checkout HEAD
#会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。
#这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改 动。

$ git checkout -- filename
#用暂存区中filename文件来覆盖工作区中的filename文件。
#相当于取消自上次执行git add filename以来(如果执行过)的本地修改。

$ git checkout branch -- filename
#维持HEAD的指向不变。用branch所指向的提交中filename替换暂存区和工作区中相应的文件。
#注意会将暂存区和工作区中的filename文件直接覆盖。

$ git checkout -- . 或写作 git checkout .
#注意git checkout 命令后的参数为一个点(“.”)。
#这条命令最危险!会取消所有本地的  #修改(相对于暂存区)。
#相当于用暂存区的所有文件直接覆盖本地文件,不给用户任何确认的机会!

$ git checkout commit_id -- file_name
#如果不加commit_id,那么git checkout -- file_name 表示恢复文件到本地版本库中最新的状态。

用暂存区的文件覆盖工作区的指定文件,示例:
在这里插入图片描述

七、查看文件修改后的差异

查看文件修改后的差异的相关命令

#将工作区中的文件和本地库历史记录比较
git diff [本地库中历史版本][文件名]
#不加文件名,将工作区中的所有文件和暂存区进行比较
git diff
#将工作区中的文件和暂存区进行比较
git diff [文件名]
#比较暂存区的文件与之前已经提交过的文件
git diff --cached

在这里插入图片描述
这里的— a表示修改之前的文件,+++ b修改后的文件。红色的表示删除的,绿色的表示增加的。

参考:
一个小时学会Git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章