现在,版本控制工具中,git逐步成为主流。他的分散式的特性是它超越svn渐渐独霸江湖。如果你还不熟悉git,通过本文,你有个最基本最实用的理解;如果你熟悉git,温故而知新,为你加深对git的理解

git最基本命令使用图

上图是代码提交和撤回时用到的命令和此命令影响范围。理解了这幅图,它满足了你日常工作中对git的要求

git从本地提交代码到远程的基本流程为:你本地编码实现功能后,你首先要做的是将代码从你workspace(项目目录)添加到index(暂存区),然后提交到head,最后推到remote repo(远程库)

git作为分散式(分布式)的版本控制工具,我喜欢称分散式,更具体形象,好理解。所谓分散,每个员工本地都有一个自己的仓库,开发代码像你自己的仓库提交。你不影响别人的,别人的也不影响你的,互不干扰。最后把没有问题的代码一并push到git中央仓库。

git之所以有分散式的功能。离不开他核心的几个概念:git有四个库,workspace、index、head、remote repo。其中workspace、index、head属于你本地私有的库,remote repo就是git中央仓库。结合上图,可以更好的体会

如果你对svn熟悉的话,比较一下他们俩,你会有更深的理解。

git与svn最大的不同就在于它的分散式,svn像一个我们无法触及巨大无比的中央仓库,每个员工都向这个中央仓库提交代码。就像一个仙人球,出来的每个刺就是一个员工的电脑上的svn分支。可想而知,万一哪根刺不听话长弯了就很可能扎到其他的刺。也就是一个员工提交代码时误操作影响了他们的分支,最终影响大局,使中央仓库剪不断,理还乱。

简述图中涉及到的关键命令

1. git add [file]

这可能是你接触的第一条个命令。将你的功能代码添加到index

2. git commit

代码到index,下一步就要提交到head。这里会生成提交记录列表,通过这些记录,你可以进行回滚、退回等操作

3. git push

将本地库的代码推到远程库,供大家使用功能和上线使用

4. git checkout

通过此命令,可以用index区的代码覆盖掉workspace的代码。实际场景为:你写了一个main方法测试一个map是否可以put一个null值,这个main只是临时用,验证map后就可以不要了。这时,直接运行git checkout .,这些main代码就没有了

5. git reset

当你执行git add命令发现add错了,有一个错误代码add到了index。这时,你可以用git reset命令,用head区覆盖掉index区的代码

6. git reset --hard

git add命令执行了,git commit命令也通过了,这时你发现有错误代码提交上来了,这时,你可以这样操作git reset --hard HEAH^,这条命令会覆盖workspace、index、head,也就是用远程库覆盖本地所有区的代码

实际场景运用

我们实际操作一下,来说明这几个命令的用法

程序中main方法加了一句代码:System.out.println("hello girl");

首先,使用git status(用法下面有介绍)查看workspace的变化,可以看到我刚刚操作了哪些文件

然后,执行git diff命令(他的用法后面有介绍)查看不同点。可以看到刚刚在intellij中加的代码:红色表示删除,绿色表示新增

这时,我们执行:git add src/main/java/com/yy/AppRun.java,git add操作之后,新增的代码就添加到了index区,变化的文件由add前的红色变成了add后的绿色

add成功后,要将新代码提交到head区,为此执行命令: git commit -m"commit code",新代码此时已在提交完成

通过git log查看提交记录,可以看到我们刚提交的记录

下一步就要把代码推到远程库了。执行:git push origin test后,显示下图信息,代码就推到远程库了,你的同事就可以欣赏到你的艺术代码了

验证一下,我们到远程库看一下新提交的代码:System.out.println("hello girl");

到此。以上演示了新的代码从本地workspace库一直到remote repo远程库的过程,从命令角度为git add--->git commit--->git push

下面演示index区覆盖workspace区

使用git diff可以看到新代码

现在不想这行代码了,执行git checkout

同时,到intellij中查看,发现,刚加的代码已经没有了

你可能会说,我从intellij中直接删除就可以了,还简单,多好啊。是啊,你说的没错,但是,在实际开发中,完成一个功能往往涉及多个类还有配置文件,这时你早已记不清都修改了哪些吧。所以,这时git checkout .比较,哪个更简单呢

下面演示head区覆盖index区

intellij中新加一句:System.out.println("hello xiao mei nv");

执行 git add src/main/java/com/yy/AppRun.java

执行git diff

git diff没显示不同信息,说明workspace区与index区代码是一样的,也就证明新代码已经到index

现在不想要新加的代码了,需要回退index区和workspace区。

执行git reset src/main/java/com/yy/AppRun.java,之后执行git diff

发现workspace区和index区存在不同,也就证明了index退回了原来的版本

下面演示head区覆盖index区和workspace区

intellij中新加一句:System.out.println("hello da mei nv");

