Git工具使用基础

   Git 是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版 本控制工具可以对开发产生如此之多的影响,文章分为两部分,第一部分介绍Git的一些常用命令,其中穿插介绍Git的基本概念和原理,第二篇重点介绍 Git的使用技巧,最后会在Git Hub上创建一个开源项目开启你的Git实战之旅

1、Git是什么

        Git 在Wikipedia上的定义:它是一个免费的、分布式的版本控制工具,或是一个强调了速度快的源代码管理工具。Git最初被Linus Torvalds开发出来用于管理Linux内核的开发。每一个Git的工作目录都是一个完全独立的代码库,并拥有完整的历史记录和版本追踪能力,不依赖 于网络和中心服务器。

        Git 的出现减轻了许多开发者和开源项目对于管理分支代码的压力,由于对分支的良好控制,更鼓励开发者对自己感兴趣的项目做出贡献。其实许多开源项目 包括Linux kernel, Samba, X.org Server, Ruby on Rails,都已经过渡到使用Git作为自己的版本控制工具。对于我们这些喜欢写代码的开发者嘛,有两点最大的好处,我们可以在任何地点(在上班的地铁 上)提交自己的代码和查看代码版本;我们可以开许许多多个分支来实践我们的想法,而合并这些分支的开销几乎可以忽略不计。

2、Git 1+1

        现在进入本篇文章真正的主题,介绍一下Git的基本命令和操作,会从Git的版本库的初始化,基本操作和独有的常用命令三部分着手,让大家能够开始使用Git。

        Git通常有两种方式来进行初始化:

        git clone: 这是较为简单的一种初始化方式,当你已经有一个远程的Git版本库,只需要在本地克隆一份,例如'git clone git://github.com/someone/some_project.git some_project'命令就是将'git://github.com/someone/some_project.git'这个URL地址的远程版 本库完全克隆到本地some_project目录下面

        git init和git remote:这种方式稍微复杂一些,当你本地创建了一个工作目录,你可以进入这个目录,使用'git init'命令进行初始化,Git以后就会对该目录下的文件进行版本控制,这时候如果你需要将它放到远程服务器上,可以在远程服务器上创建一个目录,并把 可访问的URL记录下来,此时你就可以利用'git remote add'命令来增加一个远程服务器端,例如'git remote add origin git://github.com/someone/another_project.git'这条命令就会增加URL地址为'git: //github.com/someone/another_project.git',名称为origin的远程服务器,以后提交代码的时候只需要使用 origin别名即可

3、Git的基本命令    

     现在我们有了本地和远程的版本库,让我们来试着用用Git的基本命令吧:

        git pull:从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:'git pull origin master'就是将origin这个版本库的代码更新到本地的master主枝,该功能类似于SVN的update

        git add是将当前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步,例如'git add app/model/user.rb'就会增加app/model/user.rb文件到Git的索引中

        git rm:从当前的工作空间中和索引中删除文件,例如'git rm app/model/user.rb'

        git commit:提交当前工作空间的修改内容,类似于SVN的commit命令,例如'git commit -m "story #3, add user model"',提交的时候必须用-m来输入一条提交信息

        git push:将本地commit的代码更新到远程版本库中,例如'git push origin'就会将本地的代码更新到名为orgin的远程版本库中

        git log:查看历史日志

        git revert:还原一个版本的修改,必须提供一个具体的Git版本号,例如'git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20',Git的版本号都是生成的一个哈希值、

        上面的命令几乎都是每个版本控制工具所公有的,下面就开始尝试一下Git独有的一些命令:

