现在,版本控制工具中,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. Egret Wing4.0.3 动画编辑器

    一 exml上摆放组件 切换动画编辑 创建动画组,命名test1. 选中一个对象,创建动画(必须选中一个对象后,+号才会亮.且一个对象只能创建一个动画) 之后和Flash差不多.在时间轴插入关键帧. ...

  2. Git的配置和使用

    eclipse中Git的配置 可以参考http://www.cnblogs.com/zhxiaomiao/archive/2013/05/16/3081148.html, http://blog.cs ...

  3. 通过nginx 访问thinkphp

    修改 nginx的配置文件: location / { root /var/www; index index.html index.htm index.php; if (!-e $request_fi ...

  4. poj2185 Milking Grid【KMP】

    Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10084   Accepted: 4371 Des ...

  5. 沈阳网络赛D-Made In Heaven【k短路】【模板】

    One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. However, Pucci ...

  6. Python网络爬虫学习总结

    1.检查robots.txt 让爬虫了解爬取该网站时存在哪些限制. 最小化爬虫被封禁的可能,而且还能发现和网站结构相关的线索. 2.检查网站地图(robots.txt文件中发现的Sitemap文件) ...

  7. receive.denyCurrentBranch 推送错误解决

    场景: 1.搭建Ok了一git服务器 2.本机上的现有源码,现在想纳入git源码管理 操作: 1.服务器上创建了工程仓库 git init 2. 客户端使用tortoisegit添加并提交要纳入源码管 ...

  8. python基础(基础数据类型)

    一. 引子 1. 什么是数据 x=10,10是我们要存储的数据 2. 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3.数据类型 数字 字符串 列表 元组 字 ...

  9. Linux光标移动异常

    刚刚安装完毕CentOS7.5,进行基础优化来着,发现我的光标具有如下神奇的故障. 无法移动到头部? 刚开始还以为是ISO镜像的问题,后校验了阿里云官网镜像的MD5值,和本地镜像MD5对比之后, 发现 ...

  10. cocos代码研究(21)Widget子类TextField学习笔记

    基础理论 一个接受用户输入的widget. 输入文本的渲染基于TextFieldTTF. 如果你想用系统控制行为,请使用EditBox来替代.继承自 Widget. 代码实践 //与占位符有关void ...