Git
1、Git 简介
1.1 Git 是什么
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 Git是目前世界上最先进的分布式版本控制系统(没有之一)
1.2 版本控制
版本控制是一种软体工程技巧,在开发的过程中,确保由不同人所编辑的同一档案都得到更新。 版本控制透过文档控制记录程序各个模组的改动,并为每次改动编上序号
思考?
如果你是个程序员那你一定有这样的经历:
想修改代码中的一段内容,又怕将来想恢复找不回来怎么办?有办法,先把当前文件另存为一份”一个新的文件再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的项目文档变成了这样:
过了一周,你想找回被修改的代码,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。
看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。
更要命的是,有些部分需要你的项目组同事帮助填写,于是你把文件Copy到U盘里给她(也可能通过Email发送一份给她),然后,你继续修改项目。一天后,同事再把项目文件传给你,此时,你必须想想,发给她之后到你收到她的文件期间,你作了哪些改动,得把你的改动和她的部分合并,真困难。
于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?
1.3 集中式 vs 分布式
- 集中式版本控制工具:
CVS、SVN、VSS、...
- 分布式版本控制工具:
Git、Mercurial、Bazaar、Darcs、...
1.4 Git 简史
1.5 集中式vs分布式优缺点
集中式版本控制系统: 最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟 分布式版本控制系统: 安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
1.6 Git git三层结构-- 工作区、暂存区、版本库
1.工作区(working directory)
2.暂存区 (staging index)
3.版本库 (git directory)
1.7 Git和他的好基友(GitHub、Gitee、GitLab)
git 版本控制工具
github、gitee、gitlab 远程的代码托管平台
gitlab 一般是公司内部通过这玩意去在公司内部搭建一个代码托管平台。
1.8 GIt 安装
2. Git 命令行操作
2.1 本地库初始化
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
所以,创建一个版本库非常简单,首先,对需要管理的项目文件夹右键选择 git Bash Here 自动跳转到当前目录下
为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文不包含中文不包含中文不包含中文
- git init 初始化
会生成一个 .git 隐藏文件夹,不要对这个文件夹进行操作,不然本地库就坏了。
如果我们想要把一个项目的版本库给去掉从新初始化的时候,就直接删除这个 .git 文件夹。重新 git init 操作
红色区域表示当前文件夹的目录 绿色区域标识git创建的子目录(是存放git对于当前文件夹的版本控制信息)
2.2 配置用户信息 !!!!
因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。
问题:提交代码时会出现下面的问题
原因:没有配置用户信息
配置作用:区分不同开发人员的身份
配置方式:
git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
# 配置信息存放在 系统的用户目录下 C:\Users<当前系统的用户名>.gitconfig 文件
优先级:项目级别 > 系统级别
查看git配置信息
git config --list查看 我们配置的用户名和邮箱
2.3 基本命令操作
1. 状态查看 git status
命令查看工作区文件是否被追踪(文件状态)
2. 添加到暂存区
git add 文件名
将单个文件添加到暂存区
git add .
将当前目录下所有修改或新增的文件全部添加到暂存区
3. 提交版本库
git commit
回车之后会进入到 vim 编辑器中,需要输入这次提交的日志
git commit -m "这次提交的日志"
回车之后直接提交了,不会进入 vim 中
git commit -am
将工作区的文件提交到版本库中(前提是文件之前被提交过)git add和git commit -m的组合技
4. 查看历史记录
git log
列出从当前版本为止全部的提交日志,
如果一屏展示不下,可以使用键盘操作翻页。这时使用 Ctrl + C 退出不了。可以使用 q 来退出
5. 版本回退
版本回退的本质:
就是一个 HEAD 指针的操作
git checkout -- 文件名
拉取暂存区的指定文件将其替换工作区的文件 注意文件名和--之间要有空格空格空格
git checkout -- .
拉取暂存区的全部文件将其替换工作区的全部修改:
git reset commitid .
拉取最近指定版本库中全部到暂存区,该操作不影响工作区
git reset --hard commitid
拉取指定版本库的文件将其替换工作区的文件
6. 删除文件
git rm --cached 文件名 将文件从缓存区删除
7.重命名
mv 文件名 新文件名会将工作区文件进行更名
2.4 分支管理
1. 什么是分支
在版本控制过程中,使用多条线同时推进多个任务。
例如:假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
2. 分支的好处
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
同时并行推进多个功能迭代,提高开发效率
并行的多个分支之间不会互相冲突
3. 查看分支
查看本地仓库的分支情况
git branch
查看远程仓库的分支情况
git branch -r
查看本地与远程的所有分支情况
git branch -a
4. 创建分支
git branch <分支名字> 只是创建分支
git checkout -b <分支名字> 创建分支,并切换到新创建的这个分支上
5. 切换分支
git checkout <分支名字>
注意:本地如果不存在这个分支,则会把远程的给弄下来,如果远程也没有,就报错
6. 合并分支
先切换被合并的分支上。
使用 git merge <需要合并的分支>
7. 合并时解决冲突
原因:两个分支在同一个代码上的某一个位置做了修改,这些 git 合并时不知道该听那个分支的。
1 找到有冲突的文件
2 删除这个文件中的特殊标记 (<<<<<<<,=======,>>>>>>>标记出不同分支的内容)
3 找到相应的开发人员去商量到底如何处理这个情况,用你的,还是用我的,或者两个都保留
4 git add
5 git commit
8. 删除分支
git branch -d <分支名字> 以及合并过的分支可以这样去删除
git branch -D <分支名字> 没有合并过的分支,但是里面有代码修改,使用 -d 删除,是删除不了的。确定要删除,就是用 -D
2.5 远程库(使用代码托管平台)
gitHub是一个面向开源及私有软件项目的托管平台(基于git实现代码管理平台),因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。
gitee是开源中国(www.oschina.net/)开发的一款基于git的代码托管平台,能够用码云实现代码托管、项目管理、协作开发,目前是国内最大的代码系统,gitee和github的作用和性质是类似的,但是相比于github而言,gitee有两个显著的优势:一是速度快,二是支持免费的私密项目。
模拟使用:
张三 (项目经理) qf-zhangsan@yopmail.com
李四 (普通开发人员)
王五 (普通开发人员)
1. 创建远程库
张三是个项目经理 在开发之初先进行初始化项目创建 于在远程仓库中创建对应仓库 写好的空框架可以在github或者码云上进行关联
需要新建一个库
2. 远程库与本地库关联(简化了每次链接不用每次在输入地址了 此步骤可以不进行 但是建议这样做)
git remote add 远程库链接别名一般是origin 远程库的https地址或者ssh地址
git remote add <远程连接别名,一般默认使用origin> <远程仓库的https地址或ssh地址>
码云方式:
github方式:
删除远程库与本地库关联
git remote remove 远程库链接别名
3. 查看本地库与远程库的关联信息
git remote -v
4.推送push到远程库
项目经理张三关联远程库之后就把空框架推送到远程库方便其他员工使用
注意可能会出现如下错误
出现的原因是 在这个电脑上登录过其他账号的gitee 或者github 需要删除之前的登陆信息
Windows:在控制面版 =》 用户账户 =》 凭据管理器 选中windows凭据,找到gitee点击删除 重新尝试即可
Mac:进入 钥匙串访问 ---》密码---〉找到gitee删除重新进行即可
git push 远程库链接别名 master
码云:
github:
5. 克隆远程库
李四加入到张三的公司,李四需要将Apple项目克隆到本地 张三给李四一个远程仓库的地址
李四使用 git clone <远程仓库的地址> 克隆项目到本地 注意:克隆不需要git init初始化
git clone 远程仓库地址
5. 推送 push
李四已经克隆了代码,张三让李四做一个登陆的功能。(其他组员和李四操作一样)
不要直接在master上写代码,询问张三(老大)我基于那个分支做开发。
1.使用git branch 你的分支名 创建分支
2.使用git branch 查看分支
3.使用git checkout 你的分支名 切换到你的开发分支
4.切换到你的分支进行开发 一个功能一天做不完,也需要每天下班之前提交推送一下。所以可以推送到远程库的对应你的分支上(有些公司老大要看看工作饱和度)
git push 地址 你的分支名
此时远程库就会有多条分支
6合并分支
1.先把项目从远程库 pull下来 git pull 地址
2.然后切换到master主分支(但是不要忘了在原有分支上add 与 commit )git checkout master
3.开始合并git merge 你要合并的分支名 进行合并
但是此时可能会有冲突页面中出现
<template>
<div id="app">
<div id="nav">
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
<<<<<<< HEAD
</div>我是小白写的东1
</div>我是小白写的东1
</div>我是小白写的东1
</div>我是小白写的东1
</div>我是小白写的东1
=======
</div>我是小黑修改的
</div>我是小黑修改的
</div>我是小黑修改的
</div>我是小黑修改的
</div>我是小黑修改的
</div>我是小黑修改的
</div>我是小黑修改的
>>>>>>> 27d81c46e68b4f6980ec5b8dfb908594e8c5a863
需要手动找到和你冲突的人 删除符号之后 重新push即可
2.8 ssh免登录
1 需要先查看本地电脑是否有 ssh 相关的东西 (用户目录下是否有 .ssh 的文件夹)。有就先删除吧。
2 创建 ssh key
ssh-keygen -t rsa -C "邮箱地址"
3 接着在 用户目录下找到 .ssh 文件夹中的 id_rsa.pub 这个文件
4 复制 id_rsa.pub 中的内容
5 去远程托管平台上添加 ssh
1 这时克隆项目时就可以直接选择使用 ssh 的方式
2 先将本地的https的连接方式给删除,换成 ssh 的连接方式
3. Git 工作流
1 集中式 大家全部都在一个分支上写代码master
2 git flow 不同分支用来干不同的操作
3 forking fork pull request 这套操作