`

git学习

    博客分类:
  • git
阅读更多

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

1.Git 与 SVN 区别

GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。

如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。

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哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

2.Git的安装配置。

Git 各平台安装包下载地址为:http://git-scm.com/downloads

3.Git的工作流程

一般工作流程如下:

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

4.Git工作区,暂存区和版本库

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫stage, 或index。一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。

图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。

当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。

当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

5.Git 基本操作

git init

用 git init 在目录中创建新的 Git 仓库。在目录中执行 git init,就可以创建一个 Git 仓库了。比如我们创建 runoob 项目:

 

$ mkdir runoob
$ cd runoob/
$ git init
Initialized empty Git repository in /Users/tianqixin/www/runoob/.git/
# 在 /www/runoob/.git/ 目录初始化空 Git 仓库完毕

git clone使用 git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。执行命令:

 

 

 git clone [url]

[url] 为你想要复制的项目,就可以了。

 

例如我们克隆 Github 上的项目:

$ git clone git@github.com:schacon/simplegit.git
Cloninginto'simplegit'...
remote:Counting objects:13,done.
remote:Total13(delta 0), reused 0(delta 0), pack-reused 13Receiving objects:100%(13/13),done.Resolving deltas:100%(2/2),done.Checking connectivity...done.

默认情况下,Git 会按照你提供的 URL 所指示的项目的名称创建你的本地项目目录。 通常就是该 URL 最后一个 / 之后的项目名称。如果你想要一个不一样的名字, 你可以在该命令后加上你想要的名称。

基本快照

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

 

git add

git add 命令可将该文件添加到缓存,如我们添加以下两个文件:

$ touch README
$ touch hello.php
$ ls
README		hello.php
$ git status -s
?? README
?? hello.php
$ 

git status 命令用于查看项目的当前状态。

接下来我们执行 git add 命令来添加文件:

$ git add README hello.php 

现在我们再执行 git status,就可以看到这两个文件已经加上去了。

$ git status -s
A  README
A  hello.php
$ 

新项目中,添加所有文件很普遍,我们可以使用 git add . 命令来添加当前项目的所有文件。

现在我们修改 README 文件:

$ vim README
<pre><p> README 添加以下内容:<b>#RunoobGit测试</b>,然后保存退出。</p><p>再执行一下 git status:</p>
$ git status -s
AM README
A  hello.php

"AM" 状态的意思是,这个文件在我们将它添加到缓存之后又有改动。改动后我们在执行 git add 命令将其添加到缓存中:

$ git add .
$ git status -s
A  README
A  hello.php

当你要将你的修改包含在即将提交的快照里的时候,需要执行 git add。

git status

git status 以查看在你上次提交之后是否有修改。

我演示该命令的时候加了 -s 参数,以获得简短的结果输出。如果没加该参数会详细输出内容:

$ git status
On branch master

Initial commit

Changes to be committed:(use"git rm --cached <file>..." to unstage)new file:   README
	new file:   hello.php

git diff

执行 git diff 来查看执行 git status 的结果的详细信息。

git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。git diff 有两个主要的应用场景。

  • 尚未缓存的改动:git diff
  • 查看已缓存的改动: git diff --cached
  • 查看已缓存的与未缓存的所有改动:git diff HEAD
  • 显示摘要而非整个 diff:git diff --stat

在 hello.php 文件中输入以下内容:

<?php
echo '菜鸟教程:www.runoob.com';?>
$ git status -s
A  README
AM hello.php
$ git diff
diff --git a/hello.php b/hello.php
index e69de29..69b5711100644--- a/hello.php
+++ b/hello.php
@@-0,0+1,3@@+<?php
+echo '菜鸟教程:www.runoob.com';+?>

git status 显示你上次提交更新后的更改或者写入缓存的改动, 而 git diff 一行一行地显示这些改动具体是啥。

接下来我们来查看下 git diff --cached 的执行效果:

$ git add hello.php 
$ git status -s
A  README
A  hello.php
$ git diff --cached
diff --git a/README b/README
new file mode 100644
index 0000000..8f87495---/dev/null+++ b/README
@@-0,0+1@@+#RunoobGit测试
diff --git a/hello.php b/hello.php
new file mode 100644
index 0000000..69b5711---/dev/null+++ b/hello.php
@@-0,0+1,3@@+<?php
+echo '菜鸟教程:www.runoob.com';+?>

git commit

使用 git add 命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中。

Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址。

$ git config --global user.name 'runoob'
$ git config --global user.email test@runoob.com

接下来我们写入缓存,并提交对 hello.php 的所有改动。在首个例子中,我们使用 -m 选项以在命令行中提供提交注释。

$ git add hello.php
$ git status -s
A  README
A  hello.php
$ $ git commit -m '第一次版本提交'[master (root-commit) d32cf1f]第一次版本提交2 files changed,4 insertions(+)
 create mode 100644 README
 create mode 100644 hello.php
 

现在我们已经记录了快照。如果我们再执行 git status:

$ git status
# On branch master
nothing to commit (working directory clean)

以上输出说明我们在最近一次提交之后,没有做任何改动,是一个"working directory clean:干净的工作目录"。

如果你没有设置 -m 选项,Git 会尝试为你打开一个编辑器以填写提交信息。 如果 Git 在你对它的配置中找不到相关信息,默认会打开 vim。屏幕会像这样:

# Please enter the commit message for your changes. Lines starting# with '#' will be ignored, and an empty message aborts the commit.# On branch master# Changes to be committed:#   
(use "git reset HEAD <file>..." to unstage)## modified:   hello.php#~~".git/COMMIT_EDITMSG"9L,257C

如果你觉得 git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步。命令格式如下:

git commit -a

我们先修改 hello.php 文件为以下内容:

<?php
echo '菜鸟教程:www.runoob.com';
echo '菜鸟教程:www.runoob.com';?>

再执行以下命令:

git commit -am '修改 hello.php 文件'[master 71ee2cb]修改 hello.php 文件1 file changed,1 insertion(+)

git reset HEAD

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

我们先改动文件 README 文件,内容如下:

# Runoob Git 测试# 菜鸟教程 

hello.php 文件修改为:

<?php
echo '菜鸟教程:www.runoob.com';
echo '菜鸟教程:www.runoob.com';
echo '菜鸟教程:www.runoob.com';?>

现在两个文件修改后,都提交到了缓存区,我们现在要取消其中一个的缓存,操作如下:

$ git status -s
 M README
 M hello.php
$ git add .
$ git status -s
M  README
M  hello.pp
$ git reset HEAD -- hello.php 
Unstaged changes after reset:
M	hello.php
$ git status -s
M  README
 M hello.php

现在你执行 git commit,只会将 README 文件的改动提交,而 hello.php 是没有的。

$ git commit -m '修改'[master f50cfda]修改1 file changed,1 insertion(+)
$ git status -s
 M hello.php

可以看到 hello.php 文件的修改并为提交。

这时我们可以使用以下命令将 hello.php 的修改提交:

$ git commit -am '修改 hello.php 文件'[master 760f74d]修改 hello.php 文件1 file changed,1 insertion(+)
$ git status
On branch master
nothing to commit, working directory clean

简而言之,执行 git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的缓存。

git rm

git rm 会将条目从缓存区中移除。这与 git reset HEAD 将条目取消缓存是有区别的。 "取消缓存"的意思就是将缓存区恢复为我们做出修改之前的样子。

默认情况下,git rm file 会将文件从缓存区和你的硬盘中(工作目录)删除。

如果你要在工作目录中留着该文件,可以使用 git rm --cached

如我们删除 hello.php文件:

$ git rm hello.php 
rm 'hello.php'
$ ls
README

不从工作区中删除文件:

$ git rm --cached README 
rm 'README'
$ ls
README

git mv

git mv 命令做得所有事情就是 git rm --cached 命令的操作, 重命名磁盘上的文件,然后再执行 git add 把新文件添加到缓存区。

我们先把刚移除的 README 添加回来:

$ git add README 

然后对其重名:

$ git mv README  README.md
$ ls
README.md

 

Git 分支管理

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

有人把 Git 的分支模型称为"必杀技特性",而正是因为它,将 Git 从版本控制系统家族里区分出来。

创建分支命令:

git branch (branchname)

切换分支命令:

git checkout (branchname)

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。

合并分支命令:

git merge 

你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。


Git 分支管

分享到:
评论

相关推荐

    字节跳动&lt;Git学习手册&gt;

    ### 字节跳动《Git学习手册》核心知识点详解 #### 一、Git基础概念与原理 **Git** 是一种分布式版本控制系统,它可以帮助开发者高效地管理项目代码的变更历史。相较于传统的集中式版本控制系统(如SVN),Git具有...

    Git学习指南完整版

    书籍的内容提要表明,它旨在为专业开发者提供一本全面的Git学习资源,不仅关注于理论知识的介绍,更注重于实际操作和技巧的传授。全书分为多个章节,每个章节对应Git学习的一个方面,从基础知识开始,逐步深入,直至...

    Git学习笔记干货

    Git学习笔记干货 Git 是什么? Git 是目前世界上最先进的分布式版本控制系统。版本控制系统是指一种记录、跟踪和管理代码变动的系统。Git 的出现解决了手动管理多个“版本”的问题,使得多人协作编辑变得更加方便。...

    git学习的PDF

    Git学习的PDF包含的是Git的基本操作和常用命令的速查表,非常适合初学者快速上手和进阶者巩固知识。下面将详细阐述Git的核心概念、基本操作以及在实际开发中的应用。 一、Git核心概念 1. 工作区:电脑上的项目目录...

    Git学习笔记目标规划

    Git学习笔记目标规划,大学学习可以用到,也可以用于自我检测

    我的Git学习笔记

    我的Git学习心得记录,根据廖老师的教程学习记录,希望对你有帮助

    Git学习思维导图

    GIT学习思维导图,一张图轻松学会Git

    git学习总结文档,

    git学习,总结,个人实践+廖雪峰老师文档总结。

    Git学习资料

    这份“Git学习资料”包含两份文档:`git操作指南.pdf`和`GitBook.pdf`,它们将帮助你深入理解Git的核心概念、基本操作以及高级用法。 一、Git核心概念 1. **仓库(Repository)**:Git仓库是存储所有版本信息的地方...

    git 学习_思维导图_git学习_源码

    这份"git 学习_思维导图_git学习_源码"的压缩包文件,显然是一个以思维导图形式整理的Git学习资源,帮助用户系统地理解和掌握Git的基本操作和高级功能。 在Git的世界里,学习首先应从基本概念入手,例如了解仓库...

    git学习手册

    这份"git学习手册"将引领你从零基础入门,逐步掌握Git的精髓,直至成为Git的熟练使用者。 首先,Git的核心概念包括仓库(Repository)、提交(Commit)、分支(Branch)和合并(Merge)。仓库是Git中存储所有版本...

    git学习笔记.zip|git学习笔记.zip

    在“git学习笔记”中,我们通常会涵盖以下几个核心知识点: 1. **Git安装与配置**:首先,我们需要了解如何在不同的操作系统(如Windows、MacOS或Linux)上安装Git,并设置用户信息,包括用户名和邮箱,这些信息会...

    git学习笔记

    ### Git学习笔记 #### 一、Git概述与配置 **Git**是一种分布式版本控制系统,用于追踪计算机文件的更改,并协调由多人共同开发的项目。它最初由Linus Torvalds于2005年创建,旨在支持Linux内核的开发。 - **Git...

    progit.pdf--git学习教程

    《ProGit.pdf--git学习教程》是Scott Chacon和Ben Straub共同编写的关于Git版本控制系统的官方学习指南。本教程涵盖了Git的基本概念、工作流程、配置、分支管理、远程仓库操作、服务器部署、分布式工作模式、GitHub...

    git学习官方文档

    这份“git学习官方文档”提供了一个全面的指南,帮助你深入理解Git的基本概念、命令及其用法。 首先,Git的核心概念包括仓库(Repository)、工作目录(Working Directory)、暂存区(Index)和提交(Commit)。...

    git学习笔记(git学习笔记).md

    git学习笔记(git学习笔记).md

    git学习基础教程

    本文将基于"git学习基础教程"的标题和描述,详细阐述Git的基本概念、核心功能和常用操作,帮助初学者快速入门。 首先,Git是Linus Torvalds为Linux内核开发而创建的,其主要目标是提高版本控制的效率和可靠性。Git...

    Git学习de.pdf

    ### Git学习de.pdf知识点概述 #### 一、Git基础概念 - **版本管理工具**:Git作为一种分布式的版本管理工具,能够记录每一次的修改,并允许用户随时找回之前任何时间点的状态。 - **工作区**:指代实际进行开发...

    git学习资料

    本文将详细阐述Git的学习资料,包括起步,基础操作,分支管理,服务器上的Git,分布式Git的工作流程以及相关的工具使用。 首先,Git的基础概念需要掌握。版本控制系统分为三种类型:本地版本控制系统,集中化的版本...

    Git权威指南 (git学习权威书籍)

    Git是分布式版本控制系统的一种,由Linus Torvalds在2005年为Linux内核开发而创建。它被广泛用于软件开发,特别是在开源社区,因其高效、灵活和强大的特性而备受推崇。Git允许开发者追踪代码的历史变化,协同工作,...

Global site tag (gtag.js) - Google Analytics