1.先画个图,先对git的操作有个直观了解

2.分析下git中文件是怎么存储的

正如下面所示git存储不是每次更改就会产生一个新的文件,而是产生一个版本,这个版本对应着记录每个文件的不同情况

具体的存储方式如下图所示,git中存储的是一个个对象,他们都有自己的唯一标识

实际上在我们的项目中的.git/objects文件夹,有很多文件夹,他们使用 sha-1 的前两位创建了文件夹,剩下的38位为文件名。我们先称呼这些文件为 obj 文件

 
这些obj 文件保存了我们代码提交的所有记录。分为四种类型,分别是 blob、tree、commit、tag。
1.blob: 用来存放项目文件的内容,但是不包括文件的路径、名字、格式等其它描述信息。项目的任意文件的任意版本都是以blob的形式存放的。
2.tree 用来表示目录。我们知道项目就是一个目录,目录中有文件、有子目录。因此 tree 中有 blob、子tree,且都是使用 sha-1值引用的。这是与目录对应的。从顶层的 tree 纵览整个树状的结构,叶子结点就是blob,表示文件的内容,非叶子结点表示项目的目录,顶层的 tree 对象就代表了当前项目的快照。
3.commit: 表示一次提交,有parent字段,用来引用父提交。指向了一个顶层 tree,表示了项目的快照,还有一些其它的信息,比如上一个提交,committer、author、message 等信息

3.分析具体操作的变化

3.1分析commit和push操作

下图展示commit和push命令操作情况,注意看(HEAD,master)指针的变化情况

下面具体分别分析上图三个方框中的情况

1>初始本地仓库中跟踪分支和远程跟踪分支中情况,可以看出远程仓库,跟踪分支,远程跟踪分支的指针都指向c2

2>commit操作之后,跟踪分支的指针指向了一个新的版本c3

3>push操作之后,远程仓库和远程跟踪分支的指针也指向了c3

3.2分析fetch和merge操作

1>远程仓库指向c4,本地仓库的跟踪分支和远程跟踪分支都指向c3

2>fetch操作之后,本地仓库的远程跟踪分支的指针指向了c4,但是此时跟踪分支没有变化,仍然指向c3

3>在进行merge origin/master操作之后,本地仓库的跟踪分支也指向了c4

4>这里要提下上面两部的合成操作,pull=fetch+merge,此操作会直接将本地仓库的跟踪分支和远程跟踪分支更新到最新版本c4

4.分析产生冲突和解决冲突的方法

平时我会用小乌龟工具来操作git

当使用pull操作后,产生冲突

1>此操作产生的结果和fetch操作的指针结果相同,本地仓库的远程跟踪分支被更新到最新,本地仓库的跟踪分支没有变化

2>使用小乌龟解决冲突的方法

  2.1>进入冲突编辑页面

    方法1:右键进入冲突编辑页面, 具体操作是右键空白点击->tortoiseGit->Edit conflicts,然后进入编辑页面

    方法2:commit,commit后会出现文件列表,那个红色的文件就是冲突文件,双击进入即可

  2.2>编辑解决冲突

    下面左侧远程仓库版本,右侧是自己的版本,下侧是解决之后的版本.

  2.3>标记为解决.

    方法1,当解决了冲突之后,直接点击上方图片中的工具栏中的mark as resolved

    方法2,右键resolve

  2.4>创建一个新的版本号,并且commit

  2.5>push操作,推送至远程仓库

5.reset和revert

图解reset和revert操作

1>reset之前的情况

reset之后的情况

 

2>revert之前的情况

revert之后的情况

reset方法的分析

git reset HEAD~2
注意后面~带着1和2意思是倒退一个或者两个版本,如果不写则就是最新的,不变
除了在当前分支上操作,你还可以通过传入这些标记来修改你的缓存区或工作目录:
  • --soft – 缓存区和工作目录都不会被改变
  • --mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
  • --hard – 缓存区和工作目录都同步到你指定的提交
 
通过记录.git文件夹中,版本号的变化情况,来分析
版本号最初状态版本号036aaa...85708
使用上面的命令 git reset HEAD~2

发现本地的版本会回退,注意上方红色的方块,表示回退了,远程跟踪分支上不会变,同时工作目录上的testGit4不会丢失,变成unknown状态了,如下

revert方法的分析

用命令git revert HEAD^ (注意这里是^不是上面的~号了)

以前的版本记录情况

进行commit的情况

push之后的情况,发现是在处理上次冲突之后后退到了234这个地方,并且新创建了一个revert234

