Git
Git是一个开源的分布式版本控制系统,可以有效、高速地处理项目版本管理。
版本控制:一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
分布式:每个人的开发机上都有独立的版本库,开发者可以在自己的开发机管理代码版本。
Git安装
Git配置用户信息
当安装完Git应该做的第一件事就是配置用户名称与邮件地址。因为每一个Git的提交都会使用这些信息,并且它会写入到每一次提交中。
1 | --配置用户信息 |
传递–global选项则Git读写~/.gitconfig文件。
Git初始化本地仓库
1 | --在工作区所在目录执行以下命令 |
小提示:git init命令会在当前目录中创建一个名为.git的隐藏目录。
Git工作区、暂存区和版本库
工作区(Workspace):放项目代码的地方,项目代码对应的文件。
暂存区(Index/Stage):也叫索引,是一个文件,保存了下次将提交的文件列表信息。
本地仓库(Repository):就是安全存放数据的位置,这里边有你提交的所有版本的数据。
工作流程
1.在工作区中添加、修改文件;
2.添加工作区的更改到暂存区;
3.将暂存区域的文件列表信息提交到本地仓库。
Git跟踪文件
1 | --首先确认本地工作区中有项目文件。 |
提示:其实将文件添加为跟踪状态,就是将其放入缓存区,从而git就可以跟工作区、本地仓库做比对。
Git修改文件
git commit–amend
增补提交,会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消。
1 | --查看提交记录 |
提示:使用git log–oneline可以让每次的提交信息显示在一行
Git删除文件
1 | --删除工作区的文件 |
提示:使用git rm 文件则不仅从工作区删除文件并且缓存区的也被删除。
Git撤销本地文件的修改
1 | --把文件从暂存区域复制到工作目录,用来丢弃本地修改 |
提示:
checkout的功能很多,从Git 2.23版本开始引入了两个新的命令:git switch用来切换分支,git restore用来还原工作区的文件。
提示:从暂存区恢复工作区数据的前提是,暂存区有对应数据。
Git取消暂存
1 | --恢复暂存区,也就是丢弃add到暂存区的状态,是将内容从本地仓库恢复到暂存区。 |
提示:以上恢复暂存区的操作不影响工作区。
Git跳过暂存区
1 | -- -a选项,Git会自动把所有已经跟踪过的文件暂存起来一并提交,从而 |
提示:
使用-a跳过git add步骤的前提是这些待提交的数据,是已跟踪过的。
-a不会自动将未跟踪文件变为已跟踪。
Git版本回退(一)
1 | --将暂存区回退到指定版本,并删除之前的所有提交信息。 |
HEAD说明:
- HEAD表示当前版本
- HEAD^上一个版本
- HEAD^^上上一个版本
- HEAD^^^上上上一个版本
- 以此类推…
可以使用~数字表示
- HEAD~0表示当前版本
- HEAD~1上一个版本
- HEAD~2上上一个版本
- 以此类推…
Git版本回退(二)
git reset--hard HEAD–hard参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交。
1
2git reset --hard HEAD
git reset --hard HEAD^
Git撤销提交
git revert HEAD撤销昀新的提交,并生成新的提交
git revert [-n] HEAD-n参数,撤销昀新提交,但执行命令后不进入编辑界面,也就是不会自动帮你提交文件,需要手动提交。
Git设置忽略文件
一般我们总会有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表。
通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。
在这种情况下,我们可以创建一个名为.gitignore的文件,列出要忽略的文件模式。
格式规范
- 所有空行或者以注释符号#开头的行都会被Git忽略
- 可以使用标准的glob模式匹配
- 匹配模式昀后跟斜杠(/)说明要忽略的是目录
- 要忽略指定模式以外的文件或目录,可以在模式前加上感叹号(!)进行取反
glob模式
所谓的glob模式是指shell所使用的简化了的正则表达式,匹配规则如下:"*":星号匹配零个或多个任意字符。[]:匹配任何一个列在方括号中的字符,如[ab]匹配a或者匹配b。"?":问号匹配一个任意字符。[n-m]:匹配所有在这两个字符范围内的字符,如[0-9]表示匹配所有0到9的数字。
匹配示例
logs/:忽略当前路径下的logs目录或多级路径下的logs目录,包含logs下的所有子目录和文件。/logs.txt:忽略根目录下的logs.txt文件。*.class:忽略所有后缀为.class的文件。!/classes/a.class:不忽略classes目录下的a.class文件。tmp/*.txt:只忽略tmp目录下的.txt文件。**/foo:可以忽略/foo, a/foo, a/b/foo等。





