git 查看分支编码_12个常用的Git命令,赶紧记一波!

今天齐姐简单讲下 Git 的实现原理,知其所以然才能知其然;并且梳理了日常最常用的 12 个命令,分为三大类分享给你。

本文的结构如下:

  1. 作者和开发原由

  2. Git 的数据模型

  3. 常用命令

  4. 资源推荐

作者和开发原由

Talk is cheap. Show me the code.

这句话就出自 Linux 和 Git 的作者Linus Torvalds

原本 Linux 内核的版本控制系统是用的 BitKeeper,然而 2005 年,BitMover 公司不再让 Linux 开发团队免费使用了。。

Linus 一听,不给用了?老子自己写!

于是,大佬十天之内完成了 Git 的第一个版本。

所以 Git 是一个免费的、开源的版本控制系统。

版本控制系统

版本控制其实每个人都用过,那些年修改过的简历:

小齐简历 2012 版
小齐简历 2013 版
小齐简历 2014 版
小齐简历 2015 版
小齐简历 2016 版
小齐简历 2017 版
小齐简历 2018 版
小齐简历 2019 版
...

还有那些年打死都不再改的毕业论文:

毕业论文最终版
毕业论文最最终版
毕业论文最最最终版
毕业论文最最最最终版
毕业论文最终不改版
毕业论文最终真不改版
毕业论文最终真真不改版
毕业论文最终打死不改版
毕业论文最终打死不改版 2
...

没错,这就是本地版本控制系统。

很明显,好处是简单,但是只能一个人在这改,无法和他人完成合作。那么以下两种主流的版本控制系统应运而生。

1. 集中化版本控制系统

Centralized Version Control Systems (CVCS)

比如:CVS, Subversion, Perforce, etc.

这种版本控制系统有一个单一的集中管理的服务器,保存所有文件的最新版本,大家可以通过连接到这台服务器上来获取或者提交文件。

dfae4dfc3590b14ac6c40899bec17bf2.png

这种模式相对本地版本控制系统是有所改进的,但是缺点也很明显,如果服务器宕机,那么轻则耽误工作、重则数据丢失。于是分布式版本控制系统应运而生。

2. 分布式版本控制系统

Distributed Version Control Systems (DVCS)

比如:Git, Mercurial, Bazaar, etc.

分布式的版本控制系统会把代码仓库完整地镜像下来,这样任何一个服务器发生故障,都可以用其他的仓库来修复。

更进一步,这种模式可以更方便的和不同公司的人进行同一项目的开发,因为两个远程代码仓库可以交互,这在之前的集中式系统中是无法做到的。

那么什么叫“把代码仓库完整地镜像下来”呢?

CVCS 每个版本存放的是当前版本与前一个版本的差异,因此也被称作基于差异的版本控制 (delta-based);

Git 存储的是所有文件的一个快照 (snapshot),如果有的文件没有修改,那就只保留一个 reference 指向之前存储的文件。

不是很好理解?那接着看吧~

Git 的数据模型

1. 什么是快照 (snapshot) 呢?

首先我们来学两个 Git 中的术语:

  • blob, 就是单个的文件;
  • tree, 就是一个文件夹。

快照则是被追踪的最顶层的树。

比如我的“公众号”文件夹的这么一个结构:

6e55f2375d977eac885b7860bf6ba2ac.png

那么一个快照就是追踪的“公众号”这颗树。

2. 本地库的数据模型

Git 记录了每个快照的 parent,也就是当前这个文件夹的上一个版本。

那么快照的迭代更新的过程就可以表示为一个有向无环图,是不是很熟悉?我们在「拓扑」那篇文章里讲过,忘了的小伙伴快去公众号内回复「拓扑」获取拓扑的入门文章吧~

7e45f9cc4c16a262fd520c8077345a8e.png

每个快照其实都对应了一次 commit,我们用代码来表示一下:

class commit {
array parents
String author
String message
Tree snapshot
}

这就是 Git 的数据模型。

blob, tree, snapshot 其实都一样,它们在 Git 中都是对象,都可以被引用或者被搜索,会基于它们的 SHA-1 hash 进行寻址。

git cat-file -t: 查看每个 SHA-1 的类型;git cat-file -p: 查看每个对象的内容和简单的数据结构。

但是通过这个哈希值来搜索也太不方便了,毕竟这是一串 40 位的十六进制字符,就是第二部分 git log 里输出的那个编码

因此,Git 还给了一个引用 reference

比如,我们常见的 HEAD 就是一个特殊的引用。

本地库就是由 对象引用 构成的,或者叫 Repositories.

在硬盘上,Git 只存储 对象引用,所有的 Git 命令都对应提交一个快照。

那有哪些常用命令呢?

常用命令

