git入门与实践【转】

转自:http://www.cnblogs.com/shenhaocn/archive/2011/03/13/1982957.html

什么是版本控制

要了解什么是git,首先需要了解什么是版本控制(Version Control),版本控制系统(Version Control System,简称VCS)是一种记录一个或多个文件的变化的系统,这样的系统能够方便你今后调用找回某个特定时期(或版本)的文件。 版本控制系统广泛地应用于程序开发等领域,它可以协助你将某个指定的文件(甚至是一整个项目)返回至某个之前记录的状态,查看发生了哪些变化、对变化进行比较或者是修正致命错误。 版本控制系统主要经历了本地版本控制,集中式版本控制到分布式版本控制的发展:

  • 本地版本控制(Local Version Control System)顾名思义就是本地化的版本控制系统,没有网络协作等较为先进的版本控制的概念
  • 集中式版本控制意(Centralized Version Control System)为有一台版本控制服务器运行在那边存放并提供一个项目中所有版本文件的服务,在很长一段时间内占据主流,其中CVS与Subversion(SVN)为其代表
  • 分布式版本控制(Distributed Version Control System)克服了集中式版本控制可能因为单点失败造成的巨大损失的缺点,让每一台客户端在每一次checkout操作后都完全镜像整个版本控制中的项目。在分布式版本控制系统中,任何一台机器都可以视为版本控制服务器。即使有一台服务器失去服务能力,其它机器与系统可以继续协作维持版本控制系统的正常运转。git就是分布式版本控制系统

git的历史

在2005年,Linux内核开发团队与其使用的分布式版本控制系统BitKeeper的开发公司关系破裂,他们没有了免费使用BitKeeper的特权。这直接催生了Linux开发社区自己开发一套分布式版本控制系统的想法。 Linux开发社区借鉴了之前使用BitKeeper时看到的闪光点,并希望能够在版本控制系统的速度、架构设计与各类特性支持中作出较好的改进与提升,于是,git诞生了。

基础概念与机制

git与其它主流的VCS最大的区别就是,在项目版本更新的过程中,git记录的并非是基于初始文件的变化数据,而是通过一系列快照(Snapshot,就像是个小型的文件系统)来保存记录每个文件。如果有些文件在版本更新后没有发生任何变化,那么在新的版本中它会是一个指向最近一次更新的文件版本的链接。 此外,几乎所有git的操作都是在本地进行的,所以,没有了“延迟”,几乎所有的操作都是瞬间完成的。例如,当你想要查看项目历史时,不需要特地去服务器上抓取历史记录,直接在本地浏览即可。这意味着,你可以在本地对比两个不同版本的文件的差别,可以在本地查看过去有哪些人对指定文件作出了修改与更新,可以……几乎完全本地化的操作也让这样一种场景成为了可能: 当一个人在飞机、火车上,或者是任何因素导致没有网络连接条件但是又必须抓紧时间对自己的项目进行修改与开发,同时又需要有版本管理系统来记录每次他commit的历史,这时,git提供了他所有需要的便利。

git使用SHA-1 Hash算法加密生成的40位字符串(而不是文件名)来记录代表git中的每样东西。格式就像这样:

??6bafcdc09f3d6d416f6572f82082987a486d3098

git中的文件主要会处于三种状态,它们分别是:

  • Committed: 文件或数据已经安全的存放在了git本地数据库中
  • Modified: 文件或数据已经修改但是尚未commit到数据库
  • Staged: 文件或数据已被标记要放入到下一次commit中

这样的机制致使git的镜像会由三个部分组成(假设有一个git目录叫git-repo):

  • Git directory: 存放项目中所有元数据以及对象的地方(git-repo/.git/)
  • Working directory: 在这里是从git项目数据库中checkout出的一个单独的(默认情况下是最新的)项目版本,用于对指定项目版本中的文件进行修改和编辑(git-repo/)
  • Staging area: 一般是存放在Git directory中的一个简单的文件,里面存放着下一次需要commit的文件的信息(在git-repo/.git/中)

安装git