执行git add,然后git commit -m"commit",新代码已经提交到head区

这时如果不想要新加的代码了,执行:git reset --hard HEAD^

查看intellij,刚提交的代码没有了,也就是代码回退到加入新代码之前的状态了

除了图中的命令,还有一些有必要知道的命令,上文实际操作场景中已应用到一部分

7. git status

查看你本地修改的代码

8. git diff [file]

比较你项目库和index的不同点。不指定file则比较项目所有不同点

8. git log

查看提交记录列表

9. git merge branchName

合并branchName到本分支

10. git branch -a

查看本地和远程库所有分支

11. git fetch -p

同步(拉取)远程库分支信息,假如远程库有的分支删除了而你本地还有对应这个远程分支的本地分支,这条命令会删除调没有远程分支的本地分支

12. git chekcout branchName

切换到branchName分支,没有这个分支就新创建一个

以上只是把常用的git命令简述一下,同时结合实际场景运行起来。希望帮助你理解学习git,用git更好的帮助你管理代码,实现功能,完成任务,站稳脚跟,提升自我,成为大牛

使用git一张图就够了的更多相关文章

  1. markdown语法(看这张图就够了)

    这是维基百科的一张图,基本就够用了 https://en.wikipedia.org/wiki/Markdown#Example

  2. 程序员有什么办法能快速梳理java知识点?有这八张图就够了

    一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选.如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟. 1.字符串不变性 下面这张图展示了这段代码做 ...

  3. Git一张图学习

  4. 【Spark】不熟悉Spark-shell常用参数?这一张图就够了

  5. 一张图比較 Docker 和 Git:镜像管理设计理念

    Docker 的镜像管理设计中大量借鉴了 Git 的理念. 以下这张图将对两者的核心概念和操作进行比較,有助于大家高速掌握管理 Docker 镜像的正确方式. watermark/2/text/aHR ...

  6. GitLab开发流程图示、Git命令一张图

    GitLab开发流程图示.Git命令一张图 一.GitLab开发流程图示 二.Git命令一张图 作图工具:ProcessOn 一.GitLab开发流程图示 二.Git命令一张图

  7. Nodejs学习笔记(三)——一张图看懂Nodejs建站

    前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试 ...

  8. 一张图读懂https加密协议

    搭建CA服务器和iis启用https:http://blog.csdn.net/dier4836/article/details/7719532 一张图读懂https加密协议 https是一种加密传输 ...

  9. 几张图帮你理解 docker 基本原理及快速入门

    写的非常好的一篇文章,不知道为什么被删除了.  利用Google快照,做个存档. 快照地址:地址 作者地址:青牛 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 do ...

随机推荐

  1. 【BZOJ3943】[Usaco2015 Feb]SuperBull 最大生成树

    [BZOJ3943][Usaco2015 Feb]SuperBull Description Bessie and her friends are playing hoofball in the an ...

  2. Unity3D笔记八 Unity生命周期及动画学习

    Unity脚本从唤醒到销毁有着一套比较完善的生命周期,添加任何脚本都必须遵守自身生命周期法则.下面介绍一下生命周期中由系统自身调用的几个比较重要的方法.  Update(){}.正常更新,用于更新逻 ...

  3. 边的双联通+缩点+LCA(HDU3686)

    Traffic Real Time Query System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  4. javascript飞机大战-----006创建敌机

    先写一个敌机类 /* 创建敌机: */ function Enemy(blood,speed,imgs){ //敌机left this.left = 0; //敌机top this.top = 0; ...

  5. SVN 配置和使用

    SVN使用环境 使用SVN管理源代码,必须有2套环境 服务器 用来存储客户端上传的源码 一般都是在Windows环境下安装Visual SVN Server 客户端 用来提交.回退.修改.下载等操作 ...

  6. AE导出mov

    最近安装了AE发现没法导出MOV格式的: 感觉应该是没有安装支持MOV的播放器之类的原因造成的:果断去下载一个quicktime 安装好之后重启发现真的有 mov 格式了

  7. IFS二次开发03——Item

    在TFS 中把每个文件夹被抽象成“ItemSet”或“Item”,相对于父级目录来讲就是Item ,相对于子级目录来讲就是“ItemSet”.每个文件都被抽象成“Item”. //连接TFS stri ...

  8. pta习题集5-16 朋友圈

    某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友"这个推论可以得 ...

  9. CCScene,CCLayer,CCSprite,CCDirector

    一.CCScene : 游戏中不同的画面可以用不同的场景展示出来,大致的可以分为以下的几类场景: 1. 展示类场景.游戏开场画面,游戏简介,胜利以及失败提示,帮助. 2. 选择类场景.主菜单,游戏设置 ...

  10. 欧盟GDPR通用数据保护条例-原文

    GDPR英文原文 https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ENG&a ...