Git实战——来自实验楼

Git诞生

Git是linux社区开发的分布式版本控制系统,特点是:
- 速度
- 简单的设计
- 对非线性开发模式的强力支持(允许上千个并行开发的分支)
- 完全分布式
- 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)。

2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等

版本控制系统

  • 集中式版本控制系统,版本库是集中存放在中央服务器的,而大家工作的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始工作,工作完成,再把自己的修订推送给中央服务器。这类系统,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

那分布式版本控制系统与集中式版本控制系统有何不同呢?

  • 首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

  • 和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

  • 在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

基本用法(一)

如何创建和使用 git 仓库

创建

  • git初始化(git配置你的名字和邮箱)
  • 获得一个git新仓库(clone一个或新建一个新仓库——git init获得.git文件夹)

使用

正常的工作流程

  • 创建或修改文件(touch,vim或直接echo 添加——echo “ ” >> file)
  • 使用git add命令添加新创建或修改的文件到本地的缓存区(Index)
  • mkdir project在当前目录下创建一个新的文件夹
  • –m参数是注释信息:“ ”
  • 使用git commit命令提交到本地代码库
  • (可选,有的时候并没有可以同步的远端代码库)使用git push命令将本地代码库同步到远端代码库

分支与合并

Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。
分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。

一个Git仓库可以维护很多开发分支

创建分支

git branch 分支名:创建新分支
git branch :查看当前的分支列表
master分支是Git系统默认创建的主分支,星号标识了你当工作在哪个分支下
git checkout 分支名:切换到其他分支

  • 查看下file1中的内容会发现刚才做的修改已经看不到了。因为刚才的修改时在experimental分支下,现在切换回了master分支,目录下的文件都是master分支上的文件了。
  • 这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?

合并

  • git merge命令合并分支到主线分支
  • 合并后删除分支 :git branch -d只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D
  • 撤销一个合并 git reset –hard HEAD^
快速向前合并

还有一种需要特殊对待的情况,在前面没有提到。通常,一个合并会产生一个合并提交(commit), 把两个父分支里的每一行内容都合并进来。但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit)都已经存在另一个分支里了,git 就会执行一个“快速向前”(fast forward)操作;git 不创建任何新的提交(commit),只是将当前分支指向合并进来的分支。

git日志

git log:显示所有的提交

git log –stat : 如果用–stat选项使用’git log’,它会显示在每个提交(commit)中哪些文件被修改了, 这些文件分别添加或删除了多少行内容,这个命令相当于打印详细的提交记录

基本用法(二)

  • git diff命令的作用是比较修改的或提交的文件内容
  • git diff –cached:查看缓存区内与上次提交之间的差别(使用–cached参数)
    -add 将修改加到缓存区,commit将缓存区东西提交到本地代码库

查看分支之间区别

  • git diff master test:查看分支test与主线分支master之间的区别
  • git diff 是一个难以置信的有用的工具,可以找出你项目上任意两个提交点间的差异

分布式的工作流程

  • git pull命令执行两个操作: 它从远程分支(remote branch)抓取修改git fetch的内容,然后把它合并git merge进当前的分支。
  • 如果我们在myrepo目录下执行git pull会发生什么呢?
    myrepo会从克隆的位置拉取代码并更新本地仓库,就是把gitproject(远程分支)上的修改同步到本地

公共git仓库

开发过程中,通常大家都会使用一个公共的仓库,并clone到自己的开发环境中,完成一个阶段的代码后可以告诉目标仓库的维护者来pull自己的代码。

如果你和维护者都在同一台机器上有帐号,那么你们可以互相从对 方的仓库目录里直接拉所作的修改,git命令里的仓库地址也可以是本地的某个目录名

将修改推到一个公共仓库

通过http或是git协议,其它维护者可以通过远程访问的方式抓取(fetch)你最近的修改,但是他们没有写权限。

如何将本地私有仓库的最近修改主动上传到公共仓库中呢?

最简单的办法就是用git push命令,推送本地的修改到远程Git仓库
git push命令的目地仓库可以是ssh或http/https协议访问

当推送代码失败时要怎么办

先git pull 再git push

Git 标签

  • 我们可以用 git tag不带任何参数创建一个标签(tag)指定某个提交(commit)

Git初级技能到此结束,实验楼还有中高级技能可供后续学习。

你可能感兴趣的:(Git)