综合以上分析

revert的回退是新产生了一次commit号

而reset操作是直接回退到某个版本,中间的版本号都会消除掉

 
 

git总结的更多相关文章

  1. Git 子模块 - submodule

    有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另 ...

  2. Git 在团队中的最佳实践--如何正确使用Git Flow

    我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...

  3. Git与Repo入门

    版本控制 版本控制是什么已不用在说了,就是记录我们对文件.目录或工程等的修改历史,方便查看更改历史,备份以便恢复以前的版本,多人协作... 一.原始版本控制 最原始的版本控制是纯手工的版本控制:修改文 ...

  4. Git Bash的一些命令和配置

    查看git版本号: git --version 如果是第一次使用Git,你需要设置署名和邮箱: $ git config --global user.name "用户名" $ gi ...

  5. 在Ubuntu 16.10 安装 git 并上传代码至 git.oschina.net

    1. 注册一个账号和创建项目 先在git.oschina.net上注册一个账号和新建一个project ,如project name 是"myTest". 2.安装git sudo ...

  6. 史上最详细git教程

    题外话 虽然这个标题很惊悚,不过还是把你骗进来了,哈哈-各位看官不要着急,耐心往下看 Git是什么 Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别 SVN是集中式版本控制 ...

  7. [版本控制之道] Git 常用的命令总结(欢迎收藏备用)

    坚持每天学习,坚持每天复习,技术永远学不完,自己永远要前进 总结日常开发生产中常用的Git版本控制命令 ------------------------------main-------------- ...

  8. 【解决方案】Myeclipse 10 安装 GIT 插件 集成 步骤 图解

    工程开发中,往往要使用到集成GIT ,那么下面说说插件安装步骤 PS:以Myeclipse 10 为例,讲解集成安装步骤. ----------------------main------------ ...

  9. git 命令

    切换仓库地址: git remote set-url origin xxx.git切换分支:git checkout name撤销修改:git checkout -- file删除文件:git rm  ...

  10. git亲测命令

    一.Git新建本地分支与远程分支关联问题 git checkout -b branch_name origin/branch_name 或者 git branch --set-upstream bra ...

随机推荐

  1. thinkphp介绍

    1.thinkphp是一个免费的开源的轻量级的高效的国产的php框架 2.现在主流的框架有:   zend framwork 框架,功能十分齐全,是php官网开发的一个框架   yii框架 十分轻巧的 ...

  2. 从一简单程序看C语言内存分配

    int main13(){ char buf[20]="aaaa"; char buf2[] = "bbbb"; char *p1 = "111111 ...

  3. spark-submit常用参数

    yarn模式默认启动2个executor,无论你有多少的worker节点 standalone模式每个worker一个executor,无法修改executor的数量 partition是RDD中的一 ...

  4. 夺命雷公狗---Thinkphp----2之快快速搭建TP环境

    <?php //定义项目目录 define('APP_PATH','./WEB/'); //开启调试 define('APP_DEBUG',True); //包含thinkphp项目入口文件 r ...

  5. DDR(一)

    P-Bank:计算机早期的一个概念.目的:匹配内存芯片和CPU芯片的数据总线的宽度.方法:并联多个内存模块. L-Bank:对内部存储阵列的分割,避免寻址冲突,提高内存效率.通过ba信号选择bank, ...

  6. mybatis 复习笔记03

    参考:http://www.mybatis.org/mybatis-3/zh/configuration.html 入门 1. 从 XML 中构建 SqlSessionFactory 每个基于 MyB ...

  7. linux 安装

    分区:/boot swap /这三个顺序分区 mkdir -p|-m cat >> 123.txt<<EOF 123 345 EOF 0.1和2分别表示标准输入.标准输出和标准 ...

  8. JS调用Java函数--DWR框架

    (1)dwr与ssh框架整合教程dwr框架介绍. DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJA ...

  9. android 中activity调用远程service中的方法之 aidl的使用

    服务端:只有服务,没有界面 1.编写interface文件,复制到 .aidl 文件中,并去掉其中的public 等修饰符.系统会自动在gen目录下生成对应的java文件  (对应本地调用中的接口文件 ...

  10. WordPress博客系统搜索引擎优化seo全攻略方法

    WordPress的文章.评论等很多数据都是存放在数据库的,所以搭建wordpress网站的时间,网站的空间不需要多大,而数据库一定要充足,而在WordPress数据库中主要使用 wp_posts 表 ...