一. 引言

  • 在单人开发过程中, 需要进行版本管理, 以利于开发进度的控制
  • 在多人开发过程中, 不仅需要版本管理, 还需要进行多人协同控制

二. 介绍

  • Git是一个开源的分布式版本控制系统, 用于敏捷高效地处理任何或小或大的项目
  • Git是Linus Torvalds 为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件
  • 官网: https://git-scm.com/

三. Git安装

3.1 下载Git

3.2 安装

  • 除了安装的位置外, 其他一直点下一步即可

3.3 基本配置

  • 安装后, 打开cmd(或者在桌面鼠标右键 Git Bash Here ), 自报家门
  • 如下信息会在提交代码时使用, 记录在你的每次提交中, 以后才知道哪次提交是谁做的
git config --global user.name "用户名" #用户名
git config --global user.email "邮箱" #邮箱
#查看信息
git config -l #如果出现: 或者end 输入q即可退出

3.4 测试

  • 查看git版本
git version

四. 架构

  • 版本库: 工作区中有一个隐藏目录 .git, 这个目录不属于工作区, 而是git的 版本库, 是git管理的所有内容
  • 暂存区: 版本库中包含一个临时区域, 保存下一步要提交的文件
  • 分支: 版本库中包含若干分支, 提交的文件存储在分支中

五. 仓库

  • 对应的就是一个目录, 这个目录中的所有文件被git管理起来
  • 以后会将一个项目的根目录, 作为仓库
  • 仓库中的每个文件的改动, 都由git跟踪

5.1 新建仓库

  • 选择一个目录, 例如D:/GitSpace 执行命令: git init
  • 在此目录下, 会新建一个 .git 目录(默认是隐藏的), 即仓库对应目录

5.2 工作区

  • 执行 git init 的目录即为工作区, 如 D:/GitSpace 目录即为工作区[不包含其内部的 .git 目录]
  • 所有文件, 都首先在工作区新建, 然后可以存入仓库(版本库), 进行版本控制

5.3 暂存区

  • 暂存区也在 .git 目录内, 工作区的文件进入仓库时, 要先进入暂存区

5.4 分支

  • 版本控制, 简单说, 就是记录文件的诸多版本, 分支就是这些版本的最终记录位置

六. 基本操作

6.1 查看仓库状态

  • 执行 git status 可以看到工作区中文件的状态

6.2 暂存文件

  • 执行 git add . ,将工作区中的文件全部 存入暂存区

6.3 提交文件

  • 执行 git commit -m "这里写提交的描述信息" 作用是将暂存区的文件存入版本库中的分支, 形成一个版本

七. 远程仓库

  • 第五章的仓库, 其实是本地仓库
  • 当多人协同开发时, 每人都在自己的本地仓库维护版本
  • 但很重要的一点是, 多人之间需要共享代码, 合并代码, 此时就需要一个 远程仓库

7.1 远程仓库工作模式

  • workspace(add)---->localCache(commit)---->localRepository(push)---->remoteRepository(clone)---->localRepository(checkout)---->branch workspace

    • 本地工作区添加到本地暂存区
    • 从本地暂存区提交到本地仓库
    • 从本地仓库上传到远程仓库(共享区域)
    • 从远程仓库中复制到本地仓库
    • 在本地仓库切换分支然后后续的 git commit便会在此分支上新建版本(提交点)

7.2 远程仓库选型

7.3 基本操作

  • 每个开发人员, 在面对远程仓库时, 会面临的一些基本操作
7.3.1 注册git服务器账号
  • 码云 注册账号, 并登录
  • 进入公司后, 很可能会使用公司自己搭建的git服务器, 向领导索要账号即可