本章分三大部分介绍日常常用命令:

  • 本地操作
  • 和远程库的交互
  • 团队协作 - 分支
41062c57eb28f685d6476f981a3a97d1.png

本地操作

在学习常用命令之前,你首先需要知道的 Git 的「三个分区」和对应的文件的「三种状态」:

79d32d4a3f9096e00325730832c2102f.png
  • 工作区:就是你本地实际写代码的地方,无论你是用 vim 直接改也好,还是在 IDE 里写,都无所谓。

    • 对应的文件状态是:modified,已修改,但还没保存到数据库中。
  • 暂存区:就是临时存放的地方。

    • 对应的文件状态是:staged,Git 已经对该文件做了标记,下次提交知道要包含它。
  • 本地库:存放本地历史版本信息。

    • 对应的文件状态是:committed,文件已经安全的保存在本地数据库中。

1. $ git add

工作区改完了代码,就用 git add 提交到暂存区。

这里如果文件改动的比较多,但又不是每个都需要提交,我会设置 git ignore file,就表示这些文件不要提交,比如在 build project 的时候会自动生成的那些文件等等。

2. $ git commit -m "comment"

从暂存区提交到本地库,就需要用 commit。

一般后面都会跟个 -m 加句 comment,简单说下改动的内容或者原因,我们公司大家默认也会把 Jira链接附上,这样就知道这个改动对应哪个任务。

那如果想再改,再重新 git add 即可,但是 commit 这句需要改成

$ git commit --amend

这样就还是一条 git log 信息。

3. $ git log

git log 可以查看到提交过的信息,从近到远显示每次 commit 的 comment 还有作者、日期等信息,比如大概长这个样子:

commit 5abcd17dggs9s0a7a91nfsagd8ay76875afs7d6
Author: Xiaoqi
Date: xxx xxx xxx
改了 Test 文件

commit 后面的这个编号,是每次历史记录的一个索引。比如如果需要对版本进行前进或者后退的时候,就需要用到它。

这样打印的 log 太多,更简洁的打印方式是:

$ git log --oneline

就一行打印出来了。

或者:

$ git reflog

更常用一些。

4. $ git reset

那我们刚刚说过,如果需要前进或退回到某个版本,就用

$ git reset --hard 

这样就直接跳到了这个编号对应的那个版本。

那么这个 hard 是什么意思呢?

这里有 3 个参数:hard, soft, mixed,我们一一来说一下。

回到我们最重要的这张图上来:

79d32d4a3f9096e00325730832c2102f.png

我们刚刚说的前进或后退到某一版本,是对本地库进行的操作。

那有个问题:本地库的代码跳到那个版本之后,工作区和暂存区的代码就和本地库的不同步了呀!

那这些参数就是用来控制这些是否同步的。

$ git reset --hard xxx

三个区都同步,都跳到这个 xxx 的版本上。

$ git reset --soft xxx

前面两个区不同步,就只有本地库跳到这个版本。

$ git reset --mixed xxx

暂存区同步,工作区不动。

所以呢,用的多的就是 hard.

41062c57eb28f685d6476f981a3a97d1.png

远程交互

a9690c9d810158de57998dc61e0e6c21.png

和远程库的交互主要是,也就是写入和读取。

5. $ git push

小齐写完了代码,要提交到公司的代码库里,这个过程要用 git push.

当然了,这么用会被打的。。毕竟还要 cr 呢。

5. $ git clone

新来的实习生首先要 clone 整个项目到本地来,然后才能增删改查。

当然了实际工作中也没人这么用。。因为每家公司都会有自己包装的工具。不过如果是做 Github 上的开源项目,就用得上了。

6. $ git pull

小齐提交了新的代码之后,领导要审查呀,所以用 git pull 把最新的代码拉取下来瞅瞅。

实际上呢,

git pull = fetch + merge

7. $ git fetch

git fetch 这个操作是将远程库的数据下载到本地库,但是工作区中的文件没有更新。

a2f0fed7f510b217234b5eeccc82d892.png

而要谈 get merge,我们还需要先讲下分支

mergegit pull 默认的选项,合并其实还有另外一种方法:rebase,中文叫做变基

8. $ git rebase

rebase 的作用更多的是来整合分叉的历史,可以将某个分支上的所有修改都移到另一分支上,就像是变了基底。

分支与合并

首先我们来看几个关于分支的基本操作:

9. 查看分支:

$ git branch

类似于ls,能够列出当前所有分支。

git branch -v 能够显示更多信息。

10. 创建分支:

$ git branch

11. 切换分支:

$ git checkout

有了分支之后必然会有合并:

12. 合并分支:

$ git merge

而合并时就可能会有冲突,什么时候会有冲突呢?:

在同一个文件的同一个位置修改时。