在快速了解了git的概念与历史后,我们就要开始学习使用它了,自然而然的,第一步我们需要将git安装到我们的系统中去。 众所周知,不同的Linux发行版本有着不同的包管理模式,在大多数Linux发行版本的软件源中,都会有现成的git包已经打好以提供yum,aptitude之类的工具直接解决依赖问题下载与安装。 当然,你也可以手动下载最新的git源代码包,自行编译,不过需要注意一点的是,确保你已经解决了为手动编译git而需要解决的软件依赖问题:

使用yum工具先行解决包依赖问题(适用于RHEL,CentOS,Fedora等):
# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
使用aptitude工具先行解决包依赖问题(适用于Debian,ubuntu等):
# aptitude install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

完成这些依赖的安装后,到这里下载最新的git源代码包,然后开始安装:

$ tar -zxf git-xxx.tar.gz # xxx代表版本号
$ cd git-xxx/
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install

一旦git的安装完成了,今后你可以使用git本身来获取git最新的updates:

$ git clone git://git.kernel.org/pub/scm/git/git.git

git同样能够在Mac OS X与Windows上使用,具体的操作请参考de.google.com/p/git-osx-installer/">这里和de.google.com/p/msysgit/">这里。

其他Linux发行版本(例如archlinux,gentoo等),可参照各发行版本的官方手册与说明使用各自的包管理工具安装。

配置git

完成git的安装后,不要急着使用,首先你需要对git进行一些小小的配置,它在git的应用(一般是项目开发中)是必要的。git提供了config工具(你也可以手动)来配置以下三份git配置文件:

  • /etc/gitconfig: git的系统全局配置文件,该配置文件中的配置选项对操作系统上所有使用git的用户产生影响,使用git config –system可以针对此文件进行配置
  • ~/.gitconfig: git的用户全局配置文件,该配置文件的配置选项对当前用户产生影响,并且会覆盖掉系统全局配置文件中已经存在的配置选项,使用git config –global可以针对此文件进行配置
  • .git/config: 该文件存在每个git镜像下,其配置文件的配置选项仅对该git镜像产生影响,它会覆盖掉用户全局配置文件中已经存在的配置选项

了解了配置git的文件位置与机制后,我们首先就来尝试配置一下git的用户信息:

$ git config --global user.name "Thomas"
$ git config --global user.email ghosthomas@gmail.com

这时,你就会发现在~/.gitconfig文件中,多出了与用户信息相关的配置(2条赋值语句) 在git的配置文件中,你可以针对用户名、邮件地址、编辑器、diff工具等进行配置,具体的配置参数与方法使用命令

$ git help config

即可获得。

开始git

初始化/获取 git镜像

要开始使用git,首先要做的就是创建或者获取一个git镜像,创建一个文件夹,将其初始化为git镜像:

$ pwd
/home/thomas/workspace/tmp
$ mkdir git-repo
$ cd git-repo/
$ git init
Initialized empty Git repository in /home/thomas/workspace/tmp/git-repo/.git/

在这里可以看到,我建立了一个名为git-repo的文件夹,并且将它初始化成为git镜像目录,初始化的命令为git init,?完成初始化后,会在目录下创建一个名为.git的子目录,对了,这就是前面提到的Git directory。 你也可以通过git clone命令来获取一个已存在的git镜像:

$ git clone git://github.com/schacon/grit.git

默认情况下,clone命令执行后会根据服务器上git镜像的目录名创建目录并进行git镜像的clone,你也可以在上述命令后加上自己希望看到的目录名(比如repo123)来将远程的git镜像clone到该目录下:

$ git clone git://github.com/schacon/grit.git repo123

有了git镜像后,我们就可以开始学习git的基本使用技巧了!

Modify -> Stage -> Commit -> Track

恭喜,现在你已经有一个git镜像来学习、实验或使用了。让我从实际应用出发,一步步为你介绍和解释git的基本应用。

在git的世界里,有两类文件,分别是未追踪(untracked)和已追踪(tracked),已追踪的文件是指已经放入了最新的git镜像(snapshot)里,已追踪的文件又分为三个状态,分别是:

  • Unmodified: 文件没有做过任何修改
  • Modified: 文件已被修改更新
  • Staged: 文件已经修改更新,准备commit的状态

而未追踪的文件指的就是在git的工作目录下,所有尚未被提交放入git镜像目录中的文件。

