git基础指南

来源:互联网 发布:redis消息队列 php 编辑:程序博客网 时间:2024/06/03 14:01

git基础指南

@(OTHERS)[others, git]

  • git基础指南
  • 一基本原理
    • 一概述
    • 二git文件的三种状态
  • 二基本操作
    • 一取得项目的Git 仓库
      • 1从当前目录初始化
      • 从现有仓库克隆
    • 二提交代码
    • 三远程仓库
      • 1查看当前的远程库
      • 2添加远程仓库从远程仓库抓取数据
      • 3推送数据到远程仓库
      • 4查看远程仓库信息
      • 5远程仓库的删除和重命名
    • 四查看提交历史
  • 三常用操作
    • 一参与开源项目
    • 二gitlab项目
    • 三将现有代码上传
    • 三常用分支操作
      • 查看所有分支
      • 创建本地新的dev分支
      • 发布dev分支
      • 在dev分支开发代码
      • 删除分支
      • 6checkout某一个历史版本

注:git有很完善的官方文档,同时有中文版,但版本较旧。

一、基本原理

(一)概述

1、在分布式的版本控制系统中,诸如Git,Mercurial,Bazaar 还有Darcs 等,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。

2、Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一连接。

3、在Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用CVCS 的话,差不多所有操作都需要连接网络。因为Git 在本地磁盘上就保存着所有有关当前项目的历史更新,所以处理起来速度飞快。

(二)git文件的三种状态

对于任何一个文件,在Git 内都只有三种状态:已修改(modified),已暂存(staged)和已提交(committed)。已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中;已提交表示该文件已经被安全地保存在本地数据库中了。
由此我们看到Git 管理项目时,文件流转的三个工作区域:Git 的本地数据目录,工作
目录以及暂存区域。
image
每个项目都有一个git 目录,它是Git 用来保存元数据和对象数据库的地方。该目录非
常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。
所谓的暂存区域只不过是个简单的文件,一般都放在git 目录中。有时候人们会把这个
文件叫做索引文件,不过标准说法还是叫暂存区域。
基本的Git 工作流程如下所示:
1. 在工作目录中修改某些文件。(git clone后修改文件)
2. 对这些修改了的文件作快照,并保存到暂存区域。(git add)
3. 提交更新,将保存在暂存区域的文件快照转储到git 目录中。(git commit)

所以,我们可以从文件所处的位置来判断状态:如果是git 目录中保存着的特定版本文
件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。

二、基本操作

(一)取得项目的Git 仓库

有两种取得Git 项目仓库的方法。第一种是在现存的目录下,通过导入所有文件来创建
新的Git 仓库。第二种是从已有的Git 仓库克隆出一个新的镜像仓库来。

1、从当前目录初始化

要对现有的某个项目开始用Git 管理,只需到此项目所在的目录,执行:

$ git init

初始化后,在当前目录下会出现一个名为.git 的目录,所有Git 需要的数据和资源都
存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。
如果当前目录下有几个文件想要纳入版本控制,需要先用git add 命令告诉Git 开始对
这些文件进行跟踪,然后提交:

$ git add *.c$ git add README$ git commit -m 'initial project version'

现在,你已经得到了一个实际维护着若干文件的Git 仓库。

2 从现有仓库克隆

如果想对某个开源项目出一份力,可以先把该项目的Git 仓库复制一份出来,这就需要
用到git clone 命令。如果你熟悉其他的VCS 比如Subversion,你可能已经注意到这里
使用的是clone 而不是checkout。这是个非常重要的差别,Git 收取的是项目历史的所有
数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了。实际上,即便服务器的磁盘发生故障,用任何一个克隆出来的客户端都可以重建服务器上的仓库,回到当初克隆时的状态。
克隆仓库的命令格式为git clone [url]。比如,要克隆Ruby 语言的Git 代码仓库
Grit,可以用下面的命令:

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

这会在当前目录下创建一个名为“grit” 的目录,其中内含一个.git 的目录,并从同
步后的仓库中拉出所有的数据,取出最新版本的文件拷贝。如果进入这个新建的grit 目
录,你会看到项目中的所有文件已经在里边了,准备好后续的开发和使用。如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令最后指定:

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

唯一的差别就是,现在新建的目录成了mygrit,其他的都和上边的一样。
Git 支持许多数据传输协议。之前的例子使用的是git:// 协议,不过你也可以用
http(s):// 或者user@server:/path.git 表示的SSH 传输协议。

(二)提交代码

1、检查当前状态

git status

2、跟踪新文件或者暂存文件

git add .

暂存这次更新,需要运行git add 命令(这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等)。

3、忽略某些文件
创建.gitignore文件

4、查看差异

git diff

此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用

git diff --cached

命令。(Git 1.6.1 及更高版本还允许使用git diff –staged,效果是相同的,但更好记
些。)

5、提交

git commit -m "comment"

这个代码就被提交到本地仓库了。

6、删除文件

git rm *.txt

(三)远程仓库

1、查看当前的远程库

git remotegit remote -v

一般默认的远程仓库命名为origin,默认的分支名称为master。

2、添加远程仓库&从远程仓库抓取数据

$ git remoteorigin$ git remote add pb git://github.com/paulboone/ticgit.git$ git remote -v$ git fetch pb

