阅读 Git 原理详解及实用指南 记录

进阶 1 - HEAD、master 与 branch:

介绍了 Git 中的一些「引用」:HEADmasterbranch。这里总结一下:

  1. HEAD 是指向当前 commit 的引用,它具有唯一性,每个仓库中只有一个 HEAD。在每次提交时它都会自动向前移动到最新的 commit
  2. branch 是一类引用。HEAD 除了直接指向 commit,也可以通过指向某个 branch 来间接指向 commit。当 HEAD 指向一个 branch 时,commit 发生时,HEAD 会带着它所指向的 branch 一起移动。
  3. master 是 Git 中的默认 branch,它和其它 branch 的区别在于:
    1. 新建的仓库中的第一个 commit 会被 master 自动指向;
    2. git clone 时,会自动 checkoutmaster
  4. branch 的创建、切换和删除:
    1. 创建 branch 的方式是 git branch 名称git checkout -b 名称(创建后自动切换);
    2. 切换的方式是 git checkout 名称
    3. 删除的方式是 git branch -d 名称
    4. 删除其他机器上的远程分支和本地分支。git fetch -pgit branch -a

进阶 2 - push 的本质:

介绍了 push 这个指令的本质。总结一下关键点:

  1. push 是把当前的分支上传到远程仓库,并把这个 branch 的路径上的所有 commits 也一并上传。
  2. push 的时候,如果当前分支是一个本地创建的分支,需要指定远程仓库名和分支名,用 git push origin branch_name 的格式(等同于git push origin feature1:feature1本地分支名和远程的不必相等),而不能只用 git push;或者可以通过 git config 修改 push.default 来改变 push 时的行为逻辑。
  3. push 的时候之后上传当前分支,并不会上传 HEAD;远程仓库的 HEAD 是永远指向默认分支(即 master)的。

进阶 3 - merge:合并 commits:

merge 进行了介绍,内容大概有这么几点:

  1. merge 的含义:从两个 commit「分叉」的位置起,把目标 commit 的内容应用到当前 commitHEAD 所指向的 commit),并生成一个新的 commit
  2. merge 的适用场景:
    1. 单独开发的 branch 用完了以后,合并回原先的 branch
    2. git pull 的内部自动操作。
  3. merge 的三种特殊情况:
    1. 冲突

      1. 原因:当前分支和目标分支修改了同一部分内容,Git 无法确定应该怎样合并;
      2. 应对方法:解决冲突后手动 commit
      3. 放弃解决冲突,取消 merge。未commitgit merge --abort
    2. HEAD 领先于目标 commit:Git 什么也不做,空操作;
    3. HEAD 落后于目标 commit:fast-forward。(相当于pull)

进阶 4 - Feature Branching:最流行的工作流:

介绍了 Feature Branching 这种工作流。它的概念很简单:

  1. 每个新功能都新建一个 branch 来写;

    • 基于远程master分支切出一个新分支

      1. 分别 git checkout mastergit checkout -b new_feature
      2. 简洁操作git checkout -b new_feature origin/master
  2. 写完以后,把代码分享给同事看;写的过程中,也可以分享给同事讨论。另外,借助 GitHub 等服务提供方的 Pull Request 功能,可以让代码分享变得更加方便;
  3. 分支确定可以合并后,把分支合并到 master ,并删除分支。
    • 删除本地分支git branch -d feature
    • 删除远程分支git push origin -d feature # 用 -d 参数把远程仓库的 branch 也删了

这种工作流由于功能强大,而且概念和使用方式都很简单,所以很受欢迎。再加上 GitHub 等平台提供了 Pull Request 的支持,目前这种工作流是商业项目开发中最为流行的工作流。

进阶 5 - 关于 add:

通过 add 来把改动的内容放进暂存区

  1. add 后面加个点 ".":全部暂存
  2. add 添加的是文件改动,而不是文件名

进阶 5 - 看看我都改了什么:

