一、git文件状态
在说git的文件状态前,首先要了解整个git的操作空间,git将空间分为工作区、暂存区、git仓库
• 工作区是指存储在磁盘上供你使用修改的区域,一般就指从服务器克隆下来的数据
• 暂存区是一个文件,保存了下次要提交的文件列表信息
• git仓库就是指本地仓库,保存了commit提交的各个版本,个人理解git仓库指的是.git/objects文件夹,
保存项目的元数据和对象数据库。
git的文件状态有两种,追踪(track)和未追踪(untrack),追踪的意思是该文件已经纳入git的版本控制,git已经知道这个文件,未追踪是指该文件未纳入git的版本控制,git不知道这个文件,这是个新的文件。同时文件在被追踪到后又有三种状态,根据git的三个区间可以分为已提交(committed)、已修改(modified)和已暂存(staged)。怎么理解这三种状态和前两种状态?举个例子假如你初始化了一个git仓,里面什么都没有,创建一个新的a.c文件,这个文件属于untrack,使用git add后这个文件属于track并且暂存状态,然后git commit提交属于已提交状态,最后你再次修改这个文件属于已修改未暂存状态。
• 已修改表示修改了文件,但是还没有保存到数据库
• 已暂存表示对一个已修改的文件在当地版本做了标记,使之包含在下次提交的快照中
• 已提交表示数据已经安全地保存在本地数据库中
二、git基础命令
•git help <verb>
,git <verb> --help
,man git-<verb>
这三个命令可以用来查询Git手册,-h
可以查找精简手册。
•git config
是用来设置Git外观和行为的配置变量,通过三个不同的文件配置。下面的路径都是linux系统路径。
1./etc/gitconfig
文件:系统上的每个用户的通用配置,–system选项相关
2.~/.gitconfig
:当前用户配置,–global选项相关,~代表home路径
3../.git/config
:当前仓库的配置,–local选项相关
上述三个配置文件的额优先级依次递增,git config有很多选项设置在这就不赘述。
•git init
初始化git仓库
•git clone
从远程服务器克隆git仓库,后面接多种数据传输方式,https://、SSH等协议。
•git add
有两个功能,一个是追踪(track),后面接路径时,递归地追踪该目录下的所有文件。一个是把已跟踪的文件放到暂存区,可接文件名。
•git status
查看文件状态,不多赘述。
•.gitignore
有些文件无需纳入Git管理,也不希望出现在未跟踪文件列表。那么可以在.gitignore添加,git会忽略。值得注意的是.gitignore只对未跟踪的文件起作用,如果说之前已经被追踪的文件添加忽略是不会起作用的,最好在项目仓库建立时就创建.gitignore文件。具体的.gitignore文件规则请自己百度。
•git diff
不加参数,比较的是工作目录当前文件和暂存区文件之间的差异,也就是修改之后未暂存的变化。加参数--staged
,比较的是已暂存的文件和最后一次提交的文件的差异。
•git commit
将暂存区的改动提交给本地版本库,--amend
修改提交信息。
•git rm
从git中移除文件,如果直接在本地删除文件,在git中并不会完全删除,会显示"Changes not staged for commit"。运行git rm
可以清楚该提示。值得注意对于已经放入暂存区的文件需要使用命令git rm -f
。如果想在本地保存该文件,不想被git追踪可以使用git rm --cached
。可以使用glob正则来提高匹配范围,详细看git的正则匹配方式。
•git mv [] []
移动文件位置,也可重命名文件。
•git log
不加参数按照时间先后列出所有的提交。git log -p 或者--patch
列出每次提交的改动,加入-2
限定显示几笔提交。git log --stat
对每笔提交进行总结,列出修改了哪些地方等总结性的信息。git log --pretty
可以使用不同的方式显示提交历史,pretty
可以取多种值如oneline、short、full等
。其中git log --pretty=format:" "
可以定制化格式输出,详细见文档。oneline 和 format
与graph
结合时可以显示分支、合并历史。与下图中的参数结合可以过滤某些信息。
•git reset
回退版本,git reset HEAD <file>
将暂存的文件回退成未追踪。如果想将文件回退到没修改的状态使用git checkout -- <file>
。
•git tag
打标签,打标签分为轻量标签和附注标签,轻量标签就是简单的标签只需要提供标签名不需要描述,使用git show <标签>
显示标签也不会有额外的信息,使用命令git tag <标签名>
。附注标签就是详细的标签,在git中使用一个完整的对象存储,使用git tag -a <标签名> -m <描述>
。如果想对过去的提交打标签可以使用git tag -a <标签名> <散列值>
。共享标签:将标签上传到远程服务器git push origin <标签名>
,git push origin --tags
可以传送多个标签。删除标签:git tag -d <标签名>
,要删除远程仓储的标签使用git push <remote> :refs/tags/<tagname>
这个命令的含义是将:前的空白标签推送到远程标签,从而删除它;也可以使用git push <remote> --delete <tagname>
删除。标签检出的detached HEAD问题不清楚