以下内容翻译自《progit》一书,加上我个人的一些理解。因为英语水平有限,难免有错。。。
原书的pdf可去下载中心下载。。。
一、关于版本控制系统
记录文件的改变,以便可以回调特殊的版本的系统。
1、本地的版本控制系统
最原始的版本控制就是复制文件到另一个不同的文件夹,一次来与之前的进行区分。但是这样做却很麻烦,而且容易出错。为了解决这一问题,早期的程序员开发了拥有数据库的本地的版本控制系统(VCS)。这个数据库用来保存文件的更改。其中一个有名的VCS是RCS。它保存一个补丁集(补丁指文件之间的不同之处)。通过给文件打上补丁,它可以重新生成任何时刻的文件。
2、集中版本控制系统
在开发的过程中,人们遇到的另一个问题是人们之间需要共同进行开发。像CVS、SVN、Perforce等系统,拥有一个包含所有版本文件的服务器,许多可以从服务器处查看文件的客户端。这方便了人们之间的共同开发,但是也有缺点。如果服务器宕机了,那么在宕机的这段时间内任何的修改都无法保存,甚至若硬盘遭到了所坏,则一切成果都白费。
3、分布式版本控制系统
像Git、Mercurial、Bazaar、Darcs,客户端无需时时从服务器处查看最新的文件,它们映射整个文件仓库(repository)。如果服务器宕机,客户端上的仓库可以用来恢复服务器上的所有文件。分布式版本控制系统不仅可以让你和不同的人同步进行项目开发,而且允许你建立工作流程(workflow)。
二、
理解什么是Git以及Git是如何工作的,对于有效使用Git很有帮助。在学习Git时,试着忘记关于其他VCS的内容,例如SVN和Perforce。因为Git存储信息和其他的系统不同,这么做有助于避免混乱。
Git和其他VCS的主要不同在于对数据的认识不同。其他的版本控制系统将信息作为一个基于文件更改的列表进行存储。它们保存初始文件集以及每一次每一个文件的更改情况。而Git将数据当作是一系列的“快照”。每一次提交,Git都拍了一张那个时候所有文件的“快照”,然后存储一个指向这个快照的引用。为了更加有效,如果文件没有改变,Git不会再一次存储文件,而是只有一个指向前一个已经存储的相同文件的链接。
Git中几乎每一个操作都是本地的。例如为了查看项目的进展状况,Git不需要联网去服务器上获取,它仅仅从本地的数据库中读取,这意味这可以即时地查看项目进展。同时在不联网的情况下,也不时什么都干不了。在没有联网的情况下,可以随时随地地对项目进行修改,然后提交到数据库。
Git是保持数据完整性的。Git在存储前对每个文件都进行检验和运算,然后用检验和来代表那个文件。这意味着不可能在Git不知情的情况下对文件进行修改并保存。Git使用的机制是SHA-1,这是一个由十六进制的字符组成的40个字符串。这些hash值在Git中的很多地方都用到,例如Git存储文件不时通过文件名而是通过hash值。
无论你在Git中做什么操作,通常只是往Git数据库中增加数据,无法删除数据库中的数据。即使做的是删除的操作,也只是往数据库中增加了一个没有那个文件的快照。因此可以对误删的内容进行恢复。这意味着我们可以在Git上尽情地实验而无需担心对文件造成无法撤销的损坏。
树状态
在Git中文件所处的状态有三种:Committed、Modified、Staged。Committed意味着文件被安全地存储在本地数据库。Modified意味着对文件进行了更改但没有提交到数据库。Staged意味着标志了一个当前的版本中修改的文件将要提交到下一个版本。这三种状态带来了Git中三种主要的section:Git directory、Staging area、Working directory。Git directory是Git存储元数据和对象数据库的地方。这也是当你从其他地方克隆一个仓库所存放文件的地方。Working directory是对当前版本进行操作的地方,也就是工作目录。Staging area存储要提交的文件,类似于缓存。
基本的Git工作流程有三个步骤:
1、在Working directory修改文件
2、Stage文件,增加它们的快照到Staging area
3、提交到Git directory,永久保存
三、安装Git
关于安装步骤就不多说了,具体可以看文档。。。
四、配置Git:git config
/etc/gitconfig:系统配置,适用于所有用户,通过传入 --system 参数来设置
~/.gitconfig:某个用户的配置,传入--global参数
.git/config:某个仓库的配置,传入 --local参数
配置身份信息:git config --global user.name "...";git config --global user.email "..."
配置编辑器:git config --global core.editor vim
配置diff工具:git config --global merge.tool vimdiff
列出配置:git config --list
帮助:git help <verb>或man git-<verb>或git <verb> --help
五、新建Git仓库
有两种方法可以新建Git仓库:1、把已有的项目目录载入到Git中。2、克隆已存在的仓库
把已有的项目目录载入到Git中:
1、git init :初始化
2、git add <filename>
3、git commit -m "..."
克隆已存在的仓库:
git clone <url> [project_name]
查看状态:git status [-s]
文件的四种状态:untracked、tracked、modified、staged。
untracked相当于是没有在Git注册的文件的,是“野生的”。traced的即是注册的。modified的顾名思义是修改的,staged是处于staging area的,相当于是缓存的。
通常来说,一开始新建了一个文件是未注册的。通过git status -s可以看到在文件名前有两个“?”。可以用git add注册。这时在查看状态可以看到文件名前第一位为A,第二位为空。第一位代表的就是文件在Staging area中的状态,第二位代表的是文件在Working directory中的状态。这时如果用git commit就可以进行提交,加入到Git数据库中。
如果对这个文件进行了修改,查看状态,可以看到第二位为M,这表示Working directory中的此文件进行了修改,再git add <filename>可以看到第一位变成了M,表示Staging directory中的此文件被修改了。再git commit可进行提交。
也可以使用git commit -a跳过stage文件,直接提交。
.gitignore文件:忽略要stage的文件,使用通配符进行匹配;在路径名后加上“/”表示目录;“!”表示排除某个文件在忽略文件之外。
git diff:查看Working directory中的文件与Staging area中的同一个文件的区别。--cache(或--staged)参数查看Staging area与Git directory中同文件的区别。
git commit:提交文件,若无参数会提示输入message。可指定-m "..." 参数
移除文件:git rm <filename>:从Working directory和Staging area中都移除,再git commit提交。git rm --cached <file>:从Staging area中移除,保留Working directory中文件。通过在后面加"/"可以移除目录。移除含通配符文件需在 * 前加 \ 。
重命名:git mv <filename1> <filename2>。
查看提交日志:git log。-p显示每次提交的差异。--stat显示简要信息。-n:仅显示最近的n次提交。--pretty=format:"%h -%an , %ar : %s'定制要显示的格式。
更多选项请看帮助或文档
六、撤销操作
注意,有些操作并不总是可以撤销
1、修改最后一次提交:git commit --amend。此命令使用当前Staging area的快照提交,会覆盖上一次的提交。
2、撤销Staged的文件:git reset HEAD <file>
3、取消对文件的修改:git checkout -- <file>。注意这条命令执行后对文件的修改都将没有了。
注意,任何已经提交到Git的文件都可以被恢复,即使在已经删除的分支中的提交,或者用--amend重新改写的提交,都可以被恢复,可能丢失的只有还未提交的修改。
七、远程仓库的使用
远程仓库指托管在网络上的项目仓库
git remote:列出每个远程库的名字。在克隆完一个项目后至少可以看到一个名为origin的远程库。-v显示对应的克隆地址
添加远程仓库:git remote add [shortname] <url>;
获取远程仓库中有的,而本地没有的信息。git fetch [shortname]。注意fetch只是获取远端的数据到本地仓库,并不自动合并到当前工作分支。如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用git pull命令自动获取数据下来,然后将远端分支自动合并到本地仓库中当前分支。
推送数据到远程仓库:git push [remote-name] [branch-name]。只有在远端有写权限,或同一时刻没有其他人在推送,才会成功。若在推送前,已经有人推送了若干更新,推送操作就会被驳回,需先把他们的更新抓取到本地,并到自己的项目中才可以推送。
git remote show [remote-name]:查看远端仓库详细信息.
移除本地对应的远端仓库:git remote rm <shortname>
重命名本地对应的远端仓库:git remote rename <shortname1> <shortname2>
八、打标签
列出已有的标签:git tag
新建标签:轻量级标签和含附注的标签
含附注的标签实际上是存储在仓库中的一个独立对象,它有自身的校验和信息等。
创建含附注的标签:git config -a <tag-name>
git tag -s <tag-name>:签署标签
轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。创建:git tag <tag-name>
git show <tag-name>:查看相应标签的版本信息