1、git

Git 是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到超大型项目的所有内容。

Git 易于学习,占用空间很小,性能快如闪电。它超越了Subversion,CVS,Perforce和ClearCase等SCM工具,具有廉价的本地分支,方便的暂存区域和多个工作流程等功能。

2、git&平台

git 是一个工具,是基础设施。我们平时说的git就是纯粹指git工具和其功能。但是我们常见github、gitlable、gitee等平台。

不要把他们和git划等号,因为git不用这些平台也可以在本地作为你自己的一个版本管理工具。这些平台是为了解决多人合作的云平台,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。

3、git开发流程

同2一样git只是一种工具,他并没有什么工作流程。日常开发中我们为了更好的协作产生了一些git开发流程规范。这种规范或者风格叫git workflow。

目前比较知名的有git-flow 、github-flow 、gitlable-flow。

  • git-flow



Git Flow 主要是依靠五种分支,master,develop,feature branchs ,release branchs , hoxfixes来进行协作,因为比较复杂,所以并没有那么多人用。

  • github-flow

github-flow 只有个主干/长期分支,master分支用来”持续发布“使用,但是由于只有主分支所以发布不稳定,master通常会设置 protected 分支保护,只有有权限的人才能推送代码到 master 分支。我们常用的github平台就是采用该流程,其中特色就是Pull Request 方式。如果你要修改需要Pull Request 然后进行沟通和code review才能由有权限的人合并进去。当然gitlable平台你也能按照这种方式进行组织,他的Merger Request相当于Pull Request。

  • gitlable-flow

基于环境的的分支模型——面向持续发布模型,有master,同时还有Pre-Production、Production分支用于维护发布在不同环境上的代码。

采用上游到下游流动的方式,大家都在master上进行开发,当要发布的时候将master分支合并到Pre-Production测试通过后再合并到Production进行发布。如果有bug需要从master向下游合并,除非特殊情况需要直接在其它分支上修改。

4、git操作

我们学习git的时候不要把远程仓库和本地仓库混淆在一起,如果你混淆在一起就会陷入到梳理他们的逻辑混乱当中。

我们说了远程仓库只是为了协同工作,我们可以把远程仓库当作是本地仓库的镜像,只是用于我们拉取和提交来同步文档。

所以对于远端仓库的主要操作就是:

  • 拉取远程项目
# 拉取远端项目到本地
git clone https://url
  • 关联本地项目到远程
#初始化本地 Git 仓库,会生成一个 .git 隐藏文件夹
git init #将本地项目关联远程仓库
git remote add origin https://url #上传之前更新一下,确保没有冲突,master 为分支名称
git pull --rebase origin master #添加目录下所有发生改变的文件到暂存区
git add . #添加提交注释信息
git commit -m '注释xxx' #提交到 master 分支
git push -u origin master

以上就是基本的远端仓库和本地仓库的操作,接着我们下面的操作都是争对本地仓库的讲解,你需要了解git的基本知识,比如git有三个部分:工作区、暂存区、版本库。

工作区就是我们操作文档的地方,以windwos作为演示,当我们在一个文件夹下初始化了git管理,那么该文件夹下的三个部分就形成了。至于为什么需要三个部分,就像两口子吵架需要一个中间人调节,有些事情可以先和中间人商量确定好后再传达给对方,减少冲突。

git是基于分支管理的,默认分支就Master分支,争对于分支我们可以做那些操作呢?

  • git pull/git fetch/git push

    git pull 拉取远端的最新提交到本地,并与本地当前分支合并更新所有区。

    git fetch 拉取远端的最新提交到本地,不会自动合并,也不会更新工作区。

    git push 推送本地仓库到远程仓库,推送的是本地版本库里面的内容,如果工作区或者暂存区没提交则不会提交。

  • git add

# 添加一个文件 xx 到暂存区,多个文件以空格隔开
git add xx
# 添加全部文件到暂存区
git add .
  • git commit
# 提交暂存区的文件到本地仓库,并添加提交备注
git commit -m '备注'
# 相当于 git add . 加上 git commit -m '备注',也就是直接从工作区一步完成提交
git commit -am '备注'
  • git log
#查看所有提交记录
git log #查看最近10条记录
git log -n10
  • git tag

    tag就是标签,常用来标记版本,相当于commit的一个标记。
# 创建一个标签,默认打在最新提交的commit上
git tag [tagname] # 创建一个标签,在指定commitid上
git tag [tagname] [commitId] # 查看标签列表
git tag #提交所有tag到远端,因为git push不会推送标签
git push origin --tags
  • git reset

    git reset 用来重置到过去的某个版本,有五种模式(--mixed、--soft、--hard、--merge),重置后不要的版本就找不回来了。
