Git基本知识-基本操作
Git基本知识-记录本地库中文件改变
在本地库的文件都可以归为两种状态:tracked或者untracked。tracked文件即已通过git add命令所添加过的文件,它们可以有三种状态:unmodified、modified或者staged;Untracked文件即除tracked文件外的文件。当你的本地Git库为新克隆的库时,那么此库中所有的文件都是tracked和unmodified文件,因为git只检查tracked状态的文件。
当你编辑tracked状态的文件的文件时,Git将其状态变更为modified,Git暂存这些已修改的文件,在随后的commit中将所有暂存的(staged)文件提交,如下图所示:
查看库中文件的状态
查看库中文件状态使用git status命令。
如果是在新克隆的库中运行如下:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
意思是你的工作目录很干净,换句话说,你库中tracked状态的文件没有改变的。此命令告诉了你你当关所在的是哪个分支,并且通知你你当前库中文件与服务上文件是没有不同的。
然后在此本地库中添加一个文件然后运行git status命令如下:
$ echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present(use "git add" to track)
你可以看到新建的README文件为untracked。
tracking 新的文件
为了使Git追踪一个新的文件,首先需要git add命令。如下:
$ git add README
然后此时我们运行git status命令如下:
$ git status
On branch master
Your 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 status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
Changes 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 status
On branch master
Your 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 status
On branch master
Your 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
Changes 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 status
On branch master
Your 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 README
M 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.txt
index 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 status
On branch master
Changes 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 status
On branch master
Changes 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
上一篇: 数据库基础知识--数据库知识的一些小总结
下一篇: PHP操作数据库