7.3.2 新建远程仓库
  1. 通过网站右上角的「+」号,选择「新建仓库」,进入新建仓库页面
  2. 在新建仓库页面填写仓库信息。仓库相关概念说明如下:
    • 仓库名称: 仓库的名称,用于仓库命名
    • 归属:仓库归属账户,可以是个人账号/组织/企业中的一种,创建成功后该账户默认为仓库的拥有者(管理员)
    • 路径:仓库的git访问路径,由用户个性地址+仓库路径名称组成。创建仓库后用户将通过该路径访问仓库。
    • 仓库介绍:仓库的简单介绍
    • 是否开源:设置仓库是否为公开仓库,公开仓库对所有人可见,私有仓库仅限仓库成员可见。
    • 选择语言:仓库主要开发用的编程语言
    • 添加.gitignore:系统默认提供的git忽略提交的文件模板,设置.gitignore后将默认忽略指定目录/文件到仓库
    • 添加开源许可证:如果仓库为公开仓库,可以添加设置仓库的开源协议,作为对当前项目仓库和衍生项目仓库许可约束,开源许可证决定了该开源项目是否对商业友好。
    • Readme:项目仓库自述文档,通常包含有软件的描述或使用的注意事项。
    • 使用\*\*\*模板文件初始化仓库:使用IssuePull Request文件模板初始化仓库
  3. 输入相关选项, 点击创建
    • 生成了两种类型的地址 HTTPS 和 SSH
7.3.3 本地关联远程仓库
  • 本文档选用仓库的https协议的地址, 将此地址关联到本地git中
git remote add origin https://gitee.com/MARSdoubleZ/git_repo.git
#如果提示已经存在origin则先执行 git remote rm origin 把原先的origin删除掉
git remote -v #查看远程仓库地址
7.3.4 上传文件到远程仓库
  • 将本地仓库中已经commit的内容push到远程仓库, 以共享自己的代码
#将本地master分支, 上传到远程master分支
git push origin master
#上传时会有弹框, 需要输入码云的账号和密码
  • 这里可能会出现连接不上远程仓库的情况, 解决方式如下
#方法一: 查一下代理, 如果有就清除
git config --global http.proxy
git config --global --unset http.proxy
git config --global https.proxy
git config --global --unset https.proxy
7.3.5 复制远程仓库
  • 如果仓库已经由别人创建完毕, 我们需要其中的内容, 则可以通过 git clone 将其复制到本地
#复制
git clone 远程地址
#复制来的内容, 自动形成了本地仓库
7.3.6 代码共享
  • 多人协同开发时, 写好代码的 git push 上传到远程仓库; 需要代码的 git pull 拉取代码即可
#上传新版本
git commit -m "new file hello.txt" #本地新增版本
git push origin master #将本地的master分支的内容同步到远程仓库的master分支 #获取新版本
git pull origin master #拉取远程仓库中的master分支内容
7.3.7 命令汇总
  • git remote add origin 远程地址

    • 本地关联远程仓库, origin是远程仓库的标识名
  • git push origin master
    • 将本地仓库内容上传到远程仓库的分支中
  • git pull origin master
    • 从远程仓库分支中下载内容到本地
  • git clone 远程地址
    • 将远程仓库复制到本地, 并自动形成一个本地仓库

7.8 生成/添加SSH公钥

  • Gitee 提供了基于SSH协议的Git服务,在使用SSH协议访问仓库仓库之前,需要先配置好账户/仓库的SSH公钥。
  • 你可以按如下命令来生成 sshkey:
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"

注意:这里的 xxxxx@xxxxx.com 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。

现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱。

  • 按照提示完成三次回车,即可生成 ssh key。通过查看 ~/.ssh/id_rsa.pub 文件内容,获取到你的 public key
cat ~/.ssh/id_rsa.pub
  • 复制生成后的 ssh key,通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,添加生成的 public key 添加到仓库中。
  • 添加后,在终端(Terminal)中输入
ssh -T git@gitee.com
  • 首次使用需要确认并添加主机到本机SSH可信列表。若返回 Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access. 内容,则证明添加成功。
  • 添加成功后,就可以使用SSH协议对仓库进行操作了。

八. 分支

8.1 分支简介

  • 分支, 是一个个版本最终存储的位置
  • 分支, 就是一条时间线, 每次 git commit 形成一个个版本, 一个个版本依次存储在分支的一个个提交点上
  • 分支由多个提交点组成, 分支上会有一个指针, 默认总是指向最新的提交点

8.2 分支操作

8.2.1 查看分支
  • 查看当前仓库的分支 git branch
  • 仓库中默认的只有master分支
  • 执行 git commit 时, 默认是在master分支上保存版本
