前言:

     git是分布式的版本库控制系统,它能方便你将自己的代码寄存于远程服务器上,从而实现集体合作开发。git有GUI

   图形界面,然而使用终端命令仍是主流。以下基于Ubuntu系统操作git(其方式也适用于windows等系统),实现git的基

   本安装,关联github账户,本地创建及更改库,分支,连接远程版本库。

     本文章讲解了一般需要用到的命令,以及更重要的——git管理代码的机制。由于本人知识有限,若有错误,望

   指出和谅解。


第一节  git安装:

  • ubuntu下的安装:

    ubuntu默认没有安装git,alt+ctrl+t打开终端,运行下面命令来安装:  

    

    检查是否安装成功:

    

    未报错就代表成功安装。


第二节 git配置设置:

  以下设置只要设置一遍,以后不用重新设置

  • 用户名及邮箱:

    

    

  • 其他配置:

    启用git输出显示颜色

    

    设置git编辑器(默认为vim)

    


第三节 关联github账户:

  • 获取ssh密钥:

    

    之后一路回车即可

     密钥保存在home/.ssh/id_rsa.pub文件里(home目录下.ssh是隐藏的,按快捷键ctrl+h显示)

  • 添加密钥至github:

    复制密钥,打开浏览器登录你的github账户,在setting>SSH and GPG keys 里添加密钥即可。


