文章更新时间:2020/06/17

一、基础知识点解析

Git工作流程

  以上包括一些简单而常用的命令,但是先不关心这些,先来了解下面这4个专有名词。

  • Workspace:工作区
  • Index / Stage:暂存区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库

工作区

  程序员进行开发改动的地方,是你当前看到的,也是最新的。 平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。

暂存区

  .git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp...),不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。 当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。

本地仓库

  保存了对象被提交过的各个版本,比起工作区和暂存区的内容,它要更旧一些。 git commit后同步index的目录树到本地仓库,方便从下一步通过git push同步本地仓库与远程仓库的同步。

远程仓库

  远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。

小结

  • 任何对象【文件】都是在工作区中诞生和被修改;
  • 任何修改都是从进入index区【暂存区】才开始被版本控制;
  • 只有把修改commit【提交】到本地仓库,该修改才能在仓库中留下痕迹;
  • 与协作者分享本地的修改,可以把它们push【推送】到远程仓库来共享。

  下面这幅图更加直接阐述了四个区域之间的关系,可能有些命令不太清楚,没关系,下部分会详细介绍。

二、常用术语

  开局一张图:

head

  HEAD,它始终指向当前所处分支的最新的提交点。你所处的分支变化了,或者产生了新的提交点,HEAD就会跟着改变。

add

  add相关命令很简单,主要实现将工作区修改的内容提交到暂存区,交由git管理。

  • git add . 添加当前目录的所有文件到暂存区
  • git add [dir] 添加指定目录到暂存区,包括子目录
  • git add [file1] 添加指定文件到暂存区

commit

  commit相关命令也很简单,主要实现将暂存区的内容提交到本地仓库,并使得当前分支的HEAD向后移动一个提交点。

  • git commit -m [message] 提交暂存区到本地仓库,message代表说明信息
  • git commit [file1] -m [message] 提交暂存区的指定文件到本地仓库
  • git commit --amend -m [message] 使用一次新的commit,替代上一次提交

branch

  涉及到协作,自然会涉及到分支,关于分支,大概有展示分支,切换分支,创建分支,删除分支这四种操作

  • git branch 列出所有本地分支
  • git branch -r 列出所有远程分支
  • git branch -a 列出所有本地分支和远程分支
  • git branch [branch-name] 新建一个分支,但依然停留在当前分支
  • git checkout -b [branch-name] 新建一个分支,并切换到该分支
  • git branch --track [branch][remote-branch] 新建一个分支,与指定的远程分支建立追踪关系
  • git checkout [branch-name] 切换到指定分支,并更新工作区
  • git branch -d [branch-name] 删除分支
  • git push origin --delete [branch-name] 删除远程分支

三、Git标签

  为什么git标签要单独拿出来讲呢,因为git的标签【tag】与分支管理类似,但又有不同的地方,可以说是独立出来的一种版本管理方式,所以我们先简单看一下相关的概念。

  作用:通常在发布软件的时候打一个tag,tag会记录版本的commit号方便后期回溯

  常用命令:

  • git tag :列出所有的标签
  • git tag -l '关键字' :列出含有关键字的标签【例子:git tag -l 'v1.*' (查找v1.开头的标签)】
  • git tag '标签名字' :新建一个标签,并指定标签名字【例子:git tag 'v1.0'(创建一个名为v1.0的标签)】
  • git tag -a '标签名字' -m '标签备注' :新建一个标签,指定名字,并添加标签备注【例子:git tag -a 'v1.0' -m '第一版打标'】
  • git tag -a '标签名字' 'commit号'  -m '标签备注' :新建一个标签,指定名字和备注,并根据commit号选定对应的commit来进行打标,此操作可以对与以前的commit进行打标 【例子:git tag -a 'v1.0' 23ed6s -m '第一版打标'】
  • git show '标签名字' :查看标签详细信息,包括commit编号,备注,日期等信息【例子:git show 'v1.0'】
  • git push origin '标签名字' :推送tag至远程仓库,相当于新建分支后的push操作【例子:git push origin 'v1.0'】
  • git push origin --tags :推送本地所有tag至远程仓库
  • git checkout '标签名字' :操作类似于分支的检出,但不同的是,此时检出的标签不位于任何分支,处于游离状态,可以考虑基于这个tag创建一个分支。【例子:git checkout 'v1.0'】
  • git tag -d '标签名字' :删除某个标签【例子:git tag -d 'v1.0'】
  • git push origin :refs/tags/标签名字 :删除远端仓库的某个标签【例子:git push origin :refs/tags/v1.0】

四、常用命令详解

merge【合并】

