概念上来区分,其它大部分系统以文件变更列表的方式存储信息. 这类系统(CVS、Subversion、Perforce、Bazaar等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。 Git 更像是把数据看作是对小型文件系统的一组快照。每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。Git 对待数据更像是一个快照流。
在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。 使用其它系统,做到如此是不可能或很费力的。 比如,用 Perforce,你没有连接服务器时几乎不能做什么事;用 Subversion和CVS,你能修改 文件,但不能向数据库提交修改(因为你的本地数据库离线了)。
Git 中所有数据在存储前都计算校验和,然后以校验和来引用。若你在传送过程中丢失信息或损坏 文件,Git 就能发现。 Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。
这是一个由 40 个十六进制字符(0-9 和 a-f)组 成字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:
24b9da6552252987aa493b52f8696cd6d3b00373
你执行的 Git 操作,几乎只往 Git 数据库中增加数据。 很难让 Git 执行任何不可逆操作,或者让它以任何方式清 除数据。
已提交(committed)
:数据已经安全的保存在本地数据库中已修改(modified)
:修改了文件,但还没保存到数据库中已暂存(staged)
:对已修改的文件的当前版本做了标记,使它包含在下次提交的快照中Git项目的三个工作区域:Git仓库
,工作目录
,暂存区域
三个工作区域
使用git config
工具来帮助控制Git外观和行为。
当安装完 Git 应该做的第一件事就是设置你的用户名称
与邮件地址
。每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:
git config --global user.name 你的姓名
git config --global user.email 你的邮箱
例如:
git config --global user.name "John Doe" git config --global user.email johndoe@example.com
git config --list
:列出所有Git当前能找到的配置
列出所有Git配置
git config <key>
:通过指定的方式查看某一项
指定查看用户名
合理使用git自带的帮助文档,可以解决大部分的问题
例如git help config
还有其他方式找到Git命令的使用手册。
git help git- -help man git-
有两种方式开始Git的学习:在现有项目或目录下用Git进行管理
,从服务器克隆一个现有的Git仓库
使用git init
就可以初始化一个空的Git仓库
初始化仓库
其中.git文件夹中包含了初始化Git仓库中所有的必须文件,这些文件是Git仓库的骨干。
以我在GitHub上的一个项目为例:https://github.com/zx490336534/spider-review。
输入url地址打开页面后点击Clone or download
把弹出框中的地址复制出来:https://github.com/zx490336534/spider-review.git
克隆
在本地找一个文件夹
git clone https://github.com/zx490336534/spider-review.git
克隆到本地
这样克隆会自动在当前目录下新建一个项目同名的文件夹,也可以自定义一个名称
git clone https://github.com/zx490336534/spider-review.git 666
克隆文件至自定义的地方
文件的状态变化周期
这一小节的目标的学会这一个文件的状态变化周期图
从最上方的箭头开始
Add the file
:从Untracked指向Staged,也就是从未跟踪到暂存区,需要学会git status和git add两个指令
首次新建的文件都是untracked状态(未跟踪),此时需要git add
到暂存区,Git便会在暂存区中生成一个该文件的索引。
touch README.md
git add README.md
git status
img
touch README.md
:创建一个名为README.md的文件,对应Untracked对象的创建
git add README.md
:把新建的README.md文件提交到暂存区,对应Add the file
git status
:查看文件处于什么状态
从上面操作可以看出,如果我新建了一个文件,但是没有使用git add,那么它就还是Untracked,可以结合git status进行试验
Untracked
开始下面一个箭头Edit the file
,但是我们需要一个Unmodified状态的文件,在学习了Add the file流程之后我们拿到了一个Staged状态的文件README.md,从图中可以看出,从Staged变为Unmodified需要经过Commit
流程。
那我们暂时先学习Commit
流程:
提交
使用的语句为git commit -m '描述信息'
git commit -m '从Staged状态变为Unmodified状态'
再使用git status可以看到已经没有之前绿色的语句了(新文件: README.md)
下面返回正题,学习Edit the file
,使用编辑器修改一下README.md文件
修改文件
修改之后使用git status查看文件当前的状态
修改文件
这样就完成了Edit the file
流程了,通过阅读提示信息可以知道,我们要用git add <文件>
更新要提交的内容。从Add the file流程可以看出,git add的作用就是把东西放入Staged(暂存区),所以使用这句指令就完成了Stage the file
流程了
Stage the file流程
最后最后还有一个Remove the file
流程,我们使用上面学过的Commit
流程把README.md文件的状态变成Unmodified
git commit -m '修改README.md'
使用git rm READE.md就能删除处于Unmodified的文件了,可以看到提示信息是绿色的,所以还需要一步commit操作
删除
git commit -m '删除README.md'
删除后查看状态
我们可以用git log查看提交历史,从图中可以看出,我们全部commit操作都被记录了。