第四节 本地版本库创建:

  提示:使用git --help或者git 命令 --help获取帮助。

  • git三大工作区域:  

    1.工作目录:即本地目录,是可以看到的,供用户编辑更改代码文档。

    2.暂存区:所在目录为.git/index,所有工作目录中的更改要先提交到暂存区,才能让版本库接受。

      3.版本库:所在目录为.git/objects。是所有代码的集中区域,记录用户提交的更改。

  • 创建空的本地版本库:

    

     git init 命令:将普通文件夹mypro初始化为空的版本库。

     执行以上命令后会发现mypro文件夹下出现一个隐藏文件夹.git,这就是git仓库储存文件的地方。

    

    也可以删除库(读者可以不删除它,因为下面还需要一个空仓库)

    

    实际上就是把mypro文件夹删掉即可

  • 克隆远端版本库:

    这是创建本地版本库的另一种方式,也是最常用的方式,用此方法我们可以克隆他人的版本库进行学习

     和使用,我们这里还是以自己github上的版本库为例。

    

    git clone +仓库地址就可以克隆了,当然你也可以为克隆的版本库重命名(如果没删除过mypro,可以重

     名为成其他名称):

  `  


第五节 更新本地版本库:

  • 创建与更改文件:

      在工作目录mypro下新建一个名为hello的文档

     终端下输入git status 查看工作目录的状态:

    

    发现有红色的hello,说明虽然我们创建了hello文档,但属于未跟踪状态,但版本库并未记录下这次创建.

     下面,我们进行同步(正如前面所说,要将更改提交到库,必须先提交到暂存区):

    

    git add +文件名:提交更改到暂存区。

     git commit -m "更改说明" :将暂存区的所有更改提交到库。

     当提交到暂存区后,出现“新文件:hello”,表示更改已经被跟踪记录,但还未正式提交到库,git status比较的

     永远是版本库与工作目录的不同。

     让我们在正式提交更改后再看一下工作区状态:

  `  

    因为此时版本库与工作目录是同步的,所以工作区状态为无。

 

     接下来,我们来更改hello文件内容,添加"hello!":

     请读者自行查看工作区状态(在大型开发中这是非常必要的),这次显示的是“更改:hello”,所以可以看出,git

     对于更改是有明确分类的。

     请读者将更改提交到库,注释为“fill the context”。

  • 查看更改提交历史:

     1.git show 可以查看最近一次更改的具体内容:

     

     commit这一行是为更改分配的指针(专业名叫sha-1值,下文都以sha-1值称呼),它指向这次更改。

      “fill the context “是用户添加的更改的说明。

       ---a/hello代表更改前的hello被代替了.

       +++b/hello代表更改厚的hello,下面两行是更改的内容,第一行可以知道被更改的行数,最后一行表示增加了

      "hello!"一行。

      2.git log 可以查看历史记录(输入wq后即可退出查看):

     

      这里显示我们一共更改了两次,commit 后面是指向本次更改的sha-1值。

      

  • 回退操作:

    有时候,我们想撤销提交,git有强大的回退操作:

     1.从版本库回退到暂存区(相当于撤销git commit操作):

       

     其中HEAD是一个指针,在我们回退前,它指向最后一次更改的指针(24ffa3c...读者可在上文看到这个指针),

      DAED~1 表示指针回退一个历史点,指向上一次更改的指针(ce169e0...读者可以使用git log查看,可以发现ce169e0...

      变成了第一个)(注意:读者的指针同我的是不同的)。

 

      下面请读者输入git commit -m "fill the context"恢复到回退前(此时会分配一个新的指针),然后在hello文档结尾加一

      句“how are you”,最后提交到库,提交说明为“change the context”,之后git log会发现有三次更改。

      以上完成后,我们尝试让HEAD回退两个历史点(应该会认为结果同上面的回退是一样的,即hello文档里有“hello!”,hello文

      档已提交到暂存区,但未提交到库)。

     

     

       可以看到,确实回退到了创建文档之后的第一次更改,但是回退时我们的第二次更改却没有被删除。

      git diff --cached +sha-1值:可以对比暂存区的文档与库中某一提交点的该文档之间的区别,这里的sha-1值

      指向创建文档的更改,那时hello文档还没有内容。

      

      关于如何回退时删除第二次更改,我将在下面讲到,现在让我们提交更改到库,操作如下:

       

  

    2.回退到工作目录:

        

        成功回退到工作目录,请读者执行git checkout hello命令,放弃更改的提交。

       git checkout +文件 适用于工作目录下更改(只能是修改不能是创建)过的,未提交到暂存区的文件的回退。

      

      那么提交到暂存区的文件如何回退到工作目录呢?

      当然是用git reset --mixed HEAD了(git reset HEAD默认是--mixed),为什么呢?首先,--mix的作用就是回退到

      工作目录,其次HEAD后面没跟参数,表示指向当前的sha-1值(下面实例中为68698...),下面是一个例子:

      回退前:

     

     回退后:

     

     那么为什么没有git reset --soft HEAD命令呢?因为当从库回退到暂存状态时,对于库来说,放弃了这次更改,HEAD

       就要指向上一次更改(e59b54...),所以这里应该指定HEAD~1。

    3.回退至上次更改:

     操作前请提交三次hello的更改(请不要嫌麻烦,这至少有利于熟悉git 命令):

     第一次添加“hello!”,注释为“fill after mixedreset”;

     第二次添加“how are you? ”,注释为“change1 after mixedreset”;

      第三次添加“i'm fine.”,注释为“change2 after mixedreset”;

      更改结果如下:

    

    

     我们想彻底放弃第三次更改,而这次更改已经提交到库:

    

    

     我们看到状态回退到我们第二次提交更改后的时候了。

      git log --oneline:oneline参数可以简化信息。

    

      现在可以回答上文提出的多历史点回退问题:

     请读者输入下图中的代码:

     

     

     上面代码中,我们先用hard放弃了第二次的更改,然后再用soft回退,这样去掉了第二次更改,保留了第一次更改。

  

   4.小结:

     至此,回退操作已经讲完了,需要注意的是,soft一般用于回退一个历史点(尽管上文举过回退两个的例子,但很容易发现

      这样的回退是没有意义的),适用于提交到库的更改;--mixed 一般用于不回退历史点或一个历史点,分别适用于提交到库的

      更改和暂存的更改;checkout不回退历史点,适用于未暂存的更改;--hard一般用于回退一个或多个历史点,具有强制性与普适性。

  • 拓展:

   1.使用git log -g --oneline(-g参数可以列出所有分配过的sha-1值所对应的更改):

     

      通过上图对比(这些是我们上文操作的所有历史记录,读者可以根据这些记录回忆之前的操作,其中HEAD@{2}和HEAD@{3}是

      由于本人操作失误撤销回退产生的,下文也会讲如何撤销回退),可以发现,不加g参数当回退的时候就会丢弃一些记录,而加

      上g参数则会显示所有记录(-g代表全局,在之后的分支管理中是很重要的)。

   2.使用sha-1值回退:在回退操作讲解中,我们之前使用的都是HEAD~,但也可以使用sha~1值

      我们用sha-1值重新实现拓展1中操作,代码输入如下(这里选择了静默执行):

      

       结果如下:

     