4、Git独有的一些命令

       git branch: 对分支的增、删、查等操作,例如'git branch new_branch'会从当前的工作版本创建一个叫做new_branch的新分支,'git branch -D new_branch'就会强制删除叫做new_branch的分支,'git branch'就会列出本地所有的分支

        git checkout:Git 的checkout有两个作用,其一是在不同的branch之间进行切换,例如 'git checkout new_branch'就会切换到new_branch的分支上去;另一个功能是还原代码的作用,例如'git checkout app/model/user.rb'就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚

        git rebase:用下面两幅图解释会比较清楚一些,rebase命令执行后,实际上是将分支点从C移到了G,这样分支也就具有了从C到G的功能 

                                             Git使用基础篇

        git reset: 将当前的工作目录完全回滚到指定的版本号,假设如下图,我们有A-G五次提交的版本,其中C 的版本号是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我们执行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么结果就只剩下了A-C三个提交的版本

                                              Git使用基础篇

        git stash:将当前未提交的工作存入Git工作栈中,时机成熟的时候再应用回来,这里暂时提一下这个命令的用法,后面在技巧篇会重点讲解

        git config: 利用这个命令可以新增、更改Git的各种设置,例如'git config branch.master.remote origin'就将master的远程版本库设置为别名叫做origin版本库,后面在技巧篇会利用这个命令个性化设置你的Git,为你打造独一无二的 Git

        git tag: 可以将某个具体的版本打上一个标签,这样你就不需要记忆复杂的版本号哈希值了,例如你可以使用 'git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20'来标记这个被你还原的版本,那么以后你想查看该版本时,就可以使用 revert_version标签名,而不是哈希值了

        Git之所以能够提供方便的本地分支等特性,是与它的文件存储机制有关的。Git存储版本控制信息时使用它自己定义的一套文件系统存储机制,在代码根目录下有一个.git文件夹,会有如下这样的目录结构:

        

Git使用基础篇

 

        有 几个比较重要的文件和目录需要解释一下:HEAD文件存放根节点的信息,其实目录结构就表示一个树型结构,Git采用这种树形结构来存储版本信息, 那么HEAD就表示根;refs目录存储了你在当前版本控制目录下的各种不同引用(引用指的是你本地和远程所用到的各个树分支的信息),它有heads、 remotes、stash、tags四个子目录,分别存储对不同的根、远程版本库、Git栈和标签的四种引用,你可以通过命令'git show-ref'更清晰地查看引用信息;logs目录根据不同的引用存储了日志信息。因此,Git只需要代码根目录下的这一个.git目录就可以记录完 整的版本控制信息,而不是像SVN那样根目录和子目录下都有.svn目录。那么下面就来看一下Git与SVN的区别吧

5、Git与SVN的不同

        SVN(Subversion)是当前使用最多的版本控制工具。与它相比较,Git最大的优势在于两点:易于本地增加分支和分布式的特性。

        下面两幅图可以形象的展示Git与SVN的不同之处

                                                              Git使用基础篇

 

                                                                Git使用基础篇

        对 于易于本地增加分支,图中Git本地和服务器端结构都很灵活,所有版本都存储在一个目录中,你只需要进行分支的切换即可达到在某个分支工作的效果。 而SVN则完全不同,如果你需要在本地试验一些自己的代码,只能本地维护多个不同的拷贝,每个拷贝对应一个SVN服务器地址。举一个实际的例子,以前我所 在的小组使用SVN作为版本控制工具,当我正在试图增强一个模块,工作做到一半,由于会改变原模块的行为导致代码服务器上许多测试的失败,所以并没有提交 代码。这时候上级对我说,现在有一个很紧急的Bug需要处理, 必须在两个小时内完成。我只好将本地的所有修改diff,并输出成为一个patch文件,然后回滚有关当前任务的所有代码,再开始修改Bug的任务,等到 修改好后,在将patch应用回来。前前后后要完成多个繁琐的步骤,这还不计中间代码发生冲突所要进行的工作量。可是如果使用Git, 我们只需要开一个分支或者转回到主分支上,就可以随时开始Bug修改的任务,完成之后,只要切换到原来的分支就可以优雅的继续以前的任务。只要你愿意,每 一个新的任务都可以开一个分支,完成后,再将它合并到主分支上,轻松而优雅。

        分 布式对于Git而言,你可以本地提交代码,所以在上面的图中,Git有利于将一个大任务分解,进行本地的多次提交,而SVN只能在本地进行大量的一 次性更改,导致将来合并到主干上造成巨大的风险。Git的代码日志是在本地的,可以随时查看。SVN的日志在服务器上的,每次查看日志需要先从服务器上下 载下来。我工作的小组,代码服务器在美国,每次查看小组几年前所做的工作时,日志下载就需要十分钟,这不能不说是一个痛苦。后来我们迁移到Git上,利用 Git日志在本地的特性,我用Ruby编写了一个Rake脚本,可以查看某个具体任务的所有代码历史,每次只需要几秒钟,大大方便我的工作。当然分布式并 不是说用了Git就不需要一个代码中心服务器,如果你工作在一个团队里,还是需要一个服务器来保存所有的代码的。

        总结

        本篇介绍了Git的基本概念、一些常用命令和原理,大家可以尝试动手体会一下,下一篇会重点介绍Git命令的使用技巧,Git附带的工具,最后会在Git Hub上创建一个开源项目。

