GIT
- GIT
- 版本控制
- 版本控制的意义
- 分布式
- 图形化客户端
- 环境搭建
- 仓库的操作
- 分支
- 使用场景
- 命令
- 远程仓库操作
- 生成公钥
- 命令
- 冲突
- 忽略列表的配置
- 时机
- 配置方式
- 版本回退
- 练习:
GIT
版本控制
把文件系统中的文件,按照修改的版本进行记录,进行管理的操作。
版本控制的意义
- 备份文件,防止丢失
- 协同工作,处理文件合并和冲突的问题
- 责任追溯
- 工作量统计
- 个人开发时代码的回退
分布式
git是一个分布式的版本控制工具,包含本地仓库和远程仓库两种仓库。每个仓库中都存放历史版本文件,可以单独进行管理。通过使用远程仓库可以实现多用户之间的协同。
图形化客户端
乌龟系列、SourceTree
环境搭建
开发者名称和邮箱:在git中,要求开发者提供一个名称和邮箱。用于开发者之间的沟通交流,该名称和邮箱不会进行验证,可以任意指定。但一般填写时,至少保证邮箱是自己的,便于其他开发者联系。
仓库的操作
工作区:.git目录在哪个目录中,那哪个目录就是工作区。工作区中的文件才能被版本控制。换句话说,工作区就是一个能够被git操作的范围。
本地仓库:就是.git目录,内部有一套存储结构,能够保存各个文件的版本并进行版本控制。
暂存区:是一个临时存储空间,工作区中的文件要先添加到暂存区,然后才能提交到本地仓库中成为一个版本。
命令 | 作用 |
---|---|
git init | 初始化,创建 git 仓库 |
git status | 查看 git 状态 (文件是否进行了添加、提交操作) |
git add 文件名 | 添加,将指定文件添加到暂存区 |
git commit -m ‘提交信息’ | 提交,将暂存区文件提交到历史仓库。git中强制提交时必须填写说明信息,建议把说明信息填写详细一些 |
git log | 查看日志( git 提交的历史日志) |
重置操作(回退版本)
git reset --hard 版本号前几位(只要这几位能唯一确定一个版本即可。)
分支
分支是每一次提交的代码的版本节点串成的一条时间线。可以从任何一个节点开辟新的分支继续进行串联。
使用场景
- 修复以前版本的bug
- 在开发分支中加入一些尝试性的操作(做实验)
- 并行开发多个不同版本
命令
-
创建 git branch 分支名
如果在创建分支的时候最后加上版本号,就可以基于指定版本创建分支。
git branch 分支名 版本号
-
切换 git checkout 分支名
-
查看分支列表 git branch
-
合并 git merge 分支名
把指定的目标分支的内容,合并到当前分支
合并:把两个分支中如果有互相独立的文件,直接放到一起。如果两个分支中有相同的文件,保留一个即可。如果两个分支中有相同名字的文件但是内容不一样,这就会查看内容中行是否可以合并。如果内容是完全不同的,并且不能简单追加合并,则产生冲突。冲突必须手动解决。
远程仓库操作
克隆:在本地什么都没有的情况下,第一次操作时进行的操作。会把远程仓库中的所有文件包括.git版本库都复制过来。一般克隆和init操作二选一即可。
推送:把本地仓库的内容上传到远程仓库中
注意:在实际操作时,为了保证推送能够成功,推送之前养成先拉取的习惯。同时,推荐大家养成勤拉取,勤提交的习惯。
拉取:把远程仓库中的内容下载到本地,这个下载是更新下载,类似于分支的合并。
生成公钥
用于验证以ssh协议访问仓库的权限。
公钥和私钥配对进行加密通信作为验证身份的手段。
直接参考gitee或者github上的新手向导输入指令添加公钥到服务器即可。
如果使用http协议的话,就不需要配置公钥和私钥了,而是会弹出登录窗口让你输入网站的用户名和密码进行验证。
命令
添加远端地址
git remote add 远端名称 url(http协议和ssh协议两种)
推送本地仓库到远端
git push -u 远端名称 分支名
克隆
git clone 远端url
拉取
git pull 远端名称 分支名
冲突
-
要尽可能提前预防冲突,防止冲突产生。勤拉取勤推送
-
产生冲突之后,要知道如何解决。
自动在拉取的时候会把冲突的文件进行合并,只不过会把冲突部分用特殊句式标注出来,我们需要手动指定最终版本然后再提交推送。所以,如果我们提交的粒度足够小,冲突的代码就会比较少,就会比较容易解决。
忽略列表的配置
时机
项目刚创建,第一次提交之前就要配置完毕。
配置方式
在工作目录下创建一个文件,名称为 .gitignore
# no .a files 以.a结尾的所有文件被忽略
*.a
# but do track lib.a, even though you’re ignoring .a files above
# lib.a会被版本控制,是在上面配置的基础上排除lib.a的忽略
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
# 忽略当前目录下的TODO文件,并不是TODO子目录
/TODO
# ignore all files in the build/ directory 忽略所有的build子目录下的资源,包含该目录本身
build/
# ignore doc/notes.txt, but not doc/server/arch.txt 忽略doc目录下的所有以.txt结尾的直接子文件,但是不会忽略子目录中的txt文件
doc/*.txt
# ignore all .pdf files in the doc/ directory 忽略doc目录下的所有pdf文件,包含子目录中的也忽略
doc/**/*.pdf
版本回退
- 记录当前的版本号
- 使用reset --hard的方式回退到指定的版本
- 使用reset --soft的方式指定版本为最初记录的版本号,把指针挪回最初的位置。但是soft的方式只挪指针,不会更改工作区的文件。所以看上去就是基于最新版本把文件全部修改为了指定的版本文件的内容。
- 使用commit提交,就可以保留历史版本回退了
练习:
-
创建本地仓库,完成若干版本的添加、提交、回退操作
-
在本地仓库创建新的分支,在分支和主分支之间创建一些冲突,然后合并新分支到主分支
-
注册一个gitee或者github账号,创建一个远程仓库,跟本地仓库关联。把本地仓库推送到远端。
-
在本地另一个文件夹中,从远端克隆仓库到本地。进行修改操作,推送到远端。
-
在两个本地仓库都关联上远端后,人为创建一些冲突。解决冲突并最终同步代码。
-
多人创建开发小组,模拟实际开发中的情况,处理git协同。
-
注册一个gitee或者github账号,创建一个远程仓库,跟本地仓库关联。把本地仓库推送到远端。
-
在本地另一个文件夹中,从远端克隆仓库到本地。进行修改操作,推送到远端。
-
在两个本地仓库都关联上远端后,人为创建一些冲突。解决冲突并最终同步代码。
-
多人创建开发小组,模拟实际开发中的情况,处理git协同。