#从某分支合并到当前分支【推荐使用小乌龟git,图形化界面操作更方便~】
git merge 需要合并到当前分支的名称

  作用:合并其他分支的代码到当前分支。

  merge命令主要是用来实现从一个分支合并到当前分支的功能,假如平时我们在dev分支开发业务功能,等到上线的时候就需要合并到master分支进行上线,那么我们需要以下步骤:

  • 1、本地分支切换到dev分支,并拉取代码,保证代码为最新版本
  • 2、本地分支切换到master分支,同样保证代码为最新版本
  • 3、选择merge分支为dev分支
  • 4、merge完成后,解决冲突
  • 5、冲突解决后,把本地的master分支push到远端,merge流程完成

  需要注意的是,merge有两种类型的合并:

  • fast-forward:当本地分支相对于合并分支没有新的提交时,默认采用这种形式
  • no-fast-forward:当本地分支相对于合并分支有新提交时,采用这种

图示:

Rebase【变基】

#从某分支变基更新的代码到当前分支【推荐使用小乌龟git,图形化界面操作更方便~】
git rebase 需要变基到当前分支的名称

  作用:把新代码和本地代码进行合并,解决冲突。

  变基操作主要应用在我们本地代码需要获取其他分支或者当前分支的最新代码时会用到,rebase是一个线性操作,不去校验冲突,对于已存在的文件总是会选择最新的版本,一般本地操作分为以下几个步骤:

  • 1、从远端fetch到最新的代码到本地
  • 2、对当前分支进行rebase,把本地分支的代码更新为最新的

  PS:若从不同分支直接rebase过来时,类似于merge操作,但是一般来说,merge需要经过冲突文件的解决,而rebase对于同一个文件,总是会选择最新的版本。

图示:

  还有一种变基方式为交互式变基,如果有不想提交的代码本地commit了的时候,可以对此次commit进行修改,常用到的命令有以下几种:

  • reword:修改提交信息
  • edit:修改此提交
  • squash:将提交融合到前一个提交中
  • fixup:将提交融合到前一个提交中,不保留该提交的日志消息
  • exec:在每个提交上运行我们想要 rebase 的命令
  • drop:移除该提交

图示:

Reset【重置】

  作用:恢复分支代码到一个特定的版本。

  重置命令一般使用在进行了一个不想要的提交,那么除了交互式变基我们还可以使用这种方式去快乐的玩耍~,重置也分两种,软重置和硬重置:

#软重置
git reset --sorrt 需要恢复到的commit版本 #硬重置
git reset --hard 需要恢复到的commit版本

概念理解一下:  

  • 软重置一般发生在我们想回到原来的提交进行审查,但是又想保留之后提交的文件时,会采用这种方式。
  • 硬重置:一般发生在我们想回到原来的提交,而后面的提交不想要了,就用这种方式。

图示:

Revert【还原】

  作用:还原代码。

  这个命令就好理解了,比如我们本地改了一堆东西,发现改错了,直接revert就可以了~

  又或者有这种场景,在某个分支上提交了一个文件,但是后面我们又不想要这个文件了,可以revert这次commit【只还原当次commit,同时会增加一个还原操作的新commit】

  下图演示了这么一个场景:假设 ec5be 添加了一个 index.js 文件。但之后我们发现其实我们再也不需要由这个提交引入的修改了,就可以还原一波,并且增加了一个还原操作的新commit:9e78i。

Cherry-pick【拣选/选樱桃~】

  作用:拣选需要的commit到当前分支

  这个操作的名称翻译过来有点意思,选樱桃~,字面理解就是选取精华的东西,那在项目中实际上应用的场景是:

  • 1、dev分支对于master分支多出了一个commit1,和commit2
  • 2、master分支只想要dev分支的commit2而已,不想整个dev分支合并过来
  • 3、那我们可以使用这个命令来选择单个commit复制到master分支上

图示:

图中演示了master分支把带有index.js文件的commit(76d12)拣选到master分支上的过程。

Fetch【取回】

  作用:取回当前分支最新的代码,不对本地分支进行数据修改,只是下载新的代码

  fetch操作主要是用于获取远程最新资源的命令,仅仅是下载新的数据而已,而不对本地代码做操作。

图示:

Pull【拉取】

  作用:拉取远端最新的代码到本地,并且合并,同时需要解决冲突【相当于Pull = Fecth + rebase】

图示:

