Git教程

Git教程

版本控制

什么是版本控制?我为什么要关心它呢?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

本地版本控制系统

许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单。不过坏处也不少:有时候会混淆所在的工作目录,一旦弄错文件丢了数据就没法撤销恢复。

为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异
SVN
图 1-1. 本地版本控制系统其中最流行的一种叫做 rcs,现今许多计算机系统上都还看得到它的踪影。甚至在流行的 Mac OS X 系统上安装了开发者工具包之后,也可以使用 rcs 命令。它的工作原理基本上就是保存并管理文件补丁(patch)。文件补丁是一种特定格式的文本文件,记录着对应文件修订前后的内容变化。所以,根据每次 修订后的补丁,rcs 可以通过不断打补丁,计算出各个版本的文件内容。

集中化的版本控制系统

接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS )应运而生。这类系统,诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这 已成为版本控制系统的标准做法
SVN
图 1-2. 集中化的版本控制系统这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。
事分两面,有好有坏。这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要 是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端偶然 提取出来的保存在本地的某些快照数据就成了恢复数据的希望。但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系 统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。

分布式版本控制系统

于是分布式版本控制系统( Distributed Version Control System,简称 DVCS )面世了。在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来 的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份
SVN
图 1-3. 分布式版本控制系统更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。

什么是Git

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

什么是 SVN

SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS

集中式管理的工作流程如下图
SVN

1.从服务器下载项目组最新代码。
2.进入自己的分支,进行工作,每隔一个小时向服务器自己的分支提交一次代码(很多人都有这个习惯。因为有时候自己对代码改来改去,最后又想还原到前一个小时的版本,或者看看前一个小时自己修改了哪些代码,就需要这样做了.
3.下班时间快到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器。
这就是经典的svn工作流程,从流程上看,有不少缺点,但也有优点。

什么是CVS

CVS(英语:Concurrent Versions System,或Concurrent Versioning System)代表协作版本系统或者并发版本系统,是一种版本控制系统,方便软件的开发和用户协同工作。
CVS基于客户端/服务器结构的行为使得其可容纳多用户,构成网络也很方便。这一特性使得CVS成为位于不同地点的人同时处理数据文件(特别是程序的源代码)时的首选(现已被Git、SVN等逐渐替代)。

SVN&CVS&Git对比

svn&CVS&Git
1. 存储类型格式
CVS是个基于RCS文件的版本控制系统。每个CVS文件都不过是普通的文件
SVN是基于关系数据库的(BerkleyDB)或一系列二进制文件的(FS_FS)。
2. 速度
CVS比较慢。
Git 与 SVN 区别点:
1.GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
2.GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。
3.GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外的一个目录。
4.GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
5.GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏

Git安装

$ apt-get install git
在 Windows 平台上安装 Git 同样轻松
安装包下载地址:http://msysgit.github.io/

Git 配置

配置个人的用户名称和电子邮件地址:
gitconfigglobaluser.emailtest@runoob.com git config –global core.editor emacs
查看配置信息
$ git config –list

Git 工作流程

一般工作流程如下:
+ 克隆 Git 资源作为工作目录。
+ 在克隆的资源上添加或修改文件。
+ 如果其他人修改了,你可以更新资源。
+ 在提交前查看修改。
+ 提交修改。
+ 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
Git 的工作流程:
git

Git 工作区、暂存区和版本库

git

Git 创建仓库

git init

Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。
在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。
* 使用方法
使用当前目录作为Git仓库,我们只需使它初始化。
git init
该命令执行完后会在当前目录生成一个 .git 目录。
使用我们指定目录作为Git仓库。
git init newrepo
初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:
gitadd.c git add README
$ git commit -m ‘初始化项目版本’
以上命令将目录下以 .c 结尾及 README 文件提交到仓库中

git clone

我们使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout)
克隆仓库的命令格式为:
git clone
如果我们需要克隆到指定的目录,可以使用以下命令格式:
git clone
* 参数说明:
repo:Git 仓库。
directory:本地目录。
比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:
gitclonegit://github.com/schacon/grit.gitgrit.git git clone git://github.com/schacon/grit.git mygrit

Git 基本操作

Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。本章将对有关创建与提交你的项目快照的命令作介绍。

获取与创建项目命令
git init

用 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做,完全是本地化的。
在目录中执行 git init,就可以创建一个 Git 仓库了。比如我们创建 runoob 项目:
mkdirrunoob cd runoob/
$ git init
Initialized empty Git repository in /Users/tianqixin/www/runoob/.git/
在 /www/runoob/.git/ 目录初始化空 Git 仓库完毕。
现在你可以看到在你的项目中生成了 .git 这个子目录。 这就是你的 Git 仓库了,所有有关你的此项目的快照数据都存放在这里。
ls -a
. .. .git

git clone

