git的使用
版本控制分类
集中式版本控制
cvs和svn都是集中式版本控制系统,它们的主要特点是单一的集中管理的服务器,保存所有文件的修订版本,协同开发人员通过客户端连接到这台服务器,取出最新的文件或者提交更新。
优点:这种做法相对于老式的本地管理来说,每个人都能在一定程度上看到项目中的其他人正在做什么。
缺点:中央服务器不能出错,在出错的这段时间,谁都无法提交更新,协同工作;如果中心数据库所在的磁盘发生损坏,又没做恰当备份,将丢失所有数据
分布式版本控制
git是属于分布式版本控制系统,它的主要特点是客户端并不只提取最新版本的文件快照,而是把代码仓库完整的镜像下来,包括完整的历史记录,所以任何一处协同工作用的服务器发生故障,事后都可以用任何镜像出的本地仓库恢复
git常用指令
1.新增文件的命令:git add file或者git add .
2.提交文件的命令:git commit –m或者git commit –a
3.查看工作区状况:git status –s
4.拉取合并远程分支的操作:git fetch/git merge或者git pull
5.查看提交记录命令:git reflog
6.创建仓库:git init
7.查看仓库的状态:git status
8.这次相较上次修改了哪些内容:git diff
9.将添加的文件放到栈存区中:git add
10.将栈存区内容提交到代码区中:git commit
11.将远程仓库的代码克隆到本地:git clone git地址
12.查看当前分支:git branch
13.切换分支:git checkout
git的文件状态划分
我们需要对文件来划分不同的状态,以确定这个文件是否已经归于git仓库的管理:
未跟踪:默认情况,git仓库下的文件没有添加到git仓库管理中,我们需要通过git add命令来操作(Untracked)
已跟踪:添加到git仓库管理的文件处于已跟踪状态已跟踪的文件,已跟踪的文件又可以进行细分状态划分:
staged:暂缓区中的文件状态;Unmodified:commit命令可以将staged中文件提交到文件仓库;Modified:修改了某个文件后,会处于Modified状态
在工作时,你可以选择性的将修改后的文件放入缓存区,然后提交所有已暂存的修改,一般我们会有一些文件无需纳入git的管理(本体环境文件,日志文件,编辑器自动生成文件),可以在.gitignore中添加忽略的内容
git的工作流程
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
Workspace:工作区,就是你平时存放项目代码的地方;
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息,一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index);
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本;
Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换;
远程仓库拉取
目前比较常用的远程仓库有Github,Gitee,与自己搭建的Gitlab,对于私有的仓库我们想要操作,远程仓库会对我们进行验证,目前git服务器验证手段主要有两种:
基于http的凭证存储
http协议本身是无状态的连接,所以每一次连接都需要用户名和密码,如果每次这样操作,会非常麻烦,幸运的是,Git 拥有一个凭证系统来处理这个事情。 下面有一些 Git 的选项:
- 默认所有都不缓存。 每一次连接都会询问你的用户名和密码。
- “cache” 模式会将凭证存放在内存中一段时间。 密码永远不会被存储在磁盘中,并且在15分钟后从内存中清除。
- “store” 模式会将凭证用明文的形式存放在磁盘中,并且永不过期。 这意味着除非你修改了你在 Git 服务器上的密码,否则你永远不需要再次输入你的凭证信息。 这种方式的缺点是你的密码是用明文的方式存放在你的 home 目录下。
- 如果你使用的是 Mac,Git 还有一种 “osxkeychain” 模式,它会将凭证缓存到你系统用户的钥匙串中。 这种方式将凭证存放在磁盘中,并且永不过期,但是是被加密的,这种加密方式与存放 HTTPS 凭证以及 Safari 的自动填写是相同的。
- 如果你使用的是 Windows,你可以安装一个叫做 “Git Credential Manager for Windows” 的辅助工具。 这和上面说的 “osxkeychain” 十分类似,但是是使用 Windows Credential Store 来控制敏感信息。 可以在 https://github.com/Microsoft/Git-Credential-Manager-for-Windows 下载。
基于ssh的密匙
ssh是一种网络传输协议,以非对称加密方式实现身份验证,通过生成的密匙进行认证,这样可以在不输入密码的情况下登录。具体配置可参考https://www.win7zhijia.cn/win10jc/win10_47515.html
git分支
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。分支具体可参考博客:https://blog.csdn.net/weixin_43660088/article/details/124489383
发生冲突
原因:因为在合并分支的时候,master分支和dev分支恰好有人都修改了同一个文件,GIT不知道应该以哪一个人的文件为准,所以就产生了冲突了。
解决:
- 通过git stash命令,把工作区的修改提交到栈区,目的是保存工作区的修改;
- 通过git pull命令,拉取远程分支上的代码并合并到本地分支,目的是消除冲突;
- 通过git stash pop命令,把保存在栈区的修改部分合并到最新的工作空间中
改提交到栈区,目的是保存工作区的修改;
2. 通过git pull命令,拉取远程分支上的代码并合并到本地分支,目的是消除冲突;
3. 通过git stash pop命令,把保存在栈区的修改部分合并到最新的工作空间中
合并冲突时会有智能提示,根据情况选择即可