第六节 分支管理:

  

  分支无论在本地库管理,还是大型项目集体开发,都是非常有效的管理方式。

  • 本地创建删除与切换分支:

     库在初始化后默认有一个master分支(主分支),事实上我们之前的所有操作都是在master上进行的,那么我们可以在master分支上

    衍生出一个小分支(子支),而对于这个子支来说,master就是它的父支。

    下面我们就来创建两个新的分支:

    

    git branch 分支名:在当前分之下创建一个子支;

    git checkout 分支名:切换到某分支;

    git branch:查看所有分支;

    上面我们在master下创建了分支dev,dev就是master的一个副本,然后又在dev分支下创建了dev-1分支(*标注标志当前所在分支);

    

    请读者在dev分支下提交hello的修改(之前回退到了暂存区),注释为“fill at dev”:

        

    通过上图可以发现,由于dev是master的一个副本,当在dev下提交修改时,master并不会被影响。

    再比较dev与dev-1:

    

    这次我们用上文学过的git diff比较,发现dev-1也没有被影响,因此可以知道,分支间在创建后就各自独立。

    

    我们可以删除不想要的分支,删除前需要切换到另一支分支,否则无法删除(此时我们处于master,要删除Dev-1分支):

    

  • 分支合并:

    有分必有合,我们创建分支的目的有三种:

      1.利用创建的分支做一些不确定的更改,而不影响到原来的分支。

      2.利用某个分支实现某个功能模块,从而利于版本管理。

      3.团队合作中,远程库作为根,并从根上为每个人员分配一个分支。

    首先,我们将dev合并到master上(要求当前分支为master,了解两个分支的更改差异):

    

    这样就使得master与dev同步了。

    

    如果要取消合并,可以使用回退操作,如下:

      

    这里的Orig_head指上一次head所指的位置。

    可以通过下面命令查看未合并的分支(即存在更改差异的):

    

   

    


第七节 远程操作:

  

    第二节中我们已经关联了github账户,一个github账户能够添加多个ssh秘钥,这样多个人就可以提交到同一个github仓库。

    

  • 建立连接与推送文件:

    首先,要建立连接,并提交文件到github:

    

    git remote add origin 仓库地址:加入远程仓库地址(并没有连接,如果地址有错,将不会发现),将远程仓库定义为origin,注意,如果

    执行此命令前已经有过一个origin了,要先执行git remote remove origin删除原来的origin。

    

    下面就可以推送文件了:

    

    git push origin master:表示将本地的master同步到远程origin的master主分支上(你可以看图片最后一行)。

  • 拉取文件:

    作为B员工,当有新的项目时,首先要做的是克隆远程库(git clone),而之后当远程库有新的文件提交后,每个员工在提交自己的代码前都

    应该先拉取远程库的文件,使本地库得到更新,此时不能使用git clone,而是git pull,如图:

    

    该比命令表示拉取远程库的master分支保存到本地master(由于当前分支为master,所以本地分支省略了),也可以拉取远程库的develop分支并保存到

    本地develop分支:

    

    但是,这种方法的拉取并不安全,他会直接覆本地同名文件,而并没有征求用户的同意,下面的方式相对是安全的:

    

    git fetch的格式与pull类似。但是fetch后,你无论是用git status还是git log都看不到拉取的文件,这是因为,fecth建立的是引用,你可以通过

    git log FECTCH_HEAD命令查看远程分支的更改,如果决定接受同步,可以输入git merge origin/master来合并分支。


