一、版本控制工具
三、Git 命令行操作
本地库初始化
- 命令:git init
- 命令:git add
设置签名
- 形式:
- 用户名:tom
- Email地址:goodMorning@atguigu.com
- 作用
- 区分不同开发人员身份
- 辨析
- 这个签名和登录远程库的账号密码无关系
- 命令
- 项目级别/仓库级别:仅在当前本地仓库范围内有效
- git config user.name tom_pro
- git config user.email goodMorning_pro@atguigu.com
- 系统用户级别:登录当前操作系统的用户范围
- git config –global user.name tom_pro
- git config –global user.email goodMorning_pro@atguigu.com
- 信息保存位置:~/.gitconfig
- 级别优先级
- 就近原则:项目级别由于系统用户级别,二者都有是,采用项目级别的签名
- 如果只有系统用户级别的签名,就以用户级别的签名为准
- 二者都没有不允许
- 项目级别/仓库级别:仅在当前本地仓库范围内有效
基本操作
- 状态查看
- $ git status
- 查看工作区、暂存区状态
- 添加操作
- $ git add [file name]
- 将工作区的“新建/修改”添加到暂存区
- 提交操作
- $ git commit -m “commit message” [file name]
- 将暂存区的内容提交到本地库
- 查看历史记录操作
- $ git log 显示完整历史记录
- $ git log –pretty=oneline 单行显示历史记录(包含完整hash值和提交日志)
- $ git log –oneline 单行显示历史记录(包含部分hash值和提交日志,只显示过去的历史记录)
- $ git reflog 单行显示历史记录(包含部分hash值、HEAD@{移动到当前版本需要的步数}和提交日志,显示所有历史记录 )
- 版本前进后退
- $ git reset –hard [局部hash值](基于索引值操作)
- $ git reset –hard HEAD^(只能后退,一个^代表回退一个版本)
- $ git reset –hard HEAD~[n](回退n步)
- reset命令的三个参数对比
- –soft参数
- 仅在本地库移动HEAD指针
- –mixed参数
- 在本地库移动HEAD指针
- 重置暂存区
- –hard参数
- 在本地移动HEAD指针
- 重置暂存区
- 重置工作区
- –soft参数
- 删除文件并找回操作
- 前提:删除前,文件存在时的状态提交到了本地库
- 操作:$ git reset –hard [指针位置]
- 删除操作已经提交到本地库:指针位置指向历史记录
- 删除操作尚未提交到本地库:指针位置使用HEAD
- 比较文件差异
- $ git diff [文件名]
- 将工作区中的文件和暂存区进行比较
- $ git diff [本地库中历史版本] [文件名]
- 将工作区中的文件和本地库历史记录进行比较
- $ git diff
- 不带文件名,比较多个文件
- $ git diff [文件名]
分支管理
- 什么是分支?
在版本控制过程中,使用多条线同时推进多个任务。
|
|
- 分支有什么好处?
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
- 分支操作
- 创建分支
- $ git branch [分支名]
- 查看分支
- $ git branch -v
- 切换分支
- $ git checkout [分支名]
- 合并分支
- 第一步:切换到接受修改的分支上(被合并,增加新内容)
- $ git checkout [被合并的分支名]
- 第二部:执行性merge命令
- $ merge [有新内容的分支名]
- 第一步:切换到接受修改的分支上(被合并,增加新内容)
- 解决冲突
- 冲突的表现
- 以特殊符号分隔的方式列出合并分支中修改的内容
- 冲突的解决
- 第一步:编辑文件,删除特殊符号
- 第二步:把文件修改到满意的程度,保存退出
- 第三步:$ git add [filename]
- 第四步:$ git commit -m “log message”
- PS:此时commit一定不能带具体的文件名。
- 冲突的表现
- 创建分支
git的基本原理
- 哈希
- git保存版本的机制
- 集中式版本控制工具的文件管理机制(SVN)
- 以文件变更列表的方式存储信息。这类系统将他们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
- git的文件管理机制
- git把数据看作是小型文件系统的一组快照。每次提交更新时git都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以git的工作方式可以成为快照流。
- 集中式版本控制工具的文件管理机制(SVN)
- git分支管理机制
- git通过移动指针来管理不同分支
github
- 账号信息
- 创建远程库
- 创建远程库地址别名(基于http)
- $ git remote -v
- 查看当前所有远程地址别名
- $ git remote add [别名] [远程地址]
- $ git remote -v
- 推送
- $ git push [别名] [分支名]
- 如果是第一次推送,可能需要进行登录,登录成功后,由于win10具有凭据管理器,会保存登录的账号信息,可通过凭据管理器查看。当需要切换用户进行推送时,需要先将保存的凭据删除,重新登录。
- $ git push [别名] [分支名]
- 克隆
- 命令
- $ git clone [远程地址]
- 效果
- 完整的把远程库下载到本地
- 创建origin远程地址别名(可通过$ git remote -v 查看)
- 初始化本地库
- 命令
- 团队成员邀请
- 邀请团队成员进行开发,可以提高工作效率,可以实现更好的分工合作。123456789graph LRA[需发起邀请方的远程库] -->| | B[Setting]B --> C[Collaborators]C --> D[填写需要邀请人员的github用户名]D --> E[Add collaborator]E --> F[Copy invite link]F --> G[发送邀请链接]H[被邀请方登录github] --> I[在浏览器中粘贴邀请链接]I --> J[accept invitation]
- 邀请团队成员进行开发,可以提高工作效率,可以实现更好的分工合作。
- 拉取
- pull = fetch+merge
- pull 表示从远程库拉取内容到本地库并与本地库进行合并,
- fetch 表示从远程库拉取内容到本地库。
- merger 表示将从远程库拉取到的内容与本地库进行合并。
- $ git fetch [远程库地址别名] [远程分支名]
- 可通过 $ git checkout [远程库地址别名/远程分支名]切换到拉取下来的分支查看拉取的内容,待内容确认完毕,通过$ git checkout [本地分支名]切换回本地分支,进行下一步的合并操作。
- $ git merge [远程库地址别名/远程分支名]
- $ git pull [远程库地址别名] [远程分支名]
- pull = fetch+merge
- 解决冲突
- 团队合作冲突时不可避免的。
- 要点:
- 如果不是基于github远程库的最新版所做的修改,不能推送,必须先拉取。
- 拉取下来如果进入冲突状态,则按照“分株冲突解决”操作解决即可。
- 跨团队协作
- step 1:Fork远程仓库;
- step 2:克隆到本地进行修改,然后推送到远程;
- step 3:在远程仓库界面发起Pull Request;
- step 4:对话(可选);
- step 5:审核代码;
- step 6:合并代码;
- step 7:将远程库修改拉取到本地。
- SSH登录
- 进入当前用户的home目录
- $ cd ~
- 删除原有.ssh目录
- $ ssh-keygen -t rsa -C [email]
- 进入.ssh目录查看文件列表
- $ cd .ssh
- $ ls -lF
- 查看id_rsa.pub文件内容
- $ cat id_rsa.pub
- 复制id_rsa.pub文件内容,登录github,点击用户头像->Setting->SSH and GPD key
- New SSH Key
- 输入复制的密钥信息
- 回到git bash创建远程地址别名
- $ git remote add [origin_ssh远程地址别名] git@github.com:[用户名]/[仓库名].git
- 推送文件进行测试
- 进入当前用户的home目录
四、Pycharm操作
五、git工作流
- 概念
- 分类
集中式工作流
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162graph TDA((origin/master)) --- |pull/push| B(master 1)A --- |pull/push| C(master 2)A --- |pull/push| D( ...)A --- |pull/push| E(master n)```- GitFlow工作流```mermaidgraph LRA((主分支 v1.0))B((主分支 v1.1))C((主分支 v2.0))D((主分支 v3.0))E(热修复分支)F((开发分支))G((开发分支))H((开发分支))I((开发分支))J((开发分支))K[功能1]L[功能1]M[功能2]N[功能2]O[功能2]P[功能2]Q>预发布分支]R>预发布分支]S>预发布分支]A --> BB --> CC --> DA --> EE --> BE --> GA --> FF --> GG --> HH --> QQ --> RR --> CR --> IH --> II --> JJ --> SF --> KK --> LL --> HF --> MM --> NN --> OO --> PP --> SS --> DForking工作流
Forking 工作流是在GitFlow 基础上,充分利用了Git 的Fork 和pull request 的功能以达到代码审核的目的。更适合安全可靠地管理大团队的开发者,而且能接受不信任贡献者的提交。
- GitFlow工作流
- 分支种类
- 主干分支(master)
- 主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境完全一致。
- 开发分支(develop)
- 主要负责正在开发过程中的代码,一般情况下应该是最新的代码。
- bug修复分支(hot_fix)
- 主要负责管理生产环境下出现的紧急修复代码。从主干分支分出,修复完毕并测试上线后,并回主分支,并回后可视情况删除该分支
- 准生产分支(预发布分支release)
- 较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集成测试。该版本上线后,合并到主分支。
- 功能分支(feature)
- 为了不影响较短周期的开发工作,一般吧中长期开发模块从开发分支中独立出来。开发完成后合并回开发分支。
- 主干分支(master)
- 分支种类
六、GitLab服务器搭建过程
- 系统:Centos 7
- 命令
- sudo yum install -y curl policycoreutils-python openssh-server cronie
- sudo lokkit -s http -s ssh
- sudo yum install postfix
- sudo service postfix start
- sudo chkconfig postfix on
- curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
- sudo EXTERNAL_URL=”http://gitlab.example.com" yum -y install gitlab-ee
实际问题:yum安装gitlab-ee(或者ce)时,需要联网下载几百兆的安装文件,非常耗时,所以应提前把所需的RPM包下载并安装好。
下载地址:https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm
- 调整好的安装过程
- sudo rpm -ivh /opt/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm
- sudo yum install -y curl policycoreutils-python openssh-server cronie
- sudo lokkit -s http -s ssh
- sudo yum install postfix
- sudo service postfix start
- sudo chkconfig postfix on
- curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
- sudo EXTERNAL_URL=”http://gitlab.example.com" yum -y install gitlab-ce
当前操作完成后重启。
GitLab服务操作
- 初始化配置GitLab
- # gitlab-ctl reconfigure
- 启动GitLab服务
- # gitlab-ctl start
- 停止GitLab服务
- # gitlab-ctl stop
- 初始化配置GitLab
浏览器访问
- 在浏览器中输入Linux服务器的IP地址即可访问配置好的GitLab。
- 初次登录时需要为GitLab的root用户设置密码。
- 初次访问可能出现无法加载的情况,此时可能需要修改服务的防火墙配置。
- 停止服务器防火墙:# service firewalld stop