15张图解析 Git 各种用法,一目了然!

重磅干货,第一时间送达

程序员编程基地

号主就职于深圳某大厂,全栈工程师,对产品有敏锐的嗅觉,日常分享计算机基础原理、编程技巧、面试指南、职场进阶以及产品相关知识,注重编程思想的培养,产品相关市场分析等知识,欢迎关注!
41篇原创内容
公众号

来源:网络素材

基本用法

上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。

  • git add *files* 把当前文件放入暂存区域。
  • git commit 给暂存区域生成快照并提交。
  • git reset -- *files* 用来撤销最后一次git add *files*,你也可以用git reset 撤销所有暂存区域文件。
  • git checkout -- *files* 把文件从暂存区域复制到工作目录,用来丢弃本地修改。

你可以用 git reset -pgit checkout -p, or git add -p进入交互模式。

也可以跳过暂存区域直接从仓库取出文件或者直接提交代码。

img
  • git commit -a相当于运行 git add 把所有当前目录下的文件加入暂存区域再运行。git commit.
  • git commit *files* 进行一次包含最后一次提交加上工作目录中文件快照的提交。并且文件被添加到暂存区域。
  • git checkout HEAD -- *files* 回滚到复制最后一次提交。

约定

后文中以下面的形式使用图片。

绿色的5位字符表示提交的ID,分别指向父节点。分支用橘色显示,分别指向特定的提交。当前分支由附在其上的HEAD标识。这张图片里显示最后5次提交,ed489是最新提交。main分支指向此次提交,另一个stable分支指向祖父提交节点。

命令详解

Diff

有许多种方法查看两次提交之间的变动。下面是一些示例。

Commit

提交时,git用暂存区域的文件创建一个新的提交,并把此时的节点设为父节点。然后把当前分支指向新的提交节点。下图中,当前分支是main。在运行命令之前,main指向ed489,提交后,main指向新的节点f0cec并以ed489作为父节点。

即便当前分支是某次提交的祖父节点,git会同样操作。下图中,在main分支的祖父节点stable分支进行一次提交,生成了1800b。这样,stable分支就不再是main分支的祖父节点。此时,合并 (或者 衍合) 是必须的。

如果想更改一次提交,使用 git commit --amend。git会使用与当前提交相同的父节点进行一次新提交,旧的提交会被取消。

另一个例子是分离HEAD提交,后文讲。另外,Git 系列面试题整理好了,微信搜索Java技术栈,在后台发送:面试,面试题非常全。

Checkout

checkout命令用于从历史提交(或者暂存区域)中拷贝文件到工作目录,也可用于切换分支。

当给定某个文件名(或者打开-p选项,或者文件名和-p选项同时打开)时,git会从指定的提交中拷贝文件到暂存区域和工作目录。比如,git checkout HEAD~ foo.c会将提交节点HEAD~(即当前提交节点的父节点)中的foo.c复制到工作目录并且加到暂存区域中。(如果命令中没有指定提交节点,则会从暂存区域中拷贝内容。)注意当前分支不会发生变化。

当不指定文件名,而是给出一个(本地)分支时,那么HEAD标识会移动到那个分支(也就是说,我们“切换”到那个分支了),然后暂存区域和工作目录中的内容会和HEAD对应的提交节点一致。新提交节点(下图中的a47c3)中的所有文件都会被复制(到暂存区域和工作目录中);只存在于老的提交节点(ed489)中的文件会被删除;不属于上述两者的文件会被忽略,不受影响。

如果既没有指定文件名,也没有指定分支名,而是一个标签、远程分支、SHA-1值或者是像main~3类似的东西,就得到一个匿名分支,称作detached HEAD(被分离的HEAD标识)。

这样可以很方便地在历史版本之间互相切换。比如说你想要编译1.6.6.1版本的git,你可以运行git checkout v1.6.6.1(这是一个标签,而非分支名),编译,安装,然后切换回另一个分支,比如说git checkout main。然而,当提交操作涉及到“分离的HEAD”时,其行为会略有不同,详情见在下面。

HEAD标识处于分离状态时的提交操作

HEAD处于分离状态(不依附于任一分支)时,提交操作可以正常进行,但是不会更新任何已命名的分支。(你可以认为这是在更新一个匿名分支。)

一旦此后你切换到别的分支,比如说main,那么这个提交节点(可能)再也不会被引用到,然后就会被丢弃掉了。注意这个命令之后就不会有东西引用2eecb。分享给你:Spring Boot 学习笔记

但是,如果你想保存这个状态,可以用命令git checkout -b *name*来创建一个新的分支。

Reset

reset命令把当前分支指向另一个位置,并且有选择的变动工作目录和索引。也用来在从历史仓库中复制文件到索引,而不动工作目录。

如果不给选项,那么当前分支指向到那个提交。如果用--hard选项,那么工作目录也更新,如果用--soft选项,那么都不变。

如果没有给出提交点的版本号,那么默认用HEAD。这样,分支指向不变,但是索引会回滚到最后一次提交,如果用--hard选项,工作目录也同样。

如果给了文件名(或者 -p选项), 那么工作效果和带文件名的checkout差不多,除了索引被更新。Java 核心技术教程和示例源码:https://github.com/javastacks/javastack