第八节 分支策略与工作流:

   

    本节我们将简单的模拟一个开发项目,以展现git在团队开发中的强大管理功能,在模拟中,读者应将该模拟想象成一个庞大的开发项目,关注

    分支策略,分工模式等。

  

    在这之前,我们先来了解最基本的分支策略规定,由于现实开发的需要,每个团队可能采用的分支方式都有差异,但基本上都基于下面的规则:  

    master:主分支,永远是最稳定的分支,不应该直接在该分支上进行开发,该分支在每一时刻都是作为某个版本的产品供用户使用。

    develop:开发分支,从master中分离出来,用于存放开发者写的、相对稳定的、具有一定功能的代码。当该分支功能集全并测试后,合并到master分支。

    以上两个分支在远程和本地都存在。

    feature:功能分支,开发者的主要阵地,是开发者为开发某个功能模块,而在本地从develop分支分离出的分支,当功能写完后,合并到develop分支,并

    删除feature分支。

    hotfix:修复分支,当已发行的版本存在bug需要修复时,从master分支分离出,完成修复后,合并到master与develop分支,并删除hotfix分支。

    release分支:预发布分支,从develop分离,新版本发布前的调整与测试分支,可以进行细小的bug修复,修复完后,合并到master和develop分支,版本发

    布后,删除改分支。

    现在,让我们通过一个简单的实例了解分支策略与工作流。

    1.boss在github上创建了一个项目仓库,以提交readme.txt初始化仓库,此时已经有master分支了,boss还要给员工们(张三,李四)分配develop分支,这

     些都可以在github上直接操作。

    

    2.下面boss,提交了一份已经写好的index.html文件:

      

  

      

    3.员工张三,李四分别克隆仓库(克隆只会克隆master分支),并拉取了develop分支(以张三为例):

      

      

    

    4.张三,李四分别从本地develop分支上分离出feature分支,并开发自己的功能模块,开发完成后合并到本地和远程的develop分支(以张三为例):

    

    

    

    远端状态:

    

    

    5.假如李四写得较慢,当张三提交develop后,李四需要先将develop再拉取一下,更新自己的develop和feature,才能提交:

    

    得知远程develop有更新后,先更新后commit:

    

    

    

    

    

    远端状态:

   

    

    6.此时,版本1的所有功能都开发完毕,boss在本地创建realease分支进行测试,而此时员工又可以进行版本2功能的开发,我们来看一下最终版本1的公布过程:

    

    

    打上v1.0的标签,以便之后的跟踪:

    

    查看远程状态:

    

    7.然而,正当员工们兴致勃勃地开发下一个版本时,有用户抱怨v1.0的一个bug,而距v2.0成功开发完成还有很长时间。为了尽快解决这个情况,boss决定让张三

     放下功能模块的开发,来解决这个bug:

     

      

     如上图,如果直接先git add再切到其他分支来修复bug,会使得feature3.js也被跟踪,此时明智的方法是使用 git stash:

     

      然后张三就可以修改bug了,在修改完后,合并master分支,并发布v1.1:

     

     

      

      

     

      终于,bug修复完了,张三又可以高高兴兴地去开发他的功能模块了:

     

  


后记:

    到此git的学习结束了,但是你只是入门而已,还需要不停地实践与学习去感受git与github的魅力,比如浏览学习github上优秀的开原项目,git高级合并等等。

    下面我列出了一些可以参考学习的网站,希望能进一步帮助你:

    最后,感谢读者的阅读,有不当之处,望请包涵!