8.2.2 创建分支
  • 在商业项目开发过程中, 我们不会轻易的在 master 分支上做操作
  • 我们会新建一个 开发用的分支 , 在此分支上做版本的记录, 当代码没有问题时, 才会将开发分支上成熟的代码版本添加到 master 分支上
  • 保证开发过程中, 可以及时记录版本, 又保证 master 分支上每个提交点都是稳健版本
#创建分支
git branch dev
8.2.3 切换分支
  • 默认情况下, 当前使用的分支是 master 分支
  • 可以切换到 dev 分支, 则后续的 git commit 便会在 dev 分支上新建版本(提交点)
#切换到dev分支
git checkout dev

8.3 新建分支细节

  • 新建分支时, 新分支, 默认有哪些内容? 分支中包含了哪些次提交?
8.3.1 新分支初始内容
  • 每个分支都有一个 指针 , 新建一个分支, 首先是新建一个 指针
  • 而且新分支的指针会和当前分支指向 同一个提交点
  • 新分支包含的提交点就是从第一个提交点到分支指针指向的提交点
8.3.2 多分支走向
  • 在master分支和新分支, 分别进行 git addgit commit
  • 分支情况如下:
    • master分支未动, 在dev分支增加一次commit
    • master分支增加一个commit, dev再增加一个commit
8.3.3 分支提交日志
  • 查看分支的提交日志, 进而看到分支中提交点的详细情况
#简易日志
git log --oneline
#完整日志
git log

8.4 分支合并

  • 两个分支内容的合并
  • git merge 分支a 合并分支a
  • 合并的方式有两种: 快速合并 和 三方合并
8.4.1 快速合并
  • 如果分支A当前的修改, 是完全基于分支B的修改而来, 则分支B合并分支A, 就是移动指针即可
8.4.2 三方合并
  • 在不具备快速合并的条件下, 会采用三方合并
  • 将2和3的更改都累加在1上, 形成新的提交点
8.4.3 合并冲突
  • 两个分支进行合并, 但它们含有对同一个文件的修改, 则在合并时出现冲突, git无法判断该文件该保留哪个分支的修改
  • 发生冲突时, 两个分支的内容用 <<< === >>> 做了分隔
8.4.4 冲突解决
  • 出现冲突后, 要由两个开发人员当面协商, 该如何取舍, 为冲突文件定义最终内容
  • 解决方案:
    1. 保留某一方的, 删除另一方的
    2. 保留双方的
    3. 但无论如何, 要记得删除 <<< === >>>
    4. 本质是两人协商, 为冲突的内容定制出合理的解决方案

九. IDEA关联Git

9.1 关联Git

  • File > Settings > Version > Git > Path to Git executable

    • 一般情况下关联过程是自动的

9.2 新建仓库

  • 新建项目后, 将项目目录创建为git目录

  • 注意: 要在建仓库前, 设置

    忽略文件 ".gitignore"

    (在根目录下新建)

    • 作用: 被忽略的文件会被版本记录为忽略, 版本中不包含它们
    • 范围: 不需要和其他开发共享的文件, 具体见下图
#所有以class,jar,war,iml为后缀的文件
*.class
*.jar
*.war
*.iml
#.iead文件夹
.idea
#out文件夹
out
#target文件夹
target
#数据库连接参数 文件
jdbc.properties

  • 然后点击VCS > Import into Version Control > Create Git Repository

  • 然后选择项目目录, 作为导入git的目录

9.3 提交-commit

  • 创建好仓库后, 做第一次提交
  • VCS > Commit...

  • 之后在弹出框Local Changes > Default Changelist下勾选所要上传的文件

  • 之后可能会有些友好提示, 可以点击忽略, 点击 "commit"即可

9.4 创建分支

  • 新建开发分支
  • IDEA右下角

9.5 上传到远程仓库(push)

  • 请首先按照第七章, 创建一个远程仓库
  • 要求是裸库, 且建议库名和项目名同名
  • VCS > Git > Push

9.6 复制到本地仓库(clone)

  • 如果有建好的远程仓库, 比如公司内已经在使用的仓库, 或者github, 码云上的一些公开仓库, 可以将远程仓库的项目复制到本地使用
  • VCS > Git > Clone

9.7 更新本地项目

  • 如果远程仓库有更新, 则你的本地项目也需要一起更新
  • VCS > Git > pull