Merge

merge 命令把不同分支合并起来。合并前,索引必须和当前提交相同。如果另一个分支是当前提交的祖父节点,那么合并命令将什么也不做。另一种情况是如果当前提交是另一个分支的祖父节点,就导致fast-forward合并。指向只是简单的移动,并生成一个新的提交。

否则就是一次真正的合并。默认把当前提交(ed489 如下所示)和另一个提交(33104)以及他们的共同祖父节点(b325c)进行一次三方合并。结果是先保存当前目录和索引,然后和父节点33104一起做一次新提交。

Cherry Pick

cherry-pick命令'复制'一个提交节点并在当前分支做一次完全一样的新提交。

Rebase

衍合是合并命令的另一种选择。合并把两个父分支合并进行一次提交,提交历史不是线性的。衍合在当前分支上重演另一个分支的历史,提交历史是线性的。本质上,这是线性化的自动的 cherry-pick

上面的命令都在topic分支中进行,而不是main分支,在main分支上重演,并且把分支指向新的节点。注意旧提交没有被引用,将被回收。

要限制回滚范围,使用--onto选项。下面的命令在main分支上重演当前分支从169a6以来的最近几个提交,即2c33a

同样有git rebase --interactive让你更方便的完成一些复杂操作,比如丢弃、重排、修改、合并提交。

技术说明

文件内容并没有真正存储在索引(.git/index)或者提交对象中,而是以blob的形式分别存储在数据库中(.git/objects),并用SHA-1值来校验。索引文件用识别码列出相关的blob文件以及别的数据。对于提交来说,以树(tree)的形式存储,同样用对于的哈希值识别。树对应着工作目录中的文件夹,树中包含的 树或者blob对象对应着相应的子目录和文件。每次提交都存储下它的上一级树的识别码。

如果用detached HEAD提交,那么最后一次提交会被the reflog for HEAD引用。但是过一段时间就失效,最终被回收,与git commit --amend或者git rebase很像。

(0)

相关推荐

  • WIN10搜索

    自己综合网上的一些回答,找到了解决方法,这个确实是因为WIN10的索引功能带来的问题,所以在搜索时要禁用索引功能,具体方法如下: 1.首先打开此电脑或文件管理器,总之就是要到电脑磁盘界面.然后可以看到 ...

  • 90H($INDEX

    90H类型属性即$INDEX_ROOT,是索引根属性,该属性是实现NTFS的B+树索引的根节点,它总是常驻属性.该属性没有最大最小长度限制.属性结构如下: 标准属性头 索引根 索引头 索引项 索引项 ...

  • 《伤寒论》图解 丨 伤寒论总结为15张图,一目了然

    导读:很多人都说<伤寒论>难学,有一部分原因是,对整本书的结构没有清晰的认知.这篇文章用图示的方法为<伤寒论>列出了一个提纲,将<伤寒论>的整体结构图解的非常清晰, ...

  • 7张图,英语全部语法一目了然!太有用了!

    7张图,英语全部语法一目了然!太有用了!

  • 6张图,英语全部语法一目了然!太有用了!

    幼小初资料库 陪孩子学英语,少儿英语动画.有声英语绘本.小学英语学习技巧等,一起养成每日学英语好习惯. 91篇原创内容 公众号 英语学习最重要的就是语法,而语法又是填空题和作文题以及完型填空等题的关键 ...

  • 历代《周易》大师秘传的15张图:每看懂一张,悟性提高一个层次

    易学源远流长,主要分象数和义理两派,两派中象数派最为迷人,而象数派中又有十分神秘的一脉: 图书之学 图书之学,就是以河图和洛书为基础推演出来的一系列易图之学.历史上的易图瀚如烟海,据统计,有几千种之多 ...

  • 初中数学就是这15张图 89个重要知识点

    "数与代数"部分 "空间与图形"部分 "统计与概率"部分 "实践与应用"部分 将以上四块内容进一步细分,可得到以下各个部 ...

  • 6149字,15张图,纯干货讲透自律和时间管理应该如何落地

    时间管理中有一个很核心观点:重要的不在于你做了多少事情,而在于你是否把最重要的事情做到极致.有的人一生做了无数事情,却依旧碌碌无为:有的人一辈子只做一件事,即使其他事情都一窍不通,他也比99%的人都成 ...

  • 英语7大类不规则动词,15张图全搞定!

    一丶AAA型(原形→原形→原形) 二丶ABA型(原形→过去式→原形) 三丶ABC型 1. ow →ew →own 2. i→a →u 3. 原形→过去式→过去式+(e)n 4. 原形→过去式→原形+( ...

  • 看懂这15张图自己的交易体系就构建成功了...

    看懂这15张图自己的交易体系就构建成功了#期货# #股票# #财经头条#

  • 物理老师直言:初中2年就死磕这15张图,...

    物理老师直言:初中2年就死磕这15张图,保管孩子次次95分以上!  初二学生开始学习新的一门课程--物理,对于这门课程有不少家长也向我反映,觉得孩子平时在家作业一大堆,但是总会把物理排到最后面,原因也 ...