因为 Git 会努力的把你们改动不同的地方合并在一起,但如果实在是在同一个地方改的,那它也没办法了,只能留给程序员去手动处理了。

当然了,每个命令延伸下去还有无限多个,本文不可能涵盖全部,所以在此重磅推荐齐姐精心挑选的三大学习资源,大家可以自行享用~

学习资源

git help

其实我个人使用最多的是git help

真心方便又好用啊!

比如 git help pull:

57871a065ccd5f063fb65e3c4ebcfcea.png

先介绍了有哪些参数,然后 description 详细解释了它的工作原理,下面还有图解,有木有太香!!

不过这种方式更像是 cheatsheet,当你已经知道了这个命令、只是忘了它的用法的时候去查。

如果你想系统的学习,那么下面 ? 的更适合你。

Pro Git

这本书是强烈推荐了!!

Pro Git 这本书不仅讲了 Git 的基础用法、高级用法,以及最后还深入讲解了 Git 的原理,非常细致全面。

书的电子版也能在网站上直接下载。

英文版:

  • https://git-scm.com/book/en/v2

中文版:

  • https://git-scm.com/book/zh/v2

玩游戏

Practice makes perfect!

推荐一个宝藏资源:玩游戏来练 Git

项目:https://github.com/pcottle/learnGitBranching

网址:https://learngitbranching.js.org/

我熟悉很多工具都是通过小游戏来练习的,比如 vim 的操作,还是蛮推荐这种方式的。就不剧透啦,大家自己去探索吧~

推荐阅读

  • 你居然还去服务器上捞日志,搭个日志收集系统难道不香么!
  • 真惨!连各大编程语言都摆起地摊了,Java摊位真大!
  • 再见,Eclipse!
  • RabbitMQ实现延迟消息居然如此简单,整个插件就完事了!
  • 花了3天总结的RabbitMQ实用技巧,有点东西!
  • 面试官:不会看 Explain执行计划,简历敢写 SQL 优化?
  • IDEA同款数据库管理工具,提示太全了,用起来贼香!
  • Github标星34K+Star,这款开源项目助你秒建Git服务!
  • 一个不容错过的Spring Cloud实战项目!
  • 我的Github开源项目,从0到20000 Star!

09cf9212b395297cab1e012804df6a33.png

欢迎关注,点个在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在域环境下搭建samba服务器

环境:samba:smbserver: 192.168.0.18AD:rise.com:192.168.0.37组:zixun xingzheng teacher class admin共享目录:zixun xingzheng xueshu other一.安装Samba服务器yum install -y samba二.把linux加入到ad中1.先…

Android NDK编程,引入第三方.so库

android自带的编译工具NDK进行编译时(非单纯的调用第三方.so而是进行ndk编程),armeabi以及armeabi-v7a文件夹下的第三方so文件将会被删除,只会产生编译后的so文件,其他的so文件将无法引入,现在我们就来解决&#xff1a…

会做饭的机器人曰记_颜真卿《麻姑仙坛记》:苍劲古朴,体态沉雄,气象宏大...

《麻姑仙坛记》,全称《有唐抚州南城县麻姑山仙坛记》,或称《麻姑山仙坛记》。颜真卿撰并书于大历六年(771)四月。此碑有大、中、小三种刻本,且原石均佚,原拓佳本亦难得。大字本,字径约5厘米&…

IBM服务器硬盘出现Other Error可能原因

除了确实物理等因素外,可能还因为:Other Errors的 很有可能也是固件(firmware)版本太低造成。 固件版本太低的话,硬盘自身有power safe模式,在硬盘长时间没有I/O情况下,硬盘会自动断电,而系统本身误以为是硬…

怪异模式

众所周知,HTML文档结构可分为:文档声明<!DOCTYPE HTML>、HTML元素&#xff08;根元素/根标记/根标签/祖先元素&#xff09;、head元素、body元素。 文档声明是用来通知浏览器&#xff0c;目前的文档正使用哪个HTML版本&#xff0c;如果我们不写文档声明<!DCOTYPE HTML…

Metro UI 菜单(Winform)

我有个项目需要要到菜单导航&#xff0c;就自己动作做了一个&#xff0c;感觉还可以&#xff0c;分享给大家。下载地址:http://files.cnblogs.com/files/dyj057/MetroUIMenu.zip 主要代码&#xff1a; private void SetElements(){if (Elements null) return;int eWidth Bord…

echarts 山东地图_用Python画中国地图,实现各省份数据可视化

第一步&#xff1a;安装pyechartspyecharts是一款将python与echarts结合的强大的数据可视化工具&#xff0c;本文使用了0.1.9.4版本pip install pyecharts0.1.9.4第二步&#xff1a;读取数据我的数据是在Excel表格里&#xff0c;如下图&#xff1a;Execel数据使用xlrd(没有就通…