9.8 冲突解决

  • 合并分支时, 如果出现冲突, 则需要解决冲突
  • 需要发生冲突的双方一起商讨出最佳解决方案

十. 多人协同开发

  • 多人协同开发, Git操作

10.1 项目管理员(项目经理)

  1. 由管理员负责创建一个远程仓库, 初始的库中什么也没有, 为裸库, 库的名称建议和项目同名
  2. 管理员会在IEDA中创建一个初始项目, 其中包含 .gitignore 文件, 并在项目根目录下建立本地库, 并建立 dev 分支
  3. 管理员将本地库上传到远程库
  4. 将其他开发人员拉入远程库的 开发成员列表中 , 使得其他开发人员可以访问该远程库

  • master的分支设置为 protected分支, 只有管理员有权限将代码合并到其中, dev分支设置为 常规分支 所有开发人员都可以在其中合并代码

10.2 开发人员

  1. 初始化: 在IDEA中clone远程库, 获得项目, 会建立本地库
  2. 后续的开发中, 都要在 dev 分支上进行, 开发完一个功能并测试通过后就提交 (commit) 到本地的 dev 分支中, 然后上传 (push) 到远程dev分支中
  3. 需要更新项目内容时, 通过 pull 从远程仓库拉取内容
  4. 注意: 多人协同时, 每次在 push 到远程库前, 都先做一次 pull ,一来是把远程最新内容合并到本地, 二来是核实本次内容是否和远程内容有冲突
  5. 后续的开发中, 会接到一个个的功能任务, 往复操作2, 3, 4 步骤即可

十一. 经典问题

  • 在使用https协议做push时, 如果曾经使用过码云, 但密码有过改动, 此时会报错 remote: You do not have permission to push to the repository via HTTPS
  • 解决方案:
    • 控制面板 > 用户账户和家庭安全 > 凭据管理器 > 管理Windows凭据

2_Git的更多相关文章

随机推荐

  1. 如何优雅的升级 Flink Job?

    Flink 作为有状态计算的流批一体分布式计算引擎,会在运行过程中保存很多的「状态」数据,并依赖这些数据完成任务的 Failover 以及任务的重启恢复. 那么,请思考一个问题:如果程序升级迭代调整了 ...

  2. 倍增求RMQ

    RMQ,即区间最值查询,给定一个序列,求区间l-r的最大值.最小值. st表求RMQ,预处理On*logn,查询O1. 预处理: void init_rmq() { for(rll j=1;j< ...

  3. 从matlab的bwmorph函数的'majority'参数中扩展的一种二值图像边缘光滑的实时算法。

    在matlab的图像处理工具箱中,有一系列关于Binary Images的处理函数,都是以字母bw开头的,其中以bwmorph函数选项最为丰富,一共有'bothat'.'branchpoints'.' ...

  4. npm、cnpm与package-lock.json的操作

    来源:npm.cnpm与package-lock.json的操作_IT码农-爱吃辣条的博客-CSDN博客_cnpm lock package.json文件只能锁定大版本,也就是版本号的第一位,并不能锁 ...

  5. 万答#15,都有哪些情况可能导致MGR服务无法启动

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 本文转载自微信公众号 "老叶茶馆" 欢迎大家关注! 1.都有 ...

  6. MultiJittered采样类定义和测试

    多重抖动在书上说的是水平和竖直方面随机交换. 类声明: #pragma once #ifndef __MULTIJITTERED_HEADER__ #define __MULTIJITTERED_HE ...

  7. Apache DolphinScheduler ASF 孵化器毕业一周年,汇报来了!

    不知不觉,Apache DolphinScheduler 已经从 Apache 软件基金会(以下简称 ASF)孵化器毕业一年啦! 北京时间 2021 年 4 月 9 日,ASF 官方宣布 Apache ...

  8. 羽夏看Linux内核——引导启动(上)

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...

  9. Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件

    前言   上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤.   受限制   因为直接配置sample的vi比较麻烦 ...

  10. linux centos 系统盘文件系统损坏-已解决

    当我们使用的Linux虚拟机(云服务器/vps)磁盘出现xfs文件系统损坏时,该如何进行修复? xfs格式文件系统损坏,是运维常见的一个场景,经常发生在强制重启.异常关机.软件冲突.误删文件等事件后, ...