在学会提交文件至git镜像前,先介绍一个非常重要的工具,git status,它会告诉你目前git镜像的状态,在使用git的过程中,你将会始终依赖这个工具帮助你更出色的完成工作!

$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

可以看出,git status给出了相当详细的信息,第一行中首先给出的是git的分支(branch)状态信息,branch会在将来的文章中进一步为大家介绍,它是git的王牌特性之一。接着,git会告诉你现在还没有东西提交到镜像中,需要先使用命令git add来对文件进行追踪。

所以,假设我们先在git的工作目录中使用C语言写一个helloworld的小程序,保存,我们得到一个文件: helloworld.c,然后,我们希望将这个文件被git镜像追踪(track)到,那么我们需要:

$ git add helloworld.c

这样,我们就将helloworld.c加入到了git镜像中去进行版本控制,再次使用git status来查看目前的镜像状态:

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached ..." to unstage)
#
#       new file:   helloworld.c
#

注意这里它提到了changes to be committed,意思是该文件已经处于staged状态,接下去你可以根据自己的需要将其提交(commit),或者如果你觉得这是一个误操作,该文件不应当被提交,你可以通过git rm –cached命令来取消它的staged状态(你会发现status信息中作出了精确的提示)。

现在,我们通过命令git commit将helloworld.c提交:

$ git commit

这时,会出现一个带有status信息的文本给你编辑(使用什么编辑器取决于你对git的配置),在以”#”开头的注释行下输入一些文本,用于注释此次提交,方便于其他代码协作者的维护与理解!

你也可以通过命令参数-m来直接输入注释内容,加快提交速度:

$ git commit -m "comment here"

至此,你的文件helloworld.c已经处于tracked状态!整个过程就是小标题中所说的从修改(创建)文件到最终提交的过程。

接下来,我们将会探讨一些更为有趣的git使用技巧!

git应用进阶

在前一小节中,笔者举出的只是helloworld式的git基础应用,到这里大家应该有一个可用的git镜像以及一个已经被git追踪管理的文件了吧,是不是很方便和快捷呢?这个小节中我会带领大家了解更多git的工具与使用技巧。

修改已提交文件

现在,我们有一个helloworld.c在镜像中进行版本控制了,我们发现这个文件有一个小错误,oh,有一个循环的条件写错了,赶紧修改一下这个不大不小的bug,针对文件完成修改更新后,我们可以通过git status看到:

# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   helloworld.c
#
no changes added to commit (use "git add" and/or "git commit -a")

git status告诉我们,helloworld.c被修改过了,如果你想要提交,需要再次git add该文件,或者,你可以直接使用git commit -a跳过add的步骤,直接提交(尚未track的文件必须先git add才能进行提交)。

在提示中,还有提到说,如果你想撤销对helloworld.c的修改,就可以使用git checkout命令来实现,这里的情况会是:

$ git checkout -- helloworld.c

如果你这么做了,你就会发现,你的helloworld.c又回到了之前没有被修改过的时候的状态。

git中的diff

在Unix/Unix-like系统中,几乎都会有一个小巧的对比文件不同的工具叫做diff,在git中也有这么一个工具,来详细比较你修改后准备提交的文件与修改前的状态的不同之处,恩,也许你猜到了,这个命令就是git diff

现在我们尝试着再次修改一下helloworld.c,然后运行git diff:

