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---