git

Git 基础要点:

1、直接快照,而非比较差异:

(首先再次明确一个版本管理工具的概念:以版本号为基础索引视图)

svn在版本对应处存储的是文件修改差异,而Git不保存差异数据,而是对所有文件作一快照,然后保存一个指向这次快照的索引。

*那么,快照的概念是什么?是复制一个文件么?这样应该很耗存储空间吧?

*问题:本地除了最新版本代码,是否有历史版本的代码(为了在不联网时查看历史修改记录)?

2、近乎所有操作都可本地执行

Git在本地磁盘上保存着所有有关当前项目的历史更新,处理起来速度飞快。--(空间换时间

Git可以在本地取出一个月前的快照和当前文件作一次差异运算。

*快照占用存储空间如何?差异运算?

3、时刻保持数据完整性

4、多数操作仅添加数据

就算删除数据,都不会丢失数据。

5、三种状态

重要概念:对任何一个文件,在git内部只有三种状态:已修改(modified),已暂存(staged)和已提交(committed)。

已修改表示修改了某个文件,但还没有提交保存;

已暂存表示把已修改的文件放在下次提交时要保存的清单中。

已提交表示该文件已经被安全地保存在本地数据库中了;

 

由此,文件流转的三个工作区域:工作目录,暂存区域和本地数据目录。

 

每个项目都有一个git目录,它是git用来保存元数据和对象数据库的地方。每次克隆镜像仓库的时候,实际copy的就是这个目录里面的数据。

 

从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从git目录中的压缩对象数据库中提取出来的。

---page 9--- 

page 10 安装git (可以从源代码安装)

page 12 配置git

$git config --system     对应文件/etc/gitconfig   系统中所有用户

$git config --global       对应文件~/.gitconfig     该用户

$git config 工作目录下使用此无选项命令,设置的是工作目录中的.git/config,仅针对前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config里的配置会覆盖/etc/gitconfig中的同名变量

用户信息:配置用户名称和电子邮件地址,这两条配置很重要,每次git提交时都会引用这两条信息,说明是谁提交了更新

$git config --global user.name "John Doe"

$git config --global uer.email [email protected]

文本编辑器:默认会使用操作系统指定的默认编辑器,一般可能会是Vi或Vim。如果有其他偏好,比如emacs

$git config --global core.editor emacs

差异分析工具(具体见第7章)

$git config --global merge.tool vimdiff

git可以理解kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,opendiff

查看配置信息

$git config --list

有时会看到重复的变量名,那就说明它们来自不同配置文件,不过最终git实际采用的是最后一个。

查看某个环境变量的设定

$git confg user.name

获取帮助 方法有三

$git help <verb>

$git <verg> --help

$man git-<verb>

比如学习config命令如何用:

$git help config

--------------------------------------------------------

Git 基础

如何初始化一个新的代码仓库,做一些适当的配置;开始或停止跟踪某些文件;暂存或提交某些更新

如何忽略某些文件或是名称符合特定模式的文件;如何既快且容易地撤销犯下的小错误;

如何浏览项目的更新历史,查看某两次更新之间的差异;

如何从远程仓库拉数据下来或者推数据上去。

取得项目的git仓库

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

从当前目录初始化:要对现有的某个项目开始用git管理,在项目所在的目录执行:

$git init 

$git add *.c

$git add README

$git commit -m "initial project version"

从现有仓库克隆:比如想对某个开源项目出一份力

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

这会在当前目录下创建一个名为"grit"的目录,其中内含一个.git目录。

如果在克隆的时候,自己要定义新建项目目录名称,可以命令最后指定:

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

检查当前文件状态:

$git status

#Not currently on any branch.

nothing to commit(working directory clean)

表示:当前没有任何跟踪着的文件,也没有任何文件在上次提交后更改过,当前目录下没有出现任何处于未跟踪的新文件。

跟踪新文件

$git add README

$git status

如果文件在Changes to be committed这行下面,就说明是已暂存状态。

修改已经跟踪过的文件

$git status

如果文件在Changed but not updated这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。要暂存这次更新,需要运行git add命令(此命令根据目标文件的状态不同,效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并是把有冲突的文件标记为已解决状态等)。

忽略某些文件

$cat .gitignore

*.[oa]

*~

第一行告诉git忽略所有以.o或.a结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。

第二行告诉git忽略所有以波浪符结尾的文件,许多编辑软件都用这样的文件名保存副本。

文件.gitignore的格式规范如下:

所有空行或者认注释符号#开头的行都会被git忽略

可以使用标准的glob模式匹配

匹配模式最后跟反斜杠(/)说明要忽略的是目录

要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反

例子:

#此为注释-将被git忽略

*.a  #忽略所有.a结尾的文件

!lib.a  #但lib.a除外

/TODO  #仅仅忽略项目根目录下的TODO文件,不包括subdir/TODO

build/  #忽略build/目录下的所有文件

doc/*.txt  #会忽略doc/notes.txt 但不包括doc/server/arch.txt

 

查看已暂存和未暂存的更新

要查看尚未暂存的文件更新了哪些部分,不加参数直接输入git diff

此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。

若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用git diff --cached命令。

 

提交更新

$git commit

 

跳过使用暂存区域

git commit -a -m "..."

移除文件

从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。

---page 24---

 

 

你可能感兴趣的:(git)