# 重置并撤销 git commit 以及 git add,保留工作区中所有修改
git reset --mixed commitID # 重置并撤销 git commit,但不撤销 git add,保留工作区中所有修改
git reset --soft commitID # 重置并撤销 git commit 以及 git add,并且删除工作区中所有修改
git reset --hard commitID # 取消某次合并
git reset --merge commitID
# 提交到暂存区的内容退回到工作区,相当于撤销 git add .
git reset HEAD
# 把暂存区的 xx 重新放回到工作区
git reset HEAD xx
# 重置到上一个版本
git reset --hard HEAD^
# 重置到上上一个版本,可以继续到上一个
git reset --hard HEAD^^
# 重置到指定版本
git reset --hard commitID
  • git restore
# 撤销上一次 commit 之后所有文件的修改,即撤销暂存区
git restore . # 把暂存区的 xx 重新放回工作区,和上面的 git reset HEAD xx 作用一样
git restore --staged xx
  • git revert

和git reset类似,只是会保留不要的版本。

# 还原上次提交
git revert HEAD # 还原某次提交
git revert commitID
  • git diff

比较差异

# 工作区和暂存区比较
git diff # 工作区和版本库最后版本比较
git diff head # 暂存区和版本库比较
git diff –cached
  • git checkout

    checkout命令用于版本库或者暂存区域中撤销更改到工作目录,同时也可用于切换分支。为了记忆错乱避免混乱,我通常不用改操作,因为对于撤销完全可以用reset和restore,而对于分支切换可以用switch,他们从语义上来说更贴切。所以这个操作你可以不用,我也难得记!

以上这些就是操作某一个分支的基本命令,我们说了git是分支管理,那么多个分支呢。接下来我们就介绍一些多分支之间操作的命令。多分支是为了控制不同工作和并行工作,分支的建立可以是本地的,也可以是和远端某个分支关联的(这个远端可以是任意分支)。所以git是灵活的,远端和本地我们任然要区分开。

  • git branch
# 创建本地分支newbranch,但是不切换到该分支,仍然停留在当前分支
git branch newbranch # 创建newbranch分支,并切换到newbranch分支上去
git branch -M newbranch # 新建一个分支,与指定的远程分支建立关联
git branch --track [newbranch] [remote-branch] # 删除本地newbranch分支
git branch -d newbranch
  • git switch
# 切换到xx分支
git switch xx
  • git stash

    当我们切换到不同分支进行工作的时候,可能当前分支的修改我们还没完成,但是又要紧急处理另外一个分支,此刻的修改如果不提交(git add -> git commit)。那么切换的时候是阻止我们切换的,提示修改未提交或者隐藏,git stash就是用来隐藏分支工作区修改但不想提交的。将修改git stash后可以生成一个编号,等我们处理完切回来得时候就可以取出该修改还原到工作区并删除隐藏。

    而这个功能的前提就是你要知道不同分支上的修改在你提交的版本库之间是有差异性的,比如文件a.txt 我们添加到master分支,然后提交,然后你切换到newbranch分支上是没有a.txt的。如果b.txt在两个分支上都有,那么在其中一个修改了提交后,在另外一个分支b.txt文件你是看不到修改的。

    注意:只有提交的文件才会进入git跟踪,如果c.txt我在master分支上创建了,但是它在工作区,我们切换到newbranch分支任然能看到它,这个时候谁先提交就记录到谁的分支
#把当前分支的修改储存隐藏起来
git stash # 查看stash列表
git stash list # 取出stash中最近一次的修改并删除stash记录
git stash pop # 取出指定stash
git stash apply stash@{0} # 删除指定stash
git stash drop stash@{0}
  • git merge

    既然不同分支有不同的版本,我们可能需要合并分支的差异。比如我们要将newbranch的分支合并到master上,如果我们当前不在master分支,那么我们需要先switch到master分支。
# 把newbranch分支合并到master分支
git merge newbranch
  • git rebase

    rebase 和 merge作用都是一样的,区别是rebase 没有分叉记录,他们合并后两个分支的HEAD都指向最新的版本,merge的提交历史更完整。
# 把newbranch分支变基到master分支
git rebase newbranch
  • git cherry-pick

当我们要合并某个分支上的特定提交版本,我们可以使用git cherry-pick将某分支commitID版本合并到当前分支。

#合并其它分支的commitID
git cherry-pick commitID

整篇就是关于git介绍和git容易混淆的概念及命令,包括日常的基本操作。如果其它进阶和骚操作,可以查看文档或搜索,一般来说掌握这些足够了,其它需要再去查就行。