如果是克隆了一个仓库,此命令会自动将远程仓库归于origin 名下。所以,git fetch
origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次fetch 以
来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
如果设置了某个分支用于跟踪某个远端仓库的分支(参见下节及第三章的内容),可以使用git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认情况下git clone 命令本质上就是自动创建了本地的master 分支用于跟踪远程仓库中的master 分支(假设远程仓库确实有master 分支)。所以一般我们运行git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中当前分支。

3、推送数据到远程仓库

项目进行到一个阶段,要同别人分享目前的成果,可以将本地仓库中的数据推送到远程
仓库。实现这个任务的命令很简单: git push [remote-name] [branch-name]。如果要把本地的master 分支推送到origin 服务器上(再次说明下,克隆操作会自动使用默认的
master 和origin 名字),可以运行下面的命令:

$ git push origin master

4、查看远程仓库信息

我们可以通过命令git remote show [remote-name] 查看某个远程仓库的详细信息,比
如要看所克隆的origin 仓库,可以运行:

git remote show origin

5、远程仓库的删除和重命名

$ git remote rename pb paul$ git remote rm paul

(四)查看提交历史

1、git log可以查看基本的信息,如

$ git logcommit 49d14429375bf9b4be29be603eaa22e6287ce1deAuthor: jinhong-lu <lu_Jin_hong@163.com>Date:   Tue Oct 13 17:33:18 2015 +0800    testcommit d79066da60cd1a6721acc0ea3336b4b8a84f85beAuthor: jinhong-lu <lu_Jin_hong@163.com>Date:   Tue Oct 13 14:12:32 2015 +0800    new

默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上
面。看到了吗,每次更新都有一个SHA-1 校验和、作者的名字和电子邮件地址、提交时
间,最后缩进一个段落显示提交说明。
git log 有许多选项可以帮助你搜寻感兴趣的提交,接下来我们介绍些最常用的。

2、git log –p -2

git log 有许多选项可以帮助你搜寻感兴趣的提交,接下来我们介绍些最常用的。
我们常用-p 选项展开显示每次提交的内容差异,用-2 则仅显示最近的两次更新.

在做代码审查,或者要快速浏览其他协作者提交的更新都作了哪些改动时,就可以用这个选项。

3、git log –stat,仅显示简要的增改行数统计

4、指定log的格式

git log --pretty=format:"%h - %an, %ar : %s"ca82a6d - Scott Chacon, 11 months ago : changed the verison number085bb3b - Scott Chacon, 11 months ago : removed unnecessary test codea11bef0 - Scott Chacon, 11 months ago : first commit

5、完整选项:

选项说明-p 按补丁格式显示每个更新之间的差异。--stat 显示每次更新的文件修改统计信息。--shortstat 只显示--stat 中最后的行数修改添加移除统计。--name-only 仅在提交信息后显示已修改的文件清单。--name-status 显示新增、修改、删除的文件清单。--abbrev-commit 仅显示SHA-1 的前几个字符,而非所有的40 个字符。--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。--graph 显示ASCII 图形表示的分支合并历史。--pretty 使用其他格式显示历史提交信息。可用的选项包括oneline,short,full,fuller 和format(后跟指定格式)。

详见官方文档。

三、常用操作

(一)参与开源项目

$git clone https://github.com/lujinhong/dao.git$vi pom.xml$git add .$git commit -m "change version"[master 8ed26de] change version 1 file changed, 1 insertion(+), 1 deletion(-)$ git push origin master

(二)gitlab项目

1、在web页面上创建一个项目并取得URL

2、git clone后操作如同上面

其实更好的办法是使用IDE。

(三)将现有代码上传

git initgit remote add origin ssh://git@192.168.1.1:22/ljhn1829/lujinhong.gitgit add .git commit -m 'new'git push origin master

或者也可以clone以后再将当前代码add进来,然后push。

(三)常用分支操作

1. 查看所有分支

git branch --all  # 默认只有master分支,所以会看到如下两个分支# master[本地主分支] origin/master[远程主分支]# 新克隆下来的代码默认master和origin/master是关联的,也就是他们的代码保持同步

2. 创建本地新的dev分支

git branch dev  # 创建本地分支git branch  # 查看分支# 这是会看到master和dev,而且master上会有一个星号# 这个时候dev是一个本地分支,远程仓库不知道它的存在# 本地分支可以不同步到远程仓库,我们可以在dev开发,然后merge到master,使用master同步代码,当然也可以同步

3. 发布dev分支

发布dev分支指的是同步dev分支的代码到远程服务器

git push origin dev:dev  # 这样远程仓库也有一个dev分支了

4. 在dev分支开发代码

git checkout dev  # 切换到dev分支进行开发# 开发代码之后,我们有两个选择# 第一个:如果功能开发完成了,可以合并主分支git checkout master  # 切换到主分支git merge dev  # 把dev分支的更改和master合并git push  # 提交主分支代码远程git checkout dev  # 切换到dev远程分支git push  # 提交dev分支到远程# 第二个:如果功能没有完成,可以直接推送git push  # 提交到dev远程分支# 注意:在分支切换之前最好先commit全部的改变,除非你真的知道自己在做什么

5. 删除分支

git push origin :dev  # 删除远程dev分支,危险命令哦# 下面两条是删除本地分支git checkout master  # 切换到master分支git branch -d dev  # 删除本地dev分支

6、checkout某一个历史版本

git loggit checkout -b redis2 a8e55ff906b3917dcd0125f497fa009f49b6c3b2

将a8e55ff906b3917dcd0125f497fa009f49b6c3b2这个历史commit checkout到一个新的branch redis2。

原创粉丝点击