使用 git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。
如果你需要与他人合作一个项目,或者想要复制一个项目,看看代码,你就可以克隆那个项目。 执行命令:
git clone [url]
[url] 为你想要复制的项目,就可以了。
例如我们克隆 Github 上的项目:
默认情况下,Git 会按照你提供的 URL 所指示的项目的名称创建你的本地项目目录。 通常就是该 URL 最后一个 / 之后的项目名称。如果你想要一个不一样的名字, 你可以在该命令后加上你想要的名称。

基本快照

Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。本章将对有关创建与提交你的项目的快照的命令作介绍。

git add

git add 命令可将该文件添加到缓存,如我们添加以下两个文件:
$ git add README hello.php
git status 命令用于查看项目的当前状态。
“AM” 状态的意思是,这个文件在我们将它添加到缓存之后又有改动。改动后我们在执行 git add 命令将其添加到缓存中:

git status

git status 以查看在你上次提交之后是否有修改。
我演示该命令的时候加了 -s 参数,以获得简短的结果输出。如果没加该参数会详细输出内容:

 git diff

执行 git diff 来查看执行 git status 的结果的详细信息。
git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。git diff 有两个主要的应用场景。
尚未缓存的改动:git diff
查看已缓存的改动: git diff –cached
查看已缓存的与未缓存的所有改动:git diff HEAD
显示摘要而非整个 diff:git diff –stat

git commit

使用 git add 命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中。
Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址。
gitconfigglobaluser.namerunoob git config –global user.email test@runoob.com

git reset HEAD

git reset HEAD 命令用于取消已缓存的内容。

git rm

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 Changes not staged for commit 的提示。
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。可以用以下命令完成此项工作
git rm
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
git rm -f
如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 –cached 选项即可
git rm –cached

git mv

git mv 命令用于移动或重命名一个文件、目录、软连接。

Git 查看提交历史

在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看。
针对我们前一章节的操作,使用 git log 命令列出历史提交记录如下:
gitlogoneline git log –oneline
我们还可以用 –graph 选项,查看历史中什么时候出现了分支、合并。以下为相同的命令,开启了拓扑图选项:现在我们可以更清楚明了地看到何时工作分叉、又何时归并。
gitlogonelinegraphreverse git log –reverse –oneline
如果只想查找指定用户的提交日志可以使用命令:git log –author , 例如,比方说我们要找 Git 源码中 Linus 提交的部分:
gitlogauthor=Linusoneline5sincebeforeuntilafterGitnomerges git log –oneline –before={3.weeks.ago} –after={2010-04-18} –no-merges

Git远程操作详解

Git有很多优势,其中之一就是远程操作非常简便。本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Git远程操作。
git clone
git remote
git fetch
git pull
git push
本文针对初级用户,从最简单的讲起,但是需要读者对Git的基本用法有所了解。同时,本文覆盖了上面5个命令的几乎所有的常用用法,所以对于熟练用户也有参考价值。
git

git clone

远程操作的第一步,通常是从远程主机克隆一个版本库,这时就要用到git clone命令
$ git clone <版本库的网址> <本地目录名>
git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等

git remote

为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
不带选项的时候,git remote命令列出所有远程主机。使用-v选项,可以参看远程主机的网址。
gitremotevorigin使Gitorigingitcloneogitremoteshow git remote show <主机名>
git remote add命令用于添加远程主机。
gitremoteadd<><>gitremoterm git remote rm <主机名>
git remote rename命令用于远程主机的改名
$ git remote rename <原主机名> <新主机名>

git fetch

一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。取回所有分支(branch)的更新
gitfetch<> git fetch <远程主机名> <分支名>
表示在当前分支上,合并origin/master
$ git merge origin/master

git pull

git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。
gitpull<><>:<> git pull origin next
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。
gitfetchorigin git merge origin/next
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。
Git也允许手动建立追踪关系。
git branch –set-upstream master origin/next
上面命令指定master分支追踪origin/next分支
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。

git push

git push命令用于将本地分支的更新,推送到远程主机。
gitpush<><>:<> git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
gitpushorigin:master git push origin –delete master
上面命令表示删除origin主机的master分支。
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
gitpushoriginorigin使u使 git push -u origin master
上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。
gitpushalloriginoriginGitgitpull使force git push –force origin
结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用

实验A

root@ubuntu:~/test# git clone https://10.130.0.19/%%%/aaaa.git
Cloning into ‘aaaa’…
fatal: unable to access ‘https://10.130.0.19/%%%/aaaa.git/‘: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
- 问题解决
export GIT_SSL_NO_VERIFY=1
or
git config –global http.sslverify false

* Create a new repository*
git clone https://10.130.0.19/%%%/aaaa.git
cd aaaa
touch README.md
git add README.md
git commit -m “add README”
git push -u origin master

* Existing folder*
cd existing_folder
git init
git remote add origin https://10.130.0.19/%%%/aaaa.git
git add .
git commit -m “Initial commit”
git push -u origin master

* Existing Git repository*
cd existing_repo
git remote rename origin old-origin
git remote add origin https://10.130.0.19/%%%/aaaa.git
git push -u origin –all
git push -u origin –tags

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值