重新搞懂Git,掌握日常命令和基本操作的更多相关文章

  1. 搞懂head 和 tail 命令

    情景 会点linux命令的人都知道head -n k和tail -n k(k≥0)的作用,但却不知道还支持head -n -k和tail -n +k的用法, 更不知道有着怎样的作用了. 图解 下面,用 ...

  2. git链接GitHub命令及基本操作

    Git是一款不错的代码管理工具,下面引用百科的一段话:  Git是用于Linux内核开发的版本控制工具.与CVS.Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服 ...

  3. 搞懂分布式技术10:LVS实现负载均衡的原理与实践

    搞懂分布式技术10:LVS实现负载均衡的原理与实践 浅析负载均衡及LVS实现 原创: fireflyc 写程序的康德 2017-09-19 负载均衡 负载均衡(Load Balance,缩写LB)是一 ...

  4. Java Builder 模式,你搞懂了么?

    加油.png 前言:最近闲来无事的时候想着看看一些平常用的三方库源码,没想到看了之后才知道直接撸源码好伤身体,一般设计优秀的开源库都会涉及很多的设计模式,就比如 android 开发使用频繁的 okH ...

  5. 彻底搞懂 etcd 系列文章(二):etcd 的多种安装姿势

    0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...

  6. 搞懂ELK并不是一件特别难的事(ELK)

    本篇文章主要介绍elk的一些框架组成,原理和实践,采用的ELK本版为7.7.0版本 一.ELK介绍 1.1.ELK简介 ELK是Elasticsearch.Logstash.Kibana三大开源框架首 ...

  7. 真正“搞”懂HTTP协议05之What's HTTP?

    前面几篇文章,我从纵向的空间到横向的时间,再到一个具体的小栗子,可以说是全方位,无死角的覆盖了HTTP的大部分基本框架,但是我聊的都太宽泛了,很多内容都是一笔带过,再加上一句后面再说就草草结束了.并且 ...

  8. 完全搞懂傅里叶变换和小波(1)——总纲<转载>

    无论是学习信号处理,还是做图像.音视频处理方面的研究,你永远避不开的一个内容,就是傅里叶变换和小波.但是这两个东西其实并不容易弄懂,或者说其实是非常抽象和晦涩的! 完全搞懂傅里叶变换和小波,你至少需要 ...

  9. 不想再被鄙视?那就看进来! 一文搞懂Python2字符编码

    程序员都自视清高,觉得自己是创造者,经常鄙视不太懂技术的产品或者QA.可悲的是,程序员之间也相互鄙视,程序员的鄙视链流传甚广,作为一个Python程序员,自然最关心的是下面这幅图啦 我们项目组一值使用 ...

  10. git 入门常用命令(转)

    Git工作流程:D:\projects\Setup2\Setup2\Setup2\Express\SingleImage\DiskImages\DISK1 git clone工作开始之初,可通过git ...

随机推荐

  1. MyBatisPlus解决逻辑删除与唯一索引的兼容问题

    需求背景 比如有张用户表,在插入或者更新数据的时候,我们需要 用户名称(username),不能重复. 我们首先考虑的是给该字段创建唯一索引 create unique index uni_usern ...

  2. JUC(二)线程间通信

    目录 线程间通信 多线程编程步骤 一个加减实例 & 虚假唤醒问题 Lock接口实现 lock.newCondition设置等待条件 线程间定制化通信 线程间通信案例 设置标志位 线程间通信 多 ...

  3. STM32启动分析之main函数是怎样跑起来的

    1.MDK目标文件 1)MDK中C程序编译后的结果,即可执行文件数据分类: RAM ZI bss 存储未初始化的或初始化为0的全局变量和静态变量 heap 堆,系统malloc和free操作的内存 s ...

  4. API Gateway vs Load Balancer:选择适合你的网络流量管理组件

    本文从对比了 API Gateway 和 Load Balancer 的功能区别,帮助读者更好地了解他们在系统架构中扮演的角色. 作者陈泵,API7.ai 技术工程师. 原文链接 由于互联网技术的发展 ...

  5. SRAM 测试总结

    SoC随着工艺进步设计复杂度增加,embeded sram也越来越多.在40nm SoC产品Sram一般在20Mbits左右,当工艺发展到28nm时Sram就增加到100Mbits.如果考虑AI产品, ...

  6. 从 API 网关聊到 API 管理

    在 API 管理中,通常会有这些痛点: 1.企业不清楚到底有多少个API,无法形成API资产管理等问题. 2.API在不同集群的生命周期问题. 3.API运行状态监控和告警问题. 4.API请求限流. ...

  7. Python-HwTestReport的简单使用

    一.工具包下载 https://github.com/hongweifuture/HwTestReport(出自此大神) 二.使用示例(直接上代码) 1.将 HwTestReport.py 导入项目 ...

  8. FFmpeg开发笔记(二)搭建Windows系统的开发环境

    由于Linux系统比较专业,个人电脑很少安装Linux,反而大都安装Windows系统,因此提高了FFmpeg的学习门槛,毕竟在Windows系统搭建FFmpeg的开发环境还是比较麻烦的.不过若有已经 ...

  9. Vue3 +element-plus+ wangEditor 富文本编辑器+前端七牛云上传

    我用的vue3,element-plus ,没用ts 搭建wangEditor 参考 地址 https://www.cnblogs.com/xbxxf/p/16791084.html 七牛云安装参考地 ...

  10. SqlParameter的作用与用法

    有时候为图方便,会直接用sqlhelper文件进行相关操作,会出现如下的类: public static object ExecuteScalar(string sqlStr, params SqlP ...