$ git diff
diff --git a/helloworld.c b/helloworld.c
index befc634..a86316b 100644
--- a/helloworld.c
+++ b/helloworld.c
@@ -1,3 +1,4 @@
+/* new comment line */
 #include
 int main(void)
 {

通过git的diff工具,我们很容易发现,这次我在程序中新加入了一行注释代码。

添加新文件

恩,有了一个像样的代码文件后,我需要为我的代码写些说明文档,同时我也需要对这样一篇文档进行维护,那么,就建立一个README.txt文件,并且将它track到git镜像中去,看到这里读者们可以先自行尝试一下:

$ echo README > README.txt
$ ls
helloworld.c  README.txt
$ git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#       README.txt
nothing added to commit but untracked files present (use "git add" to track)

至此,就有一个新的文件已经随时待命准备提交了,你可以清楚的看到git status非常聪明的将README.txt归类为了untracked files里,现在我们将它加入git镜像:

$ git add README.txt
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       new file:   README.txt
#

你可以像之前那样将README文件commit,但是这次我们将会展示的是如何unstage一个文件,在git status信息中,它告诉用户使用git reset HEAD命令来unstage一个文件,我们尝试一下:

$ git reset HEAD README.txt
$ git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#       README.txt
nothing added to commit but untracked files present (use "git add" to track)

看,README.txt又回到了untracked状态!

重命名git中的文件

假设现在我们需要修改README.txt的文件名,千万要记得我们的文件在git的镜像中进行版本控制管理,所以,不要鲁莽的直接使用unix命令mv或者rm来对git镜像中的文件进行普通的文件操作,当然,如果你真的一不留神那么做了,也不要紧。

git中,使用git mv工具来对文件进行重命名:

$ git mv README.txt tutorial.txt
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       renamed:    README.txt -> tutorial.txt
#
$ git commit -a -m "renamed a file"
[master 55ce30d] renamed a file
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename README.txt => tutorial.txt (100%)

可以看到,在提交变更后,README.txt在文件系统以及git镜像中都被成功地重命名为了tutorial.txt。同样的,你可以unstage来撤销对该文件的重命名,the choice is yours!

删除git中的文件

如果我们不再需要tutorial.txt这个文件,我们可以将其从git镜像中删除,git中删除文件的命令是git rm:

$ git rm tutorial.txt
rm 'tutorial.txt'
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       deleted:    tutorial.txt
#
$ git commit -a -m " deleted a file"
[master 7d81981]  deleted a file
 1 files changed, 0 insertions(+), 1 deletions(-)
 delete mode 100644 tutorial.txt

正如之前所提到的,这些操作都是可以恢复的,因为git是版本控制系统,所以自然而然的就会有一套版本历史管理机制。

查看commit历史

工具git log提供了查看git镜像的commit历史:

$ git log
commit 7d819818530ce89322019ba5000723c973eb0420
Author: ghosTM55
Date:   Sun Mar 14 15:26:22 2010 +0800

     deleted a file

commit 55ce30d88fb5c81d20bdf86e2034053613fed632
Author: ghosTM55
Date:   Sun Mar 14 15:11:39 2010 +0800

    renamed a file

commit 2ed9f1f9bd1a7561cd7e57dcdbd7f2cda54668fb
Author: ghosTM55
Date:   Sun Mar 14 14:58:11 2010 +0800

    a little change

commit dde0bab46a9d9f29c50d2996a9efe20253be9f15
Author: ghosTM55
Date:   Sun Mar 14 14:28:48 2010 +0800

    新文件来了,旧文件改了

commit c06c4e5ebc3a5281a3400c31c20e95ebd43f1547
Author: ghosTM55
Date:   Sun Mar 14 13:36:02 2010 +0800

    第一次提交

可以看到,git详细记录了每次commit的信息(checksum值、提交者信息、提交时间)。

获取命令帮助

本(系列)文只是guide,不是manual,所以不会为读者详细解释每一个git命令的使用。当读者想要详细了解某命令的使用时,学会自己阅读git自带的manual文件是关键。

例如,如果你想了解更多有关于git log的使用方法,输入命令:

$ git log help

即可。同样的,你也可以通过google等方法获取更多有关git的使用技巧!

总结

本文是git入门与实践系列的第一篇,对git进行了最为基础的介绍与入门引导,在以后的文章中,我会为大家进一步讲解git的应用与技巧。尽请期待!

时间: 2024-10-26 11:53:09

git入门与实践【转】的相关文章

[收藏学习]Ubuntu Git入门学习

考虑到CVS的一些局限性,最近和同事在公司推行Git.     其实,如果推行SVN的化,可能推行的难度会降低很多.不过lark说既然推行一个新的版本管理工具,总要花费一定的时间进行培训.部署.转换.而推行Git和SVN的代价不如想象中差距那么大.因此,不如就多花些精力推行Git , 可以带来更多的好处. 这个想法说服了我. 然后就开始筹备了. 我发现网上很多git教程对一些基础命令(比如git-reset)的介绍还是不够清楚.另外,介绍git1.5的少,介绍git1.4的多.此外,对于如何基于

《C++程序设计入门同步实践宝典 》可以下载了

<C++程序设计入门同步实践宝典>可以告一段落了.这是假期计划之外的事情,不小心又花了近二十天的时间,其他计划中的事情得一一落实了.将此版定为0.5版,以后还会有不小的改动. 下载地址:http://download.csdn.net/detail/sxhelijian/4482514 下载需要资源分5分,以对自己辛苦一番有所表示.常在CSDN泡的同学,也应该分享些你的原创挣点积分了.缺少积分的穷孩子,也可以给我留言,提供Email寄过去. 发个封皮: 有人提出上目录,好主意: 完工后写的前言

安装 Git的方法之git入门笔记

gif入门基础 那么,简单地说,Git 究竟是怎样的一个系统呢?请注意,接下来的内容非常重要,若是理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余.在开始学习 Git 的时候,请不要尝试把各种概念和其他版本控制系统(诸如 Subversion 和 Perforce 等)相比拟,否则容易混淆每个操作的实际意义.Git 在保存和处理各种信息的时候,虽然操作起来的命令形式非常相近,但它与其他版本控制系统的做法颇为不同.理解这些差异将有助于你准确地使用 Git 提供的各种工具. 直接

Oracle PL/SQL入门案例实践_oracle

正在看的ORACLE教程是:Oracle PL/SQL入门案例实践. 前面已经了解了关于PL/SQL编程的基础,本文将结合一个案例来加深对这些知识点的理解. 一. 案例介绍 某数据库有两张表,是关于某公司员工资料.薪水和部门信息的,它们分别是emp表和dept表,两张表的结构如下: 要求如下: 1.按照上表结构建立相应的表,并每张表写入5组合法数据. 2.操纵相关表,使得"技术部"的员工的薪水上涨20%. 3.建立日志,追踪薪水变动情况. 4.建立测试包. 二. 案例的分析与实现 从前

Storm实时计算:流操作入门编程实践

Storm是一个分布式是实时计算系统,它设计了一种对流和计算的抽象,概念比较简单,实际编程开发起来相对容易.下面,简单介绍编程实践过程中需要理解的Storm中的几个概念: Topology Storm中Topology的概念类似于Hadoop中的MapReduce Job,是一个用来编排.容纳一组计算逻辑组件(Spout.Bolt)的对象(Hadoop MapReduce中一个Job包含一组Map Task.Reduce Task),这一组计算组件可以按照DAG图的方式编排起来(通过选择Stre

Linux系统中git 入门教程

  Git 起源 同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代.Linux 内核开源项目有着为数众广的参与者.绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间).到 2002 年,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维护代码.到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了免费使用 BitKeeper 的权力.这就迫使 Linux

Akka入门编程实践

Akka是使用Scala语言开发一个编程库,基于事件驱动的架构实现异步处理,它能够简化编写分布式应用程序.Akka中最核心的概念是Actor模型,它为编写分布式/并行计算应用程序提供了高层次抽象,在实际编程实践中,开发人员可以从对复杂网络通信细节的处理.多线程应用场景下对锁的管理中解脱出来. Akka能够给应用程序带来的几个重要的特性是: 容错性 可伸缩性 异步性 事件驱动架构(EDA) 远程透明性 Actor是Akka中最核心的组件,以至于我们在编写基于Akka的应用程序时,大部分时间都会和A

git 入门宝典

目录:     git 简介    git 安装    git的基本构成    git的基本操作        基本命令        vi命令        创建版本库        添加文件        提交文件        查看状态        查看提交日志        查看更改对比        版本回滚        撤销操作        删除操作    远程仓库        认识github        克隆远程仓库        推送与拉取    分支        

【亚马逊AWS】入门级别实践

本文禁止转载!本文禁止转载!本文禁止转载! 本文地址 http://blog.csdn.net/diandianxiyu_geek/article/details/44096427 一.安全级别的设置 密码策略页面已经被重命名为帐户设置.点击帐户设置找到你的帐户的密码策略和其他配置选项. 密码策略是一组定义密码的IAM用户可以设置的类型规则.有关密码策略的详细信息,请访问使用IAM管理密码. 目前,该AWS帐号没有密码策略.下面指定的密码策略. https://aws.amazon.com/cn