这篇文章昨天就写好了,但是不知道什么原因消失了 -_-|||,所以这里算是前一版本的精华
先给出一些我认为比较合适的学习资源:
- 新手入门,简易版的——git使用简易指南
- 官方教程,Git-Book 英文版
- 官方教程,Git-Book 中文版
一、什么是git?
Git是Linus用C实现的一个分布式版本控制工具,注意这里对分布式的强调。不同于Git,像Perforce、SVN和CVS这类版本控制工具都是集中式的。
那么这里有引入一个新的问题——什么是版本控制?
版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。
开发人员或许都有这个经历,最初学习开发编程时,一个项目的代码是如何进行管理和整合的呢?我最初就是通过不停地Copy,Ctrl+C,Ctrl+V,来保存和整合项目团队中的代码。后来会有一些某某企业研发的云应用来借助云服务器来管理代码。现在,Git来了。
版本控制系统 (VCS)可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而导致出现怪异问题,又是谁在何时报告了某个功能缺陷等等。使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。但额外增加的工作量却微乎其微。
二、为什么使用Git?
之前也提到过,git是分布式版本控制工具,同时还有同样使用率很高的版本控制工具,比如SVN和CVS等。但后者是集中式的版本控制工具。
2.1 集中式版本控制
集中式的版本控制,就是在一个系统中只有一个机器是服务端,其他机器全是客户端。
集中管理的服务器保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
但是集中式的版本控制缺陷也是很明显的:
- 网络依赖性强,工作环境保持网络连接,如果网络断掉了,所有的客户端就无法工作了。
- 安全性较弱,所有的代码以及版本信息保存在服务器中,一旦服务器挂掉了,代码和版本控制信息就丢失了。
2.2 分布式版本控制
在分布式版本控制系统中,没有服务端/客户端的概念,每台机器都是一个服务器。也就是说,在分布式本版控制系统中,每台机器都有一份代码,并且有代码的版本信息。
git就是这样一种版本控制工具,它的优势也是很明显的:
- 每台机器都是一台服务器,无需依赖网络就可以帮自己的更新提交到本地服务器,支持离线工作。当有网络环境的时候,就可以把更新推送给其他服务器。
- 安全性高,每台机器都有代码以及版本信息的维护,所有即使某些机器挂掉了,代码依然是安全的。
虽然分布式版本控制没有服务端的概念,但一般在一个Git系统中,为了方便大家交换更新,会找一台机器作为中心服务器,这台机器的目地只是为了方便大家交换更新。即使这台中心服务器挂了,大家依然可以继续工作,只是相互之间交换更新比较麻烦。
三、git基础
上面这张图熟悉git的人应该很好理解,对于刚入门的同学来说,首先我们要了解一下途中的几个重要元素。
3.1 git内,文件的三种状态
- 已提交(committed)
- 已修改(modified)
- 已暂存(staged)
已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
3.2 Git 管理项目时,文件流转的三个工作区域
- 本地的工作目录(Working dir)——它持有实际文件
- 本地缓存(Index Stage)——它像个缓存区域,临时保存你的改动
- 本地仓库(Local Repo)—HEAD——指向你最近一次提交后的结果
四.git常用命令
在Git中支持上百个命令,每个命令又有很多的选项,所以初学者看到这些就会有一些恐惧。
其实,真正接触过Git一段时间后,会慢慢的发现我们会经常使用的命令也就十几二十个,掌握了这些命令之后就可以满足我们大部分的日常工作了。
在上面我们已经了解了本地的一些基本的结构和文件状态,正如上面的工作流的图中所示,这里只是针对本地工作流最常用的几个命令做一些简单地介绍:
1.添加文件到缓存区:
$ git add filename1 filename2
$ git add .
2.提交文件,这步操作将改动提交到了 本地仓库,但是还没到你的远端仓库:
$ git commit -m "文件提交信息"
//用 -m 来输入一条提交信息
使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。
$ git commit -a -m "文件提交信息"
---- 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上-a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤:
3.推送变更——将代码提交到远端仓库:
$ git push [remoteName] [localBranchName]
$ git push origin master
// 这段代码的的意思是:将自己的master分支提交到名为origin的服务器上
4.将某个远程主机的更新,全部取回本地:
$ git fetch <远程主机名> <分支名>
$ git fetch origin master
//丢弃你所有的本地改动与提交,到服务器上获取最新的版本到HEAD目录
5.拉取远程仓库,拉取到本地目录(区别于git fetch):
$ git pull [remoteName] [localBranchName]
PS!!!:需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
6.分支操作:
基本上工作中常用的就是上述几个,这里附加介绍一些分支操作:
查看本地分支:
$ git branch
查看远程分支:
$ git branch -r
创建本地分支:
$ git branch [name] ----注意新分支创建后不会自动切换为当前分支
切换分支:
$ git checkout [name]
创建新分支并立即切换到新分支:
$ git checkout -b [name]
删除分支:
$ git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
合并分支:
$ git merge [name] ----将名称为[name]的分支与当前分支合并
7.其他命令
Git 也可以对某一时间点上的版本打上标签。人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做:
$ git tag v1.0
然后push到远端:
$ git push origin v1.0:v1.0