Reflog【查看操作记录】

  git reflog 可以展示已经执行过的所有动作的日志。包括合并、重置、还原,基本上包含你对你的分支所做的任何修改。

  图示:

  有了操作记录以后,我们可以针对某个操作记录进行处理,比如说我想恢复到某个节点的commit,可以类似于图下的操作流程:

  如上图,我们先通过git reflog查看了当前分支的提交记录,然后选取了HEAD@{1}这个版本进行reset,就可以恢复到对应的版本了。【reset命令也可以使用对应版本号来指向,不一定要用head的形式】

Git【常见知识点速查】的更多相关文章

  1. Nginx【常见知识点速查】

    文章更新时间:2020/04/10 一.简介 定义:Nginx是一个高性能的HTTP和反向代理web服务器 作用: 反向代理 正向代理 负载均衡 HTTP静态资源服务器(动静分离) 二.正向代理与反向 ...

  2. Maven【常见知识点速查】

    文章更新时间:2020/04/10 一.为什么使用Maven这样的构建工具[why] ① 一个项目就是一个工程 如果项目非常庞大,就不适合使用package来划分模块,最好是每一个模块对应一个工程,利 ...

  3. git 常用命令速查

    git 常用命令速查 命令速查表 一.克隆项目 把远程仓库上的项目克隆到本地.一般来说项目是有1个或2个分支,主要是做开发和线上的区别.既然所属分支不一样,那命令也会有一点区别.这里假设是有2个分支, ...

  4. 转收藏:Git常用命令速查表

    一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r ...

  5. Git 常用命令速查表(图文+表格)

    一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r ...

  6. Git 常用命令速查表(图文+表格)【转】

    转自:http://www.jb51.net/article/55442.htm 一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git comm ...

  7. Git常用命令速查表 & Git Basics & github : release 发布!

    Git常用命令速查表 & Git Basics  & github : release  发布! Git常用命令速查表: 1 1 1 1 1 http://git-scm.com/bo ...

  8. Git常用命令速查表,新手必备版本控制

    Git 跟 SVN 一样,都是用于管理代码的版本控制工具.无论在项目中,我们负责哪一块,只要需要编写代码,就必须熟悉Git(依公司要求而定). 当然,用的越熟练,处理的项目越顺利,离出任CTO.迎娶白 ...

  9. Java基础一篇过(八)常见异常速查

    一.引言 开发过程中可能会遇到各种各样的异常,这里还是汇总一些比较典型的异常,有些比较直观的异常如空指针这种就不写了,此文可作为异常速查用. 二.异常大军正在来袭~ IllegalArgumentEx ...

随机推荐

  1. pandas 数据子集的获取

    有时数据读入后并不是对整体数据进行分析,而是数据中的部分子集,例如,对于地铁乘客量可能只关心某些时间段的流量,对于商品的交易可能只需要分析某些颜色的价格变动,对于医疗诊断数据可能只对某个年龄段的人群感 ...

  2. Java面试题(Hibernate篇)

    Hibernate 113.为什么要使用 hibernate? 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. Hibernate是一个基于JDBC的主流持久化框架,是一个 ...

  3. .NET Core3.1 Dotnetty实战第二章

    一.概要 在上一篇文章讲到Dotnetty的基本认识,本文这次会讲解dotnetty非常核心的模块是属于比较硬核的干货了,然后继续往下讲解如何根据自己的需求或者自己的喜好去配置Dotnetty而不是生 ...

  4. CRMEB小程序商城v4.0二次开发对接集成阿里云短信

    作者:廖飞 - CRMEB小程序商城研发项目组长 前言 cremb小程序商城v4.0版本支持短信平台为云信,但有部分用户有需求对接阿里云短信,这篇文章将对阿里云短信平台如何对接方以及对接流程详细说明. ...

  5. 专项测试实战 | 如何测试 App 流畅度(基于 FPS 和丢帧率)

    本文为霍格沃兹测试学院学员学习笔记. FPS 和丢帧率可以在一定程度上作为 APP 流畅度的一项衡量标准,本文介绍利用 adb shell dumpsys gfxinfo 命令获取软件渲染加载过程的数 ...

  6. 递推dp数位

    1-n里有多少个1 #include <cstdio> #include <iostream> using namespace std; int main() { int n= ...

  7. 在Fragment 中拦截返回键

    代码如下: class XXXFrgmt : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ...

  8. Idiomatic Phrases Game(最短路+注意坑点)

    Tom is playing a game called Idiomatic Phrases Game. An idiom consists of several Chinese characters ...

  9. Myabtis动态SQL,你真的会了吗?

    目录 前言 什么是动态SQL? 常用的标签 if choose.when.otherwise where foreach set sql include 总结 拓展一下 Mybatis中如何避免魔数? ...

  10. Jwt快速入门(copy即可)

    Jwt 什么是jwt JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法. 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和 ...