mysql 中某个字段相同的数据拼接起来

2019独角兽企业重金招聘Python工程师标准>>> mysql> select name, GROUP_CONCAT( age SEPARATOR ‘#’) from student group by name; ——————————————————— | name | GROUP_CONCAT( age SEPARATOR ‘#’) | ———————————————…

微信红包系统架构的设计和优化分享

微信红包系统架构的设计和优化分享 编者按&#xff1a;经过2014年一年的酝酿&#xff0c;2015微信红包总量创下历史新高&#xff0c;峰值1400万次/秒&#xff0c;8.1亿次每分钟&#xff0c;微信红包收发达10.1亿次&#xff0c;系统整体运行平稳, 在这里我分享下微信红包背后的技…

Jquery各版本下载

jquery-2.1.4 (注&#xff01;jquery-2.0以上版本不再支持IE 6/7/8) 百度引用地址 (推荐目前最稳定的&#xff0c;不会出现延时打不开情况) 百度压缩版引用地址: <script src"http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script> 微软压缩版引…

python list方法操作_Python 列表(List)操作方法详解

参考文献来源于脚本之家列表是Python中最基本的数据结构&#xff0c;列表是最常用的Python数据类型&#xff0c;列表的数据项不需要具有相同的类型。列表中的每个元素都分配一个数字 - 它的位置&#xff0c;或索引&#xff0c;第一个索引是0&#xff0c;第二个索引是1&#xff…

FastDFS单机版安装教程

安装清单如下&#xff1a; 一、安装FastDFS 1. 安装libfastcommon 先解压安装包到目录 # unzip libfastcommon-1.0.36.zip 安装编译工具及环境&#xff08;后面Nginx也会用到这些依赖环境&#xff09; # yum -y install gcc gcc gcc-c openssl openssl-devel pcre pcre-deve #…

【原创】Chrome最新版(53-55)再次爆出BUG!

2019独角兽企业重金招聘Python工程师标准>>> 前言 今年十月份&#xff0c;我曾发布一篇文章《Chrome53 最新版惊现无厘头卡死 BUG&#xff01;》&#xff0c;不过那个BUG在最新的 Chrome 54 中已经修正。 而今天即将发布的Chrome弱智BUG&#xff1a; 仅 Chrome 53 -…

ThinkPHP 发送post请求

function post($url, $paramarray()){ if(!is_array($param)){ throw new Exception("参数必须为array"); } $httph curl_init($url); curl_setopt($httph, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($httph, CURLOPT_SSL_VERIFYHOST, 1); curl_setopt($httph,CURLOP…

vue 打包路由报错_Vue下路由History模式打包后页面空白的解决方法

vue的路由在默认的hash模式下,默认打包一般不会有什么问题,不过hash模式由于url会带有一个#,不美观,而且在微信分享,授权登录等都会有一些坑.所以history模式也会有一些应用场景.新手往往会碰到history模式打包后页面一片空白的情况,而且没有资源加载错误的报错信息.这个其实仔…

leetcode-回文链表

请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true进阶&#xff1a;你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题&#xff1f; 思路&#xff1a;先遍历链表&#xff0c;获得长度。 把前半部分的链表逆置…

进程kswapd0与events/0消耗大量CPU的问题

http://www.nowamagic.net/librarys/veda/detail/2539 今天下午网站宕了两次机&#xff0c;发工单给阿里云&#xff0c;发现原因是服务器的CPU 100%了。 重启服务器后&#xff0c;使用 top 命令看看是哪些进程消耗那么大的 CPU 使用。盯了有好十几分钟&#xff0c;主要消耗 CPU…

索引器

namespace _03{ class Program { //请编写一个类&#xff1a;ItcastClass,该类中有一个私有字段_names,数据类型为&#xff1a;字符串数组&#xff0c;长度为5&#xff0c;并且有5个默认的姓名。 //要求&#xff1a;为ItcastClass类编写一个索引器&#xff0c;要求该索引器能够…

跑三小时的monkey测试该怎么算_浅谈App测试(下)~带音频

文 | Vicky采编&#xff5c;Emily浅谈App测试(上)&#xff5e;带音频一、功能测试​二、性能测试(1)耗电量影响因素&#xff1a;定位、传感器、蓝牙&#xff0c;其中CPU、持续定位是两个平台造成耗电的主要因素。(2)流量也就是常说的耗流量&#xff0c;影响因素有重复请求&…

Flask基础(03)--创建第一个Flask程序

# 导入Flask from flask import Flask# 创建Flask的应用程序 # 参数__name__指的是Flask所对应的模块&#xff0c;其决定静态文件从哪个地方开始寻找 app Flask(__name__,static_url_path/static, # 静态文件的访问路径&#xff0c;默认为/staticstatic_folderstatic, # 静态…