git是一个非常好用的版本控制工具与团队协作工具
为什么用?怎么用
如果单人使用,更多的是为了版本控制
我们想一下这样一个场景,用某个php框架写好了一个购物网站,现在你要往里面添加一个新功能,3个多小时以后,你发现你的工程出现了问题,怎么debug也发现不了,但也不知道是哪里出了问题,想要恢复到3小时之前........这里就只能找时光机了
但是有了git 你可以轻易的恢复到上次提交的状态,下载安装配置很简单。直接开始使用
先来简单说一下git的基本思路
git 把工作目录分为4种,分别为未跟踪,未修改 ,已修改 和 暂存
初始化
git init
git 采用的是文件快照方式,这样使得在工作目录产生一个.git文件夹,每次提交的文件快照就在这里备份
这个命令实际上产生和初始化了工作目录
在这之后这个目录下的所有文件都是 未跟踪的
然后我们按照正常的写代码的方式,直到某次成功实现了一个功能
接下来可以使用
git add [filename] 名来来增加跟踪文件
一般来说我会使用git add .
来跟踪全部文件
执行这个命令之后 被添加的文件状态就变成了未修改的了,此时开始,这个文件算是正式进入了git 的管理流程
接下来,我们增加我们想要的功能,本质上就是对代码文件的修改
这之后,文件状态就由 未修改变成了已修改了
对某文件修改之后,我们可以使用git diff
来查看究竟改了哪些文件
修改之后,仍需要使用命令git add [filename]
来改变文件的状态
被 add 的文件文件 将从已修改到已暂存
虽然形式上和之前添加文件到git是一样的,但本质意思是完全不同的.
提交更新
git commit -m " this is first commit "
(从modified 到staged)
每一次提交想到于一次里程碑,git将保存所有暂存文件的文件快照,于此同时,所有文件状态
也变成未修改
每次提交都相当于一次很小的版本变动,需要注意的是提交频率
git log
命令用于显示你的提交历史 -p 选项展开显示每次提交的内容差异
这个过程中你可以随时使用git status
命令来查看文件处于什么样的状态下
回复版本
取消已经暂存的文件,这一步需要放在你错误的git add 之后 (从staged到modified),
git reset head <file>
回到特定某此的commit 需要使用命令 git reset --hard [commit]
查看commit 的历史可以使用git log
命令
但是这样会删除掉之后的commit 万一又反悔了呢 git reset --hard [commit]
搭乘时光机
这样可以使用git reflog
命令查看历史 ,并再次使用
如果没git add. 只是想取消掉某次编辑
使用
git checkout -- <file>.
其实这就是git的极限了.能用作版本控制已经很方便了
逗你玩呢亲,不过这的确是我初学git 的想法,git 真正牛X支出在于分支
多人使用 --远程仓库
多人使用的情况下,除了版本控制之外,在合作分工的情况下也需要合并代码
这种情况下 我们需要使用
git romote
查看当前的远程库
添加远程仓库
git remote add [shortname] [url]:
推送数据到远程仓库
$ git push origin master
查看远程仓库信息
我们可以通过命令 git remote show [remote-name]
查看某个远程仓库的详细信息
可以使用 git remote rename [name]
和git remote rm [name]
来重命名和删除远程分支
这里你可以把远程仓库理解为远程备份
分支
想像一下这样的一个情景。明天需要提交一个工程,主要功能你已经完成,但是还有些小细节你不满意,但不敢直接改——万一整坏了明天交不了了?但如果只用git reset 的方法,今天万一写了很多东西,离成功只有一步之遥,全部放弃更是不舒服,那么使用分支,可以很爽的完成这个任务
git 分支的本质其实就是从某个提交对象往回看的历史
我们使用 git branch [branch name]
来新建分支 这里我们新建testing 分支
使用git checkout testing
来切换分支
切换之后我们修改文件并提交
好了这时我们返回master 分支 git checkout master
再看修改的文件,这样就算你没有及时完成剩余的问题,也可以切换回去主分支提交
当然,提交之后你还可以切换到新分支继续开发
那么另有一种状况,就是你居然写好了,此时,你想把主分支修改成你现有的,怎么办?
需要使用分支的合并,
git merge newbra```
这样,在newbra里面的修改会合并到master里,你也可以过河拆桥 删除 newbra分支
```git branch -d newbra```
查看现有分支
```git branch```可以发现,世界清静了
![7bc029a4b04efa1033b080de467d9dd8_b.jpg](http://upload-images.jianshu.io/upload_images/51094-d15ae388e25cda75.jpg)
恩 好吧 git 成为如此重要的工具,就在于基于分支系统,可以多人一起使用
比如某次暑期实训,你们4个人要共同完成一个网站
商量好怎么写后,你们每个人分到了一个模块,并在github上新建了一个组织
并且把所有人都加了进来
这样的情况我更建议这么做:
主分支保证是最稳定版本,每个成员维护一个分支
>主分支为最稳定版本,这种方法最古老,也最为常见,还有很多其他的方法,git pro 这本书也介绍了很多,有兴趣的可以看看 [git pro](http://iissnan.com/progit/)
首先每个人维护一个自己的分支,自然要把每个人在本地的分支推送到服务器,
这里的服务器肯定是首推[github](https://github.com/)了
为了多人一起维护这个远程仓库,需要你先新建这个组织,邀请你的成员,并设置的成员的权限,比如我们[先声](https://github.com/HeraldStudio)
剩下的就是在本地操作了,我们顺便来总体看一下
```git init ``` 初始话仓库
```git remote add origin [url]``` 添加远程仓库
```git checkout -b buren``` 新建并切换到新分支
```git add .```增加文件
```git commit -m "1"```
把你的分支push到一个远程服务器上
```git push test buren```
注意到这里和我第一次使用的命令是不同的 ,上述命令将目前所处的分支push到服务器的分支上
这时候另一个人想用你增加的部分,他们需要(增加远程仓库之后)
```git fetch origin```
这时 远程分支已经在本地了,但是你并不能修改
需要执行命令来创建可以修改的本地分支```git checkout -b buren origin/buren```
这时候本地已经有了buren这个本地分支
剩下的自然就是用到分支处理了 merge 之类的 就看你了
注意,有的时候两个分支会有冲突,比如两个人同时修改了一部分代码,git 是没法决定要保留哪个人的代码
会在原文件中改成这样的形式
<<<<<<< HEAD
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
buren
这一部分属于head分支
<<<<<<< HEAD
<div id="footer">contact : email.support@github.com</div>
=======
这一部分属于buren分支
=======
<div id="footer">
please contact us at support@github.com
</div>
buren
除了前期商讨避免这样的情况外,还可以```git mergetool ```来运行各种merge工具来帮助你完成合并
关于安装配置使用各种mergetool 网上有很多教程
![7bc029a4b04efa1033b080de467d9dd8_b.jpg](http://upload-images.jianshu.io/upload_images/51094-d15ae388e25cda75.jpg)
##github
接下来我们再来说一下github 这个最大的git远程仓库
这里有很多“社交功能”,你还可以为开源库提供代码,fork 一个新分支,并在上面增加你的内容
![wKioL1MeafvCM9vFAACmNIIgj_M326.jpg](http://upload-images.jianshu.io/upload_images/51094-eb3066494d4e663e.jpg)
使用git clone [url]功能可以方便的下载代码
使用这样方法下载的文件夹本身就是一个git仓库 且里面所有文件都是未修改状态
git还大大改变了程序员的书写习惯 markdown就是这么厉害
本文就是用markdown来写的 ,markdown语法很简单,并且建议为你所有上传到github 的仓库增加一个
```README.MD```的说明文件
注:本文基本为一次演示的提纲,框架很空虚,需要详细了解git 建议阅读git pro