git用法简介


昨天在github上疯狂找vim的配置文件,固然少不了须要用到git,正好也就把它系统的学习一下吧,以前也了解过一些,但其实不是很理解。此次以为相对仍是很透彻了。用到了一些进阶功能。linux

首先,事实上可能不少人仍是把git当作svn之类的工具来用的,说的low一点至关于网盘,把你写好的代码放在服务器上作一个备份。可是,必须明白的是Linus大神写这个神奇的东西可不只仅是为了这个,它的设计理念固然和svn不同。svn我也不熟,就不瞎说的,只提一点,svn是集中式管理,就是全部人都要把代码都提交到中心服务器上才能够,而git是“分布式版本控制系统”,其实是不须要中心服务器的,在本地就彻底能够很好的工做,但因为github的出现,使得咱们以为git好像必需要有服务器同样。git

闲言少叙,进入正题。(本文的操做基于Linux)github

基本操做

  1. git config --global user.name "lovelock"
    git config --global user.email "example@gmail.com"
    

    上面这两条命令会在你的用户根目录也就是$HOME下创建一个.gitconfig文件,大体形式以下:shell

     [user]
         name = lovelock
         email = example@gmail.com
    

    固然这其实也是github的要求,其余的代码托管我没有用过,但料想用户名和邮箱应该都是须要的。vim

  2. git clone git@github.com:lovelock/linuxdots.git
    

    这条命令是把我在github分享的一个linux配置文件克隆到本地。而后就能够进去进行各类修改,本身拿来用或者经过pull request提交到原始分支。安全

  3. 下面说一下建立新repo的方法。这个方法其实github的help页面已经说的很详细了,但我以为非常很多人会遇到问题,看看stackoverflow上关于这些东西的问答就知道了。服务器

    • github上建立一个repo,这里没有什么说的。
    • 创建一个本地目录,如mkdir linuxdots,这个目录的名字没有必要和服务器端的相同。但一般会取一个容易区分的名字对吧。
    • cd linuxdots 进入linuxdots目录
    • git init 会在当前目录下建立一个.git目录,这个用来存放git处理咱们的代码的方法和差别文件等等。
    • 这时能够在这个目录下建立几个文件,好比README.md,你可能会不知道(我最开始知道git的时候但是真不知道)这个.md的文件是什么,它叫markdown,是一种用比HTML的标记要更少更简单的标记来实现格式化文本的方法,如今我就在一个很舒服的markdown parser马克飞象中编辑这篇文章。
    • git add .这是一般的作法,意思是把当前目录下的全部文件变成staged for commit状态,但当你的代码复杂后,不免出现回删除文件或文件夹的状况,这时单纯用这个命令就不行了,由于它的完整用法实际上是
      gti add <file>...
      也就是说它的做用是把尚未在stage上文件加进来,而没有把已经在stage上而后被删除的文件变成unstaged状态的功能。须要git add --all来完成这件事。这时你当前目录的全部文件都已经“蓄势待发”了,下一步就是commit了。
    • git commit -m 'some message' git强制须要在commit时写一条信息,记录此次commit作了什么。
    • git remote add origin git@github.com:lovelock/linuxdots.git,建立一个名为origin的远程repo,而由于指定了刚刚建立的repo,这个origin就像指针同样指向了指定的repo
    • git push origin master是把本地的master分支上传到github上。至此至关于完成了建立一个“软件仓储的过程。
  4. 这里提一下上面几个步骤中会遇到的错误。
    • 若是你按照上面提到的github的官方帮助文档中的说法(用https协议)你可能会遇到每一次提交都让你输入用户名和密码的问题,虽然这样看起来事很安全,但很烦不是吗?即便设置了密码失效时间,但仍是须要常常输入啊。因此更干净利落的作法是用ssh协议。
    • 你可能听别人或者我说用ssh协议比较方便,而后发现各类fatal error,说你没有权限什么的。理解这个问题又牵涉到ssh的密钥的知识。这里简单提一点,你须要作的就是ssh-keygen,想简单就一路回车,在你的根目录下生成一个.ssh隐藏文件夹,这里面会有两个文件,id_rsa id_rsa.pub,你这时须要作的是把id_rsa.pub的内容复制到你的github.com帐户里受信任的key列表里。这样你的本地机器和远程服务器就创建了信任关系,不须要每次都输入用户名和密码了,但要注意每次你克隆或其余操做时,相应的要用形如git clone git@github.com:lovelock/linuxdots.git这样的命令,而不是git clone https://github.com/lovelock/linuxdots.git
    • 还有一点须要提,git从2.0改变了git push操做的默认行为。1.x版本的默认操做是matching,也就是若是执行git push而没有指定分支,它将push全部本地的分支到远程仓储中对应匹配的分支。而新的行为是simple,这样它只有当前分支会被push到你使用git pull获取的代码。若是你在用1.x版本的git,也很简单,用git config --global push.default simple便可。这句又会在$HOME/.gitconfig中添加一行。

进阶操做

分支操做

为了加深我本身的理解,我在本地新建了一个仓储用来测试。举个例子,你的master分支下已经有了一些文件,这时你想加入一个新的功能,但怕这个新功能的引入会对master分支产生很差的影响,有了git你须要作的就是git checkout -b aNewBranchName,这至关于两步操做git branch aNewBranchNamegit checkout aNewBranchName,也就是新建一个分支,而后进入这个分支。若是你的shell支持的话,这时shell会有变化的提示。而后你能够在这里进行修改了。这里的操做不会影响master分支。而后你作了足够的测试以后,认为能够合并到主分支了,那么首先切换到master分支,而后git merge aNewBranchName,就把后者合并到了主分支中。注意,若是你在原来文件的同一行进行了修改,那么合并时就会出错,由于git不知道你想用哪一个覆盖哪一个,这时就须要你手动去改了,这一点作得很好,它不替你作决定,就像一直提醒咱们不要用rm -rf这个命令同样。详细用法见Git分支-分支的新建与合并markdown

子模块

常常会看到某些项目中引用别人的项目,那个项目的名称会是灰色的,而且后面带一个@,这就是最简单的子模块(submodule)了。你clone这个项目时它不会把相应的文件都下载下来,而是只有子模块以外的东西,须要进入项目主目录,而后执行`git submodule init && git submodule update`把那些灰色的文件所有下载下来。还有一个问题,是若是你本身也想用别人的项目做为子模块,应该怎么办呢?我开始觉得根本不用设置,由于每一个项目中都有.git目录,难道不会自动识别?真不会。只能在项目主目录下新建一个.gitmodules文件,在里面用和.gitconfig同样的格式记录下。以下ssh

[linuxdots]
    path = .vim/linuxdots
    url = https://github.com/lovelock/linuxdots.git

 须要强调的是,这个项目下载完成以后的名字是由你决定的而不是由项目的原做者,说这话是由于有path这个选项,好比,须要用到oh-my-zsh,那么我把path指定成.zsh,由于我在.zshrc中把$ZSH设置为.zsh,这样下载完成以后它就自动重命名了。分布式

 

更深刻的我本身目前还用不到,看了也是忘记,用到再记下来吧。

相关文章
相关标签/搜索