现在,版本控制工具中,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. 160227、javascript特效

    1.给网页设定快捷键 js: function getkey(){     event = event || window.event;     url = "www.baidu.com&q ...

  2. 徐州网络赛J-Maze Designer【最小生成树】【LCA】

    After the long vacation, the maze designer master has to do his job. A tour company gives him a map ...

  3. 程序入口函数和glibc及C++全局构造和析构

    分类: CRT Machnasim 2011-06-15 17:45 144人阅读 评论(0) 收藏 举报 c++汇编linuxlist语言编译器 1,程序入口函数和初始化 操作系统在装载可执行文件后 ...

  4. toml-lang - Tom's Obvious, Minimal Language

    Tom's Obvious, Minimal Languagehttps://github.com/toml-lang/toml

  5. 当Web访问性能出现问题,如何深探?

    对运维或开发工程师来说,遇到访问性能问题时,最先需要定位的是问题出现在哪个环节,是网络的问题,服务端的问题,还是客户端的问题? 往往技术人员喜欢把精力放在保障后端服务的可用性方面,而对前端界面是否能正 ...

  6. centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课

    centos  MySQL主从配置 ntsysv   chkconfig  setup命令  配置MySQL 主从 子shell  MySQL备份  kill命令  pid文件  discuz!论坛数 ...

  7. POJ1523:SPF(无向连通图求割点)

    题目:http://poj.org/problem?id=1523 题目解析: 注意题目输入输入,防止PE,题目就是求割点,并问割点将这个连通图分成了几个子图,算是模版题吧. #include < ...

  8. java多线程(四)

    使用synchronized锁实现线程同步 为什么要用线程同步 我们先来看下这段代码的运行结果: Java学习交流群:495273252 在多线程上篇博客已经介绍过了,JVM采用的是抢占式调度模型,当 ...

  9. Linux系统——Inotify事件监控工具

    每秒传输文件200个 Rsync放在定时任务中也只是一分钟执行一回,要想达到实时的效果,为防止单点nfs架构故障,再启动一台nfs服务器作为主nfs服务器的备份服务器,此时需要inotify实时同步数 ...

  10. king 选 太子

    king 选 太子 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 啊,从前有一个国家.此国兵强马壮,但是国王却身体不好.于是就想挑一位太子出来: 但是问题来了,国王 ...