昨天在github上疯狂找vim的配置文件,固然少不了须要用到git,正好也就把它系统的学习一下吧,以前也了解过一些,但其实不是很理解。此次以为相对仍是很透彻了。用到了一些进阶功能。linux
首先,事实上可能不少人仍是把git当作svn之类的工具来用的,说的low一点至关于网盘,把你写好的代码放在服务器上作一个备份。可是,必须明白的是Linus大神写这个神奇的东西可不只仅是为了这个,它的设计理念固然和svn不同。svn我也不熟,就不瞎说的,只提一点,svn是集中式管理,就是全部人都要把代码都提交到中心服务器上才能够,而git是“分布式版本控制系统”,其实是不须要中心服务器的,在本地就彻底能够很好的工做,但因为github的出现,使得咱们以为git好像必需要有服务器同样。git
闲言少叙,进入正题。(本文的操做基于Linux)github
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
git clone git@github.com:lovelock/linuxdots.git
这条命令是把我在github分享的一个linux配置文件克隆到本地。而后就能够进去进行各类修改,本身拿来用或者经过pull request
提交到原始分支。安全
下面说一下建立新repo
的方法。这个方法其实github的help页面已经说的很详细了,但我以为非常很多人会遇到问题,看看stackoverflow上关于这些东西的问答就知道了。服务器
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上。至此至关于完成了建立一个“软件仓储的过程。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 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 aNewBranchName
和 git 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,这样下载完成以后它就自动重命名了。分布式
更深刻的我本身目前还用不到,看了也是忘记,用到再记下来吧。