git入门手册:git的基本安装,本地库管理,远程上传的更多相关文章

  1. mac下安装git,并将本地的项目上传到github

    mac下安装git 安装过程: 1.下载Git installer http://git-scm.com/downloads 2.下载之后打开,双击.pkg安装 3.打开终端,使用git --vers ...

  2. Git使用手册/Git教程:git fetch 将远程仓库的分支及分支最新版本代码拉取到本地

    相关文章: 关于验证是否存在ssh配置以及生成SSH Key的方法可以参照文章:Git使用手册:生成SSH Key 关于SSH Key的使用和公钥在gitHub.gitLab的配置等,请参考文章:Gi ...

  3. 如何通过Git GUI将自己本地的项目上传至Github

    最近在学习node.js和react,顺便复习了下AngluarJS相关的东西,写了些小demo想放在GitHub上,之前仅限于只申请了GitHub账号从没用过,今天花半天时间查资料认真学习Githu ...

  4. Windows下GIT安装与使用(上传远程端)

    Windows下GIT安装与使用(上传远程服务器) 1.  登陆http://msysgit.github.io/并下载Git 2.  打开下载的exe文件,一路默认(路径可以去修改).有可能电脑需要 ...

  5. 如何通过Git GUI将自己本地的项目上传至Github(转)

    githud是一个程序员以后成长都会使用到的,先不说很多优秀的开源框架都在这上面发布,光是用来管理自己的demo都已经让人感到很方便,用得也很顺畅.而真正让我下定决心使用github的原因是因为两次误 ...

  6. TortoiseGit客户端安装及使用(上传代码到git@osc

    用TortoiseGit客户端之前要下载安装git http://git-scm.com/download/win 下载完安装完就可以了,之后好像就用不上了,全交给TortoiseGit客户端了 第一 ...

  7. 如何使用Git建立本地仓库并上传代码到GitHub

    使用Git建立本地仓库并上传代码到GitHub 工具/原料   电脑安装git客户端.注册github账号并登陆 方法/步骤     到本地项目文件夹右键选择git bash here   输入个人信 ...

  8. 如何将本地的项目上传到git

    如何将本地的项目上传到git 1 进入项目文件夹,把目录变为git仓库 git init 2 把文件添加到版本库中 git add . 3 把版本提交到版本库 git commit -m 'first ...

  9. (超详细)使用git命令行将本地仓库代码上传到github或gitlab远程仓库

    (超详细)使用git命令行将本地仓库代码上传到github或gitlab远程仓库 本地创建了一个 xcode 工程项目,现通过 命令行 将该项目上传到 github 或者 gitlab 远程仓库,具体 ...

  10. Eclipse中使用GIT将已提交到本地的文件上传至远程仓库

    GIT将已提交到本地的文件上传至远程仓库: 1.  右击项目——Team——Push to Upstream,即可将已保存在本地的文件上传推至GIT远程仓库.

随机推荐

  1. Java移位运算符详解实例

    移位运算符它主要包括:左移位运算符(<<).右移位运算符(>>>).带符号的右移位运算符(>>),移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处 ...

  2. java 字符常量池

    一.题目: 问题:String str = new String(“hello”),“hello”在内存中是怎么分配的?    答案是:堆,字符串常量区. Java中的字符串常量池和JVM运行时数据区 ...

  3. json数据取值

    var data = JSON.parse(JSON.stringify(position, null, 4));

  4. (二)Web应用体系结构

    容器 Servlet没有main()方法,它们受控于另一个Java应用,这个Java应用称为容器(Container).我们最常见的tomcat就是这样一个容器. Web服务器应用(如Apache)得 ...

  5. web项目部署到本地tomcat时,运行tomcat的startup.bat一闪而过

    在eclipse里面启动tomcat时都是正常的,打成War包后,也无法自动解压,百度了好多方法均尝试失败,然后看到了下方的百度经验,配完环境变量后,tomcat可以正常启动了.如下为步骤: 1. 遇 ...

  6. Java中能否利用函数参数来返回值

    转自https://blog.csdn.net/da_da_xiong/article/details/70039532 我们在写代码时通常会遇到一种情况,就是我们可能希望在一个函数操作完成后返回两个 ...

  7. Sql函数笔记一、case when

    Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END   ...

  8. Semaphore简介

    Semaphore简介 Semaphore是并发包中提供的用于控制某资源同时被访问的个数 操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完 ...

  9. 使用Eclipse远程调试

    在一般的开发中,有事因为项目需要,测试环境是在Linux下,这是如果出现异常或者bug,调试起来都是很费劲的,如果你还在为这个头疼,那就好好看接下来的总结 1,启动改程序时,不论是脚本启动,还是tom ...

  10. 将texlive带的字体安装进linux系统字体库

    装机之后装系统,装完系统就装texlive,然后又遇一坑,编译以前的文档竟然找不到某字体: kpathsea:make_tex: Invalid fontname `FontAwesome Regul ...