第一部分:Git 原理入门

Git 是最流行的版本管理工具,也是程序员的必备技能之一。
即使天天使用它,很多人也未必了解它的原理。
Git 为什么可以管理版本?git add、git commit这些基本命令,到底在做什么,你说得清楚吗?
这篇文章用一个实例,解释 Git 的运行过程,帮助你理解 Git 的原理。
• Workspace:工作区
• Index / Stage:暂存区
• Repository:仓库区(或本地仓库)
• Remote:远程仓库

一、新建代码库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
首先,让我们创建一个项目目录,并进入该目录。

mkdir git-demo-project
cd git-demo-project

我们打算对该项目进行版本管理,第一件事就是使用git init命令,进行初始化。
git init
当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

ls -ah.git

二、工作区(Working Directory)和版本库(Repository)

工作区(Working Directory)

就是你在电脑里能看到的目录,比如我的learnGit文件夹就是一个工作区:

文件保存好之后,还需要通知 Git 哪些文件发生了变动。所有变动的文件,Git 都记录在一个区域,叫做"暂存区"(英文叫做 index 或者 stage)。

版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为叫stage(index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

我们编写一个readme.md文件,内容如下:

Git is a version control system.
Git is free software.

第一步,用命令git add告诉Git,把文件添加到暂存区:

git add readme.md

第二步,用命令git commit告诉Git,把文件提交到仓库:

git commit -m "wrote a readme file"

简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

git commit命令执行成功后会告诉你,1 file changed:1个文件被改动(我们新添加的readme.md文件);2 insertions:插入了两行内容(readme.md有两行内容)。

我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区(stage);
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支(master)。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

三、版本查看

Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照记录”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:

$ git logcommit 7e2668584296bf7ff78c7e5e74a7526da27f8694 (HEAD -> master)
Author: zsl <zsl@1393536528qq.com>
Date:   Tue Sep 20 12:40:33 2022 +0800feat:增加两行文字
git log命令显示从最近到最远的提交日志,我们可以看到1次提交,增加两行文字.

每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线

四:分支管理

首先,我们创建dev分支,然后切换到dev分支

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看当前分支:

$ git branch
* devmaster

git branch命令会列出所有分支,当前分支前面会标一个*号。
然后,我们就可以在dev分支上正常提交,比如对readme.md做个修改,加上一行:

Creating a new branch is quick.

然后提交:

$ git add readme.md
$ git commit -m "branch test"
[dev b17d20e] branch test1 file changed, 1 insertion(+)

现在,dev分支的工作完成,我们就可以切换回master分支:

$ git checkout master
Switched to branch 'master'

切换回master分支后,再查看一个readme.md文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

现在,我们把dev分支的工作成果合并到master分支上:

$ git merge dev
Updating d46f35e..b17d20e
Fast-forwardreadme.md | 1 +1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.md的内容,就可以看到,和dev分支的最新提交是完全一样的。
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。
合并完成后,就可以放心地删除dev分支了:

$ git branch -d dev
Deleted branch dev (was b17d20e).删除后,查看branch,就只剩下master分支了:
$ git branch
  • master因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

Git鼓励大量使用分支:

查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>或者git switch <name>
创建+切换分支:git checkout -b <name>或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name> 或 git branch -D <name>

第二部分:Git 在实际工作中的具体使用

第一步:新建代码库
# 第一种方式:在当前目录新建一个Git代码库
$ git init# 第二种方式:新建一个目录,将其初始化为Git代码库
$ git init [project-name]# 第三种方式:下载一个项目和它的整个代码历史
$ git clone [url]
Clone with SSH:git@192.168.2.14:zsl/git_demo.gitClone with HTTP:http://192.168.2.14:8090/zsl/git_demo.git

第二步:配置

一定要配置,不可忽略
以自己个人名字作为配置项名称,不可使用电脑名,或不配置

# 显示当前的Git配置
$ git config --list# 编辑Git配置文件
$ git config -e [--global]

设置提交代码时的用户信息

$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"具体例子:
git config --global user.name "xxx"
git config --global user.email "xxx"

这样配置方便查看提交记录,以下为一个例子
可以很方便的查看:谁,在什么时间,干了什么事

第三步:新建开发分支

# 列出所有本地分支
$ git branch
# 新建一个分支,并切换到该分支
$ git checkout -b 你的开发分支具体例子:
# 新建一个开发分支feat_userinfo
$ git checkout -b feat_userinfo分支名字规范
  • 分支名字规范
# 主要type
feat:     增加新功能
fix:      修复bug# 特殊type
docs:     只改动了文档相关的内容
style:    不影响代码含义的改动,例如去掉空格、改变缩进、增删分号
build:    构造工具的或者外部依赖的改动,例如webpack,npm
refactor: 代码重构时使用

第四步:提交分支commit

# 提交暂存区到仓库区
$ git add .
$ git commit -m "fix:修复用户信息显示为空的bug"用于说明 commit 的类别,使用下面5个标识。
• feat:新功能(feature)
• fix:修补bug
• docs:文档(documentation)
• style: 格式(不影响代码运行的变动)
• refactor:重构(即不是新增功能,也不是修改bug的代码变动)
### 第五步:合并代码:Gitflow代码合并流程![在这里插入图片描述](https://img-blog.csdnimg.cn/3df1dfbe5fa14d858f98bb0396376933.png#pic_center)

首先,项目存在两个长期分支。

主分支master
开发分支develop

前者用于存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版;后者用于日常开发,存放最新的开发版。
其次,项目存在三种短期分支。

功能分支(feature branch)
补丁分支(hotfix branch)
预发分支(release branch)

一旦完成开发,它们就会被合并进developmaster,然后被删除。
更详细的介绍:Git分支管理策略:https://www.ruanyifeng.com/blog/2012/07/git.html

类rebase代码合并流程:

  1. 拉取远程master分支代码
  2. 新建分支A:用来提交
  3. 把本地开发的功能嫁接到新分支上
  4. 将本地A推送到远端
  5. 在Gitlab页面提交Pull Request请求
// 1. 切换到本地master分支
git checkout master
// 拉取远程master更新,因为其他人也可能修改了该项目
git pull
// 2. 新建用来合并的新分支
git checkout -b 用来合并的新分支
// 3. 将本地自己开发的新功能添加到新分支上
git merge --squash 你的老分支
git add .
git commit -m "you describe"
// 4. 将用来合并的本地分支推送到远端
git push origin 你的分支名称

git merge命令用于将两个或两个以上的开发分支加入(合并)一起。
–squash 选项的含义是:本地文件内容与不使用该选项的合并结果相同,但是不提交、不移动HEAD,因此需要一条额外的commit命令。其效果相当于将另一个分支上的多个commit合并成一个,放在当前分支上,原来的commit历史则没有拿过来。

为什么要这么复杂?

Git 作为一个源码管理系统,不可避免涉及到多人协作。
协作必须有一个规范的工作流程,让大家有效地合作,使得项目井井有条地发展下去。
“工作流程"在英语里,叫做"workflow"或者"flow”,原意是水流,比喻项目像水流那样,顺畅、自然地向前流动,不会发生冲击、对撞、甚至漩涡。
https://www.ruanyifeng.com/blog/2015/12/git-workflow.html

不好的工作流

好的工作流

Git原理入门及具体使用介绍相关推荐

  1. git原理及常见使用方法

    Git 原理入门-来自阮一峰 Git 是最流行的版本管理工具,也是程序员的必备技能之一. 即使天天使用它,很多人也未必了解它的原理.Git 为什么可以管理版本?git add.git commit这些 ...

  2. Git使用入门,使用原理解读及如何在GitLab、GitHub或者Stash上管理项目(二)

    这是继承上一篇的续篇,所以希望小白读者尽量先看完第一篇再来看本篇.上一篇的链接:Git使用入门(一) 本篇将会主要讲解一下remote和merge相关,读者理解以后则可以开始了解所谓的Merge Re ...

  3. Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍

    系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...

  4. (一)深入浅出图解Git,入门到精通(保姆级教程)

    Git简介 在我们的认知范围Git和SVN都是对于代码托管的工具,那么这两者又有什么不同呢? Git是世界上先进的「分布式的版本控制系统」,而SVN是「集中式的版本控制系统」,SVN对于版本的管理集中 ...

  5. git 原理详解及实用指南_如何编写良好的提交消息:实用的Git指南

    git 原理详解及实用指南 To create a useful revision history, teams should first agree on a commit message conv ...

  6. Git快速入门篇—— Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程)

    Git快速入门篇-- Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程) 前言:我们平时在整理代码的时候,尤其是与别人一起开发项目的时候,常常涉及到代码的更新,因此代码版本问 ...

  7. Git从入门到放弃的Day10

    点我下载电子版 文章目录 一.git简介 二.GIt的诞生 三.集中式和分布式区别 四.安装git,创建版本,git命令的使用 五.创建分支.合并分支(小试) 六.图文展示创建分支与合并分支原理 七. ...

  8. 图解git原理与日常实用指南

    缘起 读了"扔物线"老师的小册<Git 原理详解及实用指南>感觉收获良多,于是想写点东西做一个总结,即加深自己的印象也希望能给社区小伙伴一点帮助,写的不对的地方还请多多 ...

  9. Git完整入门教程(从0开始)

    前言 本博客是Git的入门教程,刚刚接触Git的朋友们参照本博客流程便可以在自己电脑上实现本地与云端Github的交互,同时本博客中使用到的Git指令也是最基本的. 文章目录 前言 初始化Git仓库 ...

