文章更新时间: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. 第六篇Scrum冲刺博客--Interesting-Corps

    第六篇Scrum冲刺博客 站立式会议 1.会议照片 2.队友完成情况 团队成员 昨日完成 今日计划 鲍鱼铭 搜索页面以及音乐详情页面数据导入及测试 各界面数据请求云函数设计及实现 叶学涛 进行页面的优 ...

  2. Java抽象类简述

    Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不 ...

  3. TCP/IP网络编程之socket交互流程

    一.概要 本篇文章主要讲解基于.net中tcp/ip网络通信编程.在自我进步的过程中记录这些内容,方便自己记忆的同时也希望可以帮助到大家.技术的进步源自于分享和不断的自我突破. 技术交流QQ群:580 ...

  4. 《MySQL数据库》MySQL主从复制搭建与原理

    前言 主从复制:两台或者更多的数据库实例,通过二进制日志,实现数据同步.为什么需要主从复制,主从复制的作用是什么,答:为了预防灾难. 搭建 第一步:准备多实例环境.如何创建多实例见: 第二步:确保每一 ...

  5. python安装wordcloud库报错

    pip install wordcloud 安装成了这样 红彤彤的一片 解决方法 https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 下载对应版 ...

  6. HMM隐马尔可夫模型来龙去脉(二)

    目录 前言 预备知识 一.估计问题 1.问题推导 2.前向算法/后向算法 二.序列问题 1.问题推导 2.维特比算法 三.参数估计问题 1.问题推导 2.期望最大化算法(前向后向算法) 总结 前言 H ...

  7. 每日JS逆向练习之斗鱼登录密码加密,今天你练了吗?

    一切的基本功都是为后期调试滑块验证码准备的. 有兴趣的关注一下知识图谱与大数据公众号,当然不关注也无所谓.今天来看看斗鱼登录密码加密,正所谓熟能生巧,这种简单一点的基本3-5分钟就要能抠出来,有兴趣得 ...

  8. 学完Python,我决定熬夜整理这篇总结

    目录 了解Python Python基础语法 Python数据结构 数值 字符串 列表 元组 字典 集合 Python控制流 if 判断语句 for 循环语句 while 循环语句 break 和 c ...

  9. 利用 Python 写个七夕表白神器

    今天是七夕节,相比于现代人自创的 502,不对是 520,七夕才是中国传统意义上的情人节,本文分享几个 Python 表白程序,情侣可以现学现用,单身的话也可以先收藏一下,说不定下次就用上了. 很多人 ...

  10. 利用Python爬虫刷新某网站访问量

    前言:前一段时间看到有博友写了爬虫去刷新博客访问量一篇文章,当时还觉得蛮有意思的,就保存了一下,但是当我昨天准备复现的时候居然发现文章404了.所以本篇文章仅供学习交流,严禁用于商业用途 很多人学习p ...