转载于:https://www.cnblogs.com/liujinyu/p/git.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shell case esac语句

以下内容源于C语言中文网的学习与整理,如有侵权,请告知删除。 case语句格式 case 值 in 模式1)command1command2command3;; 模式2)command1command2command3;; *)command1command2command3;; esac 取值后面是关键字 in。取值可以为变量或常数…

Shell test命令

以下内容源于C语言中文网的学习与整理,如有侵权,请告知删除。 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。这其实相当于一个中括号? 一、数值测试 参数说明-eq等于则为真-ne不等于…

DDOS的攻击原理和防护指南

我们现在来分析DDOS的攻击原理。 首先,DDOS是英文Distributed Denial of Service的缩写,意思是分布式拒绝服务。拒绝服务又是什么意思呢?就是采取一些垃圾数据包来阻塞网站的网络通道,导致让网站不能正常访问。分布式服 务拒绝攻击…

Python基础笔记,后续更新

1,避免‘\n’等特殊字符的两种方式:1,利用转义字符‘\’2,利用原始字符‘r’ print rc:\now3,字符串中嵌入双引号等特殊符号1,利用转义字符‘\’2,使用单引号括起这个字符串 print (i l"o"ve fis.com)2…

.NET:如何让线程支持超时?

背景 本文是为了回复博客园一个兄弟的问题,主要回答两个问题: 如何让线程支持超时?如何让线程在执行结束后销毁?MS 现在不推荐使用低级别的 Thread 编程,而推荐使用 Task,另外我多数情况都是做企业应用&…

第1章 Express MongoDB 搭建多人博客

学习环境 Node.js : 0.10.22 Express : 3.4.4 MongoDB : 2.4.8 快速开始 安装 Express express 是 Node.js 上最流行的 Web 开发框架,正如他的名字一样,使用它我们可以快速的开发一个 Web 应用。我们用 express 来搭…

用UltraISO制作的u盘ubuntu11.04,启动失败解决方案

错误提示:SYSLINUX 3.84 2009-12-18 EBIOS Copyright c 1994-2009 H.Peter Anvin et al 折腾的很久,尝试用Pauly的bootice,结果可以从u盘启动了。 先用UltraISO制作好u盘ubuntu11.04。 下载bootice,把u盘插上去,打开软…

ATT汇编与Intel汇编区别

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 参考博客 Linux 汇编语言开发指南 Intel 格式--AT&T 格式_51CTO博客_at&t和intel汇编语法 前言 X86汇编语言有两种语法风格,即Intel汇编风格和AT&T汇编风格。…

Windows Phone 8初学者开发—第7部分:本地化应用程序