最新文章

  1. linux下生成https的crt和key证书
  2. python创建打开文件-Python文件处理:创建、打开、追加、
  3. jQuery mobile 图标
  4. LDA入门级学习笔记
  5. Linux 性能监测:Memory
  6. truecrypt加密分区的编译
  7. Ant简单工程的构建
  8. python图像分割算法_OpenCV-Python 图像分割与Watershed算法 | 三十四
  9. 本周耐撕团队个人总结
  10. NLP简报(Issue#4):Turing-NLG、REALM、ERNIE-GEN、Transformer attention可视化等等
  11. 超实用!SKETCH大师最常用的3个实战小技巧
  12. python 利用matploylib画动态雷达实时显示图
  13. 跟我一起学习ZeroMQ(7):发布订阅模式(Publish-subscribe pattern)ZMQ_XPUB和ZMQ_XSUB
  14. 星际争霸、魔兽争霸3、红色警戒之完全对比
  15. java获取上周和上上周的开始时间和结束时间
  16. 手把手教你开发一款简单的AR软件
  17. [USACO18JAN] Lifeguards S
  18. 淘宝获得商品详情高级版API调用示例
  19. [置顶] 忆往昔,看今朝(2012-2013年总结)
  20. 老司机带你快速实现Python下载与安装

热门文章

  1. day48_电力系统框架搭建
  2. 别再乱用了,这才是 @Validated 和 @Valid 的真正区别!!!
  3. kafka安装部署详解
  4. 计算两两同时出现的次数
  5. aida64使用方法_AIDA64怎么用 AIDA64使用教程与方法简介
  6. UE4导入PMX模型记录
  7. Fiddler Classic
  8. Axure制作可视化图表最快的方法
  9. 《社会调查数据管理——基于Stata 14管理CGSS数据》一3.3 和社会调查有关的术语...
  10. 20165231 预习作业3 linux安装及学习