Git基本知识-基本操作

来源:互联网 发布:乱世佳人电影 知乎 编辑:程序博客网 时间:2024/05/24 06:28

Git基本知识-记录本地库中文件改变

在本地库的文件都可以归为两种状态:tracked或者untracked。tracked文件即已通过git add命令所添加过的文件,它们可以有三种状态:unmodified、modified或者staged;Untracked文件即除tracked文件外的文件。当你的本地Git库为新克隆的库时,那么此库中所有的文件都是tracked和unmodified文件,因为git只检查tracked状态的文件。

当你编辑tracked状态的文件的文件时,Git将其状态变更为modified,Git暂存这些已修改的文件,在随后的commit中将所有暂存的(staged)文件提交,如下图所示:

image

查看库中文件的状态

查看库中文件状态使用git status命令。

如果是在新克隆的库中运行如下:

$ git statusOn branch masterYour branch is up-to-date with 'origin/master'.nothing to commit, working directory clean

意思是你的工作目录很干净,换句话说,你库中tracked状态的文件没有改变的。此命令告诉了你你当关所在的是哪个分支,并且通知你你当前库中文件与服务上文件是没有不同的。

然后在此本地库中添加一个文件然后运行git status命令如下:

$ echo 'My Project' > README$ git statusOn branch masterYour branch is up-to-date with 'origin/master'Untracked files:    (use "git add <file>..." to include in what will be committed)    READMEnothing added to commit but untracked files present(use "git add" to track)

你可以看到新建的README文件为untracked。

tracking 新的文件

为了使Git追踪一个新的文件,首先需要git add命令。如下:

$ git add README

然后此时我们运行git status命令如下:

$ git statusOn branch masterYour branch is up-to-date with 'origin/master'Changes to be committed:    (use "git reset HEAD <file>..." to unstage)    new file:README

注:git add 命令既可以是文件,也可以是目录,如果是目录,则递归添加目录中所有的文件。

暂存已修改的文件

当我们改变一个tracked状态的文件时,假如文件就叫做lisi.txt,那么我们运行git status命令:

$ git statusOn branch masterYour branch is up-to-date with 'origin/master'.Changes to be committed:    (use "git reset HEAD <file>..." to unstage)    new file:   READMEChanges not staged for commit:    (use "git add <file>..." to update what will be commited)    (use "git checkout -- <file>..." to discard changes in working directory)    modified:   lisi.txt

lisi.txt文件出现在名字叫作“Changes not staged for commit”的区域,意味着此被追踪的文件在工作目录中已经被修改,但是还没有staged(被暂存)。想要暂存则需要运行git add命令。git add 命令是一个多功能命令,可以用于tracking新的文件,stage(暂存)文件,或者标记合并时有冲突的文件为已解决文件等。git add命令可以这样解释:添加这些内容以便下次提交,而不是添加这个文件到项目中去。然后我们执行git add 命令后再执行git status命令如下:

$ git add lisi.txt$ git statusOn branch masterYour branch is up-to-date with 'origin/master'Changes to be committed:    (use "git reset HEAD <file>..." to unstage)    new file:   README    modified:   lisi.txt

现在这两个文件都被暂存以便下次一起提交。现在如果我们对lisi.txt再次改变,然后运行git status如下:

$ vi lisi.txt$ git statusOn branch masterYour branch is up-to-date with 'origin/master'Changes to be committed:    (use "git reset HEAD <file>..." to unstage)    new file:   README    modified:   lisi.txtChanges not staged for commit:    (use "git add <file>..." to update what will be committed)    (use "git checkout --<file>..." to discard changes in working directory)    modified:   lisi.txt

见鬼?现在list.txt文件同时处于staged和unstaged的状态,这怎么可以呢?这表明了git在暂存文件(即将文件放入暂存区域)时git add命令运行时是什么样子暂存到暂存区域的文件就是什么样子。如果你现在提交,那么lisi.txt文件的版本则是暂存区域中的文件版本,而不是工作目录中的lisi.txt文件版本,即最后一次git add命令时暂存区域中的文件版本。所以,当你git add命令运行后又改变了暂存区域中的文件时,需要再次运行git add命令:

$ git add lisi.txt$ git statusOn branch masterYour branch is up-to-date with 'origin/master'Changes to be committed:    (use "git reset HEAD <file>..." to unstaged)    new file:   README    modified:   lisi.txt

Short Status

尽管git status命令的输出非常合理,但是也太哆嗦,git 还支持一种更紧凑的方式查看文件状态,运行git status -s 或者 git status –short命令即可:

$ git status -s A   READMEM   lisi.txt??  zhaoliu.txt

??表示untracked状态的文件;A表示新增的添加到staged区域的文件;M 表示已修改的文件,如果M与左边?对齐表示添加到staged区域,反之则尚未添加到;MM则表示已修改的文件暂存到staged区域后又发生了修改。

Ignoring Files

通常,总有一些文件我们不愿意它们被git管理,甚到不愿意看到它们,比如日志文件或者构建工具生成的文件,这时你可以创建一个叫做.gitignore的文件,在文件中列出过滤规则即可。过滤规则可简单如下:

$ cat .gitignore*.[oa]*~

第一条规则告诉git忽略任何以.o和.a结尾的文件,第二条规则则表示忽略所有以~结尾的文件。

过滤规则使用shell使用的简化正则表达式,表示匹配0个或者多个字符,[]表示匹配其中的任意一个,?表示匹配单一字符,*表示可匹配嵌套目录等等。如果开头为#,表示过滤规则的注释,等同空行;如果以!开头,表示取反等等,且看如下一例:

# 忽略以.a结尾的文件*.a# 即使上面规则,也不忽略此文件!lib.a# 仅忽略当前目录下的TODO文件,不忽略当前目录下子目录中的TODO文件/TODO# 忽略build目录下的所有文件build/# 忽略doc目录下所有以.txt结尾的文件,但不忽略其子目录下的.txt文件、doc/*.txt# 忽略doc目录下所有以.pdf目录结尾的文件,包括其子目录中的doc/**/*.pdf

查看Staged状态文件与Unstaged状态文件的改变

使用git status命令可以让你查看哪些文件改变,但是要查看文件改变的内容需要使用git diff命令。

如果要查看尚未暂存到暂存区的文件改变,直接输入git diff:

$ git diff diff --git a/wangwu.txt b/wangwu.txtindex e69de29..99387b0 100644--- a/wangwu.txt+++ b/wangwu.txt@@ -0,0 +1 @@+zhangsanlisiwangbadan

此时比较的是你目录中的文件与staged区域中的文件改变,如果运行git diff –staged或者git diff –cached命令,则比较的则上上次提交后与暂存区中文件的不同。

Committing Your Changes

提交改变使用git commit命令,如果不带参数运行则提示输入备注信息然后提交,如果添加-m

删除文件

如果仅仅是在目录中删除文件,那么被删除文件不会被暂存,即在然后运行git commit时删除操作是不会被提交的,需要先使用git add添加到暂存区,然后再运行git commit,或者需要直接运行git commit -a 才可提交删除操作。如下:

$ rm lisi.txt$ git statusOn branch masterChanges not staged for commit:    (use "git add/rm <file>..." to update what will be committed)    (use "git checkout  --<file>..." to discard changes in working directory)    deleted:    lisi.txt$ git add lisi.txt$ git statusOn branch masterChanges to be committed:    (use "git reset HEAD <file>..." to unstage)    deleted:    lisi.txt$ git commit -m "then the delete operation is committed"

别外或直拉使用git提供的git rm 命令可直接将删除变理暂存暂存区:

  • 如果同时删除目录中文件:git rm

Moving Files

git mv 命令可用于移动文件,在git中认为为rename,即重命名。用法如下:

$ git mv file_from file_to

git mv README.MD README执行相当于执行如下操作:

$ mv README.MD README$ git rm README.MD$ git add README
原创粉丝点击