Windows Phone 8初学者开发—第7部分:本地化应用程序 原文 Windows Phone 8初学者开发—第7部分:本地化应用程序 第7部分:本地化应用程序 原文地址: http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Pa…

linux shell 上传,下载ftp文件

#####从ftp服务器上的/home/data 到 本地的/home/databackup#####!/bin/bash ftp -n<<! open 192.168.1.171 user guest 123456 binary cd /home/data lcd /home/databackup promptmget *close bye ! 2. ftp自动登录上传文件。 ####本地的/home/databackup to ftp服务器…

ARM官方汇编指令

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考内容 &#xff08;1&#xff09;文档《ARM汇编指令集汇总》 &#xff08;2&#xff09;文档《ARM汇编手册》 &#xff08;3&#xff09;文档《ARM Software Development Toolkit User Guide》 内容总结…

C# 使用printDocument1.Print打印时不显示 正在打印对话框(里面还有一个讨厌的取消按钮)...

C#使用printDocument1.Print打印时不显示正在打印对话框有两种方法 第一种&#xff0c;使用PrintController PrintController printController new StandardPrintController(); printDocument1.PrintController printController; printDocument1.Print(); 第二种&am…

audio 标签简介

定义和用法 <audio> 标签定义声音&#xff0c;比如音乐或其他音频流。 实例 一段简单的 HTML 5 音频&#xff1a; <audio src"someaudio.wav"> 您的浏览器不支持 audio 标签。 </audio> 提示和注释 提示&#xff1a;可以在开始标签和结束标签之间放…

合法立即数与非法立即数

ARM指令都是32位&#xff0c;除了指令标记和操作标记&#xff0c;本身只能附带很少位数的立即数。因此立即数有合法和非法之分。 合法立即数&#xff1a;经过任意位数的移位后非零部分可以用8位表示的即为合法立即数。 ldr伪指令可以不用人为去判断合法立即数。

magento 瘦身数据库

2019独角兽企业重金招聘Python工程师标准>>> 2013/4/1更新 有两种方式&#xff0c;一种在后台设置自动清除log数据 System > Configuration > Advanced > System 打开 Log Cleaning 还有一种自然是直接清理数据库 truncate dataflow_batch_export; truncat…

GNU汇编程序中某些符号的含义

&#xff08;1&#xff09; 或者 # 或者 /**/ 用来做注释。可以在行首也可以在代码后面同一行直接跟&#xff0c;和C语言中//类似。 #用来做注释&#xff0c;一般放在行首&#xff0c;表示这一行都是注释而不是代码。 /**/也可以用来做注释。 &#xff08;2&#xff09;冒号&am…

推荐给大家一个下载软件的好网站—MSDN I Tell you

http://msdn.itellyou.cn/转载于:https://www.cnblogs.com/Charlie-Gou/p/3460180.html

大数据时代的移动即时通讯

随着大数据的到来&#xff0c;第三方开放API的服务商越来越多&#xff0c;数据的挖掘和展示也在不断的更新。首先值得广大手机用户骄傲的事情&#xff0c;在移动通讯方面有了长足的发展&#xff0c;比如说你正在工作的时候&#xff0c;接听电话和打开视频的速度都相同的话&…

常见的GNU汇编伪指令

&#xff08;1&#xff09;.global .global _start 给_start外部链接属性 &#xff08;2&#xff09;.section .section .text .section用来指定段的&#xff0c;此句指定当前段为代码段 &#xff08;3&#xff09;.ascii 或.byte或 .short或 .long或 .word …

领域驱动设计和实践(转:http://kb.cnblogs.com/page/112298/)

引言 软件系统面向对象的设计思想可谓历史悠久&#xff0c;20世纪70年代的Smalltalk可以说是面向对象语言的经典&#xff0c;直到今天我们依然将这门语言视为面向对象语言的基础。随着编程语言和技术的发展&#xff0c;各种语言特性层出不穷&#xff0c;面向对象是大部分语言的…