如何用好git?

git是一个非常好用的版本控制工具与团队协作工具

为什么用?怎么用

如果单人使用,更多的是为了版本控制

我们想一下这样一个场景,用某个php框架写好了一个购物网站,现在你要往里面添加一个新功能,3个多小时以后,你发现你的工程出现了问题,怎么debug也发现不了,但也不知道是哪里出了问题,想要恢复到3小时之前........这里就只能找时光机了


如何用好git?_第1张图片
34035e716f41257f962b43fd.jpg

但是有了git 你可以轻易的恢复到上次提交的状态,下载安装配置很简单。直接开始使用
先来简单说一下git的基本思路

git 把工作目录分为4种,分别为未跟踪,未修改 ,已修改 和 暂存

如何用好git?_第2张图片
18333fig0201-tn.png

初始化

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
回到特定某此的commit 需要使用命令 git reset --hard [commit]
查看commit 的历史可以使用git log命令

但是这样会删除掉之后的commit 万一又反悔了呢 git reset --hard [commit]搭乘时光机

这样可以使用git reflog命令查看历史 ,并再次使用

如果没git add. 只是想取消掉某次编辑
使用
git checkout -- .

如何用好git?_第3张图片
7bc029a4b04efa1033b080de467d9dd8_b.jpg

其实这就是git的极限了.能用作版本控制已经很方便了

如何用好git?_第4张图片
206185dcbf3fc394785cee177e7f424e_b.jpg

逗你玩呢亲,不过这的确是我初学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?_第5张图片
18333fig0304-tn.png

使用git checkout testing来切换分支

切换之后我们修改文件并提交

如何用好git?_第6张图片
18333fig0307-tn.png

好了这时我们返回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


=======

buren

这一部分属于head分支

<<<<<<< HEAD


=======


这一部分属于buren分支

=======

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

你可能感兴趣的:(如何用好git?)