介绍了一些查看改动内容的方法,大致有这么几类:

  1. 查看历史中的多个 commitlog

    1. 查看详细改动: git log -p
    2. 查看大致改动:git log --stat
  2. 查看具体某个 commitshow
    1. 要看最新 commit,直接输入git show ;要看指定 commit ,输入 git show commit的引用或SHA-1
    2. 如果还要指定文件,在 git show 的最后加上文件名
  3. 查看未提交的内容:diff
    1. 查看工作目录和暂存区的区别:git diff 不加选项参数
    2. 查看工作目录和上一条 commit 的区别:git diff HEAD
    3. 查看暂存区和上一条 commit 的区别:git diff --staged(或 --cached

2.git进阶篇总结的更多相关文章

  1. git 进阶篇

    在git使用时,有时需要在公司内部搭建自己的git服务器,用于内部的版本控制. 从远程服务器到本地 先创建服务器端的空git库,将其clone到本地,再将本地的修改push到服务器端 # step1: ...

  2. Sass进阶之路,之二(进阶篇)

    Sass之二(进阶篇) 1. 数据类型 1.1 Number 数字类型,小数类型,带有像素单位的数字类型,全部都属于Number类型 Number类型详情请点击这里,下面是小例子 1.$n1: 1.2 ...

  3. Vue进阶篇

    前引 今天是2018年12月30,虽不是2018年的最后一天,但是却是自己在2018年写的最后一篇博客了,昨天下班在地铁上闲来无事,翻起了关注的一些公众号发的技术博文,里面就提到写博客的重要性,其实这 ...

  4. PowerShell攻防进阶篇:nishang工具用法详解

    PowerShell攻防进阶篇:nishang工具用法详解 导语:nishang,PowerShell下并肩Empire,Powersploit的神器. 开始之前,先放出个下载地址! 下载地址:htt ...

  5. CocoaPods详解之(二)----进阶篇

    CocoaPods详解之----进阶篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/19178709 转载请注明出处 ...

  6. Git进阶:常用命令和问题案例整理

    一.前言 整理常用git命令和以及在实际使用的过程中碰到的问题案例,旨在git进阶,提升工作开发效率,有需要补充的小伙伴欢迎下方留言,本篇持续更新中... 二.命令 配置用户名和邮箱 git conf ...

  7. 2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  8. labview从入门到出家5(进阶篇)--程序调试以及labview函数库的运用

    跟了前面几章的操作流程,相信大家对labview有了一定的认识.其实只要了解了labview的编程思路,再熟悉地运用各个变量,函数以及属性,那么我们就可以打开labview的大门了.跟其他编程语言一样 ...

  9. Membership三步曲之进阶篇 - 深入剖析Provider Model

    Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...

随机推荐

  1. Android获取全部存储卡挂载路径

    近期因项目需求.须要在存储卡查找文件,经測试发现部分手机挂载路径查找不到,这里分享一个有效的方法. /** * 获取全部存储卡挂载路径 * @return */ public static List& ...

  2. Unity游戏小地图生成

    孙广东  2015.6.25 这个在AssetStore上有几个不错的插件, 除了知道原理,能自己实现还是好的. 非常多插件是不会直接使用的.而是要依据自己项目的需求进行改动或者就是自己写. 那么我们 ...

  3. 一分钟让你了解Microsoft Edge

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  4. 浅析Java开发模式—Model1、Model2和三层

    "解耦"的思想一直是我们倡导的,但在实际项目中怎样去做?这是需要我们去好好思考的.下面以Model1.Model2.三层为切入点,对比下去了解解耦的思想. Model1 使用JSP ...

  5. ios7--UIImageView

    // // ViewController.m // 03-UIImageView的使用 // #import "ViewController.h" @interface ViewC ...

  6. AD、DNS、DHCP、IIS、WINS的形象定义及关系

    AD-实际是就是一个包括所有信息的数据库,和现实生活中就将其比作派出所,所有的信息都要进入他那的数据库当中(包括人员姓名(计算机名.账号.密码等) DNS就是建立起关联起好记忆的名称,比如你家的位置用 ...

  7. hdu 6115(LCA 暴力)

    Factory Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total ...

  8. openstack service glance-api/registry mysql of max_connection

  9. php自动加载的两个函数__autoload和__sql_autoload_register

    一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.class.php //文件 <?php class P ...

  10. git配置用户信息

    git配置用户信息 一.在本地配置用户信息 配置内容:user.name 和 user.email 配置目的:Git用来记录谁做了什么事 配置方法:windows下打开Git Bash进行操作  gi ...