关于gitgit
Git,是一个分布式版本控制软件。最初本是为了更好的管理Linux内核开发而被林纳斯·托瓦兹开发,后来由于项目开发中版本控制的强烈需求,而git也日趋成熟,最终成为了一个独立的版本控制软件。github
git使用方法bash
建立远程仓库服务器
说得白话一点就是在代码托管服务器上给我分配一片可远程访问的空间,目前支持git的代码托管服务不少,名气最大的莫过于Github,其余还有GitLab编辑器
有什么好处:分布式
一、方便多人(有权限)共享,团队开发尤其重要;工具
二、不怕更换电脑,公司和家里或出差,只要有电脑就能够访问;测试
三、不怕硬盘损坏代码丢失;fetch
四、其余还有不少。spa
基于以上代码托管服务器,创建一个远程仓库很是简单,以Github为例,打开https://github.com 首页登陆进去后,页面右上角有一个“+”图标,根據提示便可創建。
建立本地代码库(init)
本地代码库,其实就是咱们的代码目录,若是非要区别普通代码目录和git仓库目录,那就是基于git的代码目录里面会多一个.git的目录,这个目录通常是不可见的。如何将一个普通代码目录变成git工做目录,其实很简单。咱们可使用cmd、git bash或任何一个命令行工具,进入工做目录,而后运行下面这行代码就能够了:
git init
当本地仓库初始化好后,其实咱们已经可使用git工做了,好比将代码文件添加到版本记录,建立本地分支,合并本地分支代码等等。
绑定本地代码库与远程仓库(remote | clone)
若是仅仅使用git在本地捣鼓,那么咱们上面提到的远程代码托管的优点就彻底没有意义了,因此咱们要把咱们的本地仓库和远程仓库绑定起来,这里就要分状况了。
若是是如今本地已经开发的一个全新项目须要推送到远程仓库:
git remote add origin https://github.com/username/project.git
若是是在别人已经开发过的仓库中继续开发,不须要预先创建并初始化本地仓库,直接执行下面这条命令:
git clone https://github.com/username/project.git
查看仓库文件状态(status)
当咱们已经拥有一个本地git仓库或对咱们的项目进行了修改后,只需在git bash中执行:
git status
一般状况下,可能看到一堆红色标记的列表,包括如下信息:
1)Changes to be committed:等待提交的更改
2)new file:新增文件
3)modified:有改动的文件
4)deleted:删除的文件
5)Untracked files:未添加到版本记录的文件
若是是一个全新仓库,咱们只能看到Untracked files项。
添加文件并提交到暂存区(add & commit)
当经过git status看到有红色文件列表,并且其中有咱们想要保存到远程仓库中的文件时,咱们可经过git add 命令,将相应文件添加到暂存区,咱们也能够经过git add .命令,添加全部新增或有更新的文件,但这里要注意删除的文件不会被添加。
添加删除的文件须要使用git add -u filename或git add -u .命令。
接下来咱们还须要执行一个命令git commit,才能将添加的文件(变化)提交到暂存区。这个命令的用法也有几种,常见的是直接执行git commit -m ‘log info’,还有一种是执行git commit打开指定编辑器,编辑好日志后关闭编辑器便可,通常用于日志内容比较多的状况。
建立并切换分支(branch & checkout)
在实际开发过程当中,咱们须要考虑代码的稳定性,未通过测试的代码不能发布到线上环境。这就意味着咱们若是咱们一直在一个分支上开发代码是很危险的,一步留神就可能把有bug的代码提交到了远程仓库,形成没必要要的麻烦,因此通常状况下使用版本控制器,咱们都会使用它的分支功能。即开发分支、主干分支,当开发分支上的代码测试稳定后,再合并到主干分支,将主干分支提交到远程仓库,这样出错的几率就下降了不少。
使用git bash能够很方便的创建分支,咱们只需执行git branch newbranch便可建立一个名为newbranch的分支,而后咱们只需执行git checkout newbranch命令,便可将咱们的工做环境切换到newbranch分支上。
还有一种更为简便的方法,能够直接使用checkout命令,完成建立并切换到分支:
git checkout -b newbranch
合并分支(merge)
前面咱们提到了,当开发分支上的代码测试稳定后,咱们就能够合并到主干分支上,并提交到远程仓库。那么如何合并两个分支的代码成了一个问题。难道要对比两个文件的差别,一行一行的copy代码?显然git不会这么笨,它是很智能的,咱们只需简单的运行一条命令便可完成代码自动合并。咱们设想开发分支(newbranch)将被合并到主干分支(master)上,那么首先咱们要先将开发分支的代码提交到暂存区,而后切换到主干分支,最后执行合并操做,完整的操做流程大体以下:
git add .
git commit -m 'newbranch
git checkout master
git merge newbranch
可是,在合并代码的时候,特别是多人开发的时候,偶尔出现冲突(两我的同时改动了同一个地方)也是在所不免的,这种状况,我么恐怕就须要人肉解决下了。不过问题不大,git将文件冲突的地方都会以特殊的形式标明的。
# 冲突示例 <<<<<<< HEADaa # 当前分支上的内容 ======= bb # 被合并分支上的内容 >>>>>>>nb
将本地代码推送到远程仓库(push)
当开发分支上的代码都被合并到主干分支上,而且全部的冲突都解决好后,咱们就能够将主干分支的代码推送到远程仓库,提供给别人使用了。这一步很简单:
git push origin master
还记得咱们执行git remote add后面的origin吗?这里和那里是同样的,而最后那个master就是分支名称了。若是远程已经有该分支,便会先检查远程仓库在最近一次更新以后发生过更改,若是有会提示先进行更新代码,而后再提交。若是未变更过,本地代码则会直接提交至远程代码仓库。
将远程仓库中的代码更新到本地(pull & fetch)
然而,通常状况下,咱们在执行git push以前,都会先更新一次远程仓库中的内容:
git pull origin master
这里咱们须要注意一下,和git merge命令同样,pull命令是有可能致使代码冲突的。而pull命令从某种意义来说实际和fetch+merge命令同样,这里就再也不对fetch作进一步说明了。
比较代码差别(diff)
一般咱们在开发过程当中涉及的文件比较多,修改的地方也比较多,当咱们须要提交代码的时候,每每想不起来咱们修改了哪些内容,哪些问需被提交。这时候咱们可能但愿能查看一下在前次提交代码以后咱们对本地仓库所作的改动,能够这么作:
git diff
查看working tree和indexfile的差异,也能够:
git diff --cached
查看index file与commit的差异,还能够:
git diff HEAD
查看working tree和commit的差异。
diff命令的使用,大体就是这个样子。
代码回滚与日志(reset & log)
当咱们的项目开发到必定阶段后,也许偶尔就发现该版本的升级存在问题,须要临时将项目恢复到上一个稳定版本。可是,人肉的将升级代码改回去,显然是不现实的,更科学的解决方法是使用git的reset命令:
git reset --hard commitId
将本地仓库代码回滚到commitId对应的版本,或者:
git reset --hard HEAD~number
将最近number次的提交进行回滚,number为一个整数。那么问题来了,当咱们须要回滚到指定版本的时候,commitId从何而来?咱们怎么知道哪一个commit是最近的稳定版本?
说到这里,就该log命令出场了。咱们可使用log命令,查看仓库的提交历史,以及每一个提交的更改日志,甚至更改的内容,其最基本的用法以下:
git log -2 # 查看最近两次的提交历史 git log # 默认会输出全部的提交历史,最近的在最上面
咱们能够根据日志内容,找到响应的稳定版本代码的commitId,而后再使用reset命令进行代码恢复。reset和log命令很是强大,了解更多上網查閱。
给代码库打标签(tag)
tag命令,是用来给咱们的代码库打标签的。听起来可能有些不太理解,其实平常使用中,一般是用来添加版本标记。
git tag v1.0.0
代表在这里咱们发布了1.0.0版本。这样就能够很方便的让咱们回顾项目每一个版本的样子,历史就是这样用血写成的。咱们也能够经过tag命令查看已有的标签,只须要执行:
git tag
打造本身的git命令
Git已然很是强大,并且git的命令也已经很是简洁明了。可是,开发者们每每但愿使用工具的同时能保留本身的个性,但愿能符合本身的操做习惯。好比笔者就嫌checkout命令太长了,虽然各类自动补全,但用起来仍是以为不顺手,那么有没有什么办法能够再简洁些呢?答案是确定的。下面给你们列出笔者的缩写配置,固然也是曾经参考了不少网上大牛们的教程的。
git config --global alias.st status
git config --global alias.br branch
git config --global alias.co checkout
git config --global alias.ci commit
詳見 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000