起步:
版本控制:
1.本地版本控制系统:大多都是采用某种简单的数据库来记录文件的历次更新差异。
RCS:Mac OS X也可以使用,
工作原理:在硬盘上保存补丁集(补丁是指文件修订前后的变化);
通过应用所有的补丁,可以重新计算出各个版本的文件内容。
2.集中化的版本控制系统:
在不同系统上的开发者协同工作,Centralized Version Control Systems,集中化的版本控制系统简称 CVCS,
单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
优点:相对于本地VCS来说;每个人都可以在一定程度上看到项目中 的其他人正在做些什么;
缺点:中央服务器的单点故障。
3.分布式版本控制系统(Distributed Version Control System,简称 DVCS)——Git
优势:直接记录快照,而非差异比较;
近乎所有操作都是本地执行;
这也意味着你离线或者没有 VPN 时,几乎可以进行任何操作。
Git 保证完整性
Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。
Git 数据库中保存的信息都是以文件内 容的哈希值来索引,而不是文件名。
Git 一般只添加数据
你执行的 Git 操作,几乎只往 Git 数据库中增加数据
4.Git的三种状态
Git 有三种状态,你的文件可能处 于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。
已提交表示数据已经安全的 保存在本地数据库中。
已修改表示修改了文件,但还没保存到数据库中。
已暂存表示对一个已修改文件的当前 版本做了标记,使之包含在下次提交的快照中。
5.Git 项目的三个工作区域:Git 仓库、工作目录以及暂存区域
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。
这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中
工作目录是对项目的某个版本独立提取出来的内容。
6.命令行
Git 有多种使用方式。 你可以使用原生的命令行模式,也可以使用 GUI 模式。
这里推荐使用命令行。
7.安装 Git(我使用的是Mac,所以这里介绍在Mac上安装,其他操作系统具体看官方文档)
在 Mac 上安装 Git 有多种方式。 最简单的方法是安装 Xcode Command Line Tools。 Mavericks (10.9) 或 更高版本的系统中,在 Terminal 里尝试首次运行 git 命令即可。
8.初次运行 Git 前的配置
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。
这些变量存储在三个不同的位置:
1./etc/gitconfig 文件:
2.~/.gitconfig 或 ~/.config/git/config 文件
3.当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库
用户信息:
git config --global user.name "username"
git config --global user.email "xxxx@example.com"
文本编辑器
既然用户信息已经设置完毕,你可以配置默认文本编辑器了,当 Git 需要你输入信息时会调用它。 如果未配 置,Git 会使用操作系统默认的文本编辑器,通常是 Vim。 如果你想使用不同的文本编辑器,例如 Emacs,可以 这样做:
$ git config --global core.editor emacs
检查配置信息
如果想要检查你的配置,可以使用git config --list命令来列出所有Git当时能找到的配置。
你可以通过输入 git config <key>: 来检查 Git 的某一项配置
获取帮助
若你使用 Git 时需要获取帮助,有三种方法可以找到 Git 命令的使用手册:
git help <verb>
git <verb> --help
man git-<verb>
例如,要想获得 config 命令的手册,执行 git help config
Git基础
学习完本章之后,你应该能够配置并初始化一个仓库(repository)、开始或停止跟踪 (track)文件、暂存(stage)或提交(commit)更改。
本章也将向你演示如何配置 Git 来忽略指定的文件和文件模式、
如何迅速而简单地撤销错误操作、如何浏览你的项目的历史版本以及不同提交(commits)间的差异、
如何向你的远程仓库推送(push)以及如何从你的远程仓库拉取(pull)文件。
1.获取 Git 仓库
有两种取得 Git 项目仓库的方法。
第一种是在现有项目或目录下导入所有文件到 Git 中;
第二种是从一个服务器克隆一个现有的 Git 仓库。
2.在现有目录中初始化仓库
git init
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。
但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。
如果你是在一个已经存在文件的文件夹(而不是空文件夹)中初始化 Git 仓库来进行版本控制的话,你应该开始 跟踪这些文件并提交。你可通过git add命令来实现对指定文件的跟踪,然后执行git commit提交:
git add *.c
git add LICENSE
git commit -m 'initial project version'
3.克隆现有的仓库
如果你想获得一份已经存在了的 Git 仓库的拷贝,比如说,你想为某个开源项目贡献自己的一份力,这时就要用 到 git clone 命令。
克隆仓库的命令格式是 git clone [url]
例子(我本人的URL):git clone https://gitee.com/yangpuqian/python-django.git
这会在当前目录下创建一个名为 “python-django” 的目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉 取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。
注意:Git 支持多种数据传输协议。我记得好像有三种(git:// https:// 还有一种)
4.记录每次更新到仓库
请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。
5.检查当前文件状态
用 git status 命令
git status
On branch master
nothing to commit, working directory clean
说明你现在的工作目录相当干净
第一步:先创建一个README文件,在使用git status
6.跟踪新文件
使用命令 git add 开始跟踪一个文件.
git add README
此时再运行git status命令,会看到README文件已被跟踪,并处于暂存状态:

只要在 Changes to be committed 这行下面的,就说明是已暂存状态
7.暂存已修改文件
现在我们来修改一个已被跟踪的文件。 如果你修改了一个名为
read.txt的已被跟踪的文件,然后运 行git status命令,会看到下面内容:

文件出现在Changes not staged for commit这行下面,说明已跟踪文件的内容发 生了变化,但还没有放到暂存区,要暂存这次更新,需要运行 git add 命令。
现在让我们运行 git add将"../learngit1/read.txt"放到暂存区,然后再看看git status的输出:

现在两个文件都已暂存,下次提交时就会一并记录到仓库。
假设此时,你想要在 read.txt 里再加条 注释, 重新编辑存盘后,准备好提交。 不过且慢,再运行 git status 看看:

怎么回事? 现在read.txt 文件同时出现在暂存区和非暂存区。 这怎么可能呢? 好吧,实际上 Git 只 不过暂存了你运行 git add 命令时的版本, 如果你现在提交,read.txt 的版本是你最后一次运行 git add 命令时的那个版本,而不是你运行 git commit 时,在工作目录中的当前版本。 所以,运行了 git add之后又作了修订的文件,需要重新运行git add把最新版本重新暂存起来:

git status 命令的输出十分详细,但其用语有些繁琐。
如果你使用 git status -s 命令或 git status --short命令,你将得到一种更为紧凑的格式输出。运行git status -s,状态报告输出如下:
拿书上的例子解释一下:

新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 你可能注意到了 M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区
Rakefile 在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改 了的记录。
8.忽略文件
创建一个名为 .gitignore 的文件,列出要忽略的文件模式。
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文 件,比如日志文件,或者编译过程中创建的临时文件等。
$ cat .gitignore *.[oa] 第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件 *~ 第二行告诉 Git 忽略所有以波浪符(~)结尾的文件
.gitignore 的格式规范如下:
• 所有空行或者以 # 开头的行都会被 Git 忽略。
• 可以使用标准的 glob 模式匹配。
• 匹配模式可以以(/)开头防止递归。
• 匹配模式可以以(/)结尾指定目录。
• 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。
星号(*)匹配零个或多个任意字符;
[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
问号(? )只匹配一个任意字符;
如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配 (比如 [0-9] 表示匹配所有 0 到 9 的数字)。
使用两个星号(*) 表示匹配任意中间目录,比如`a/**/z` 可以匹 配 a/z, a/b/z 或 `a/b/c/z`等。
9.查看已暂存和未暂存的修改
git diff
你想知道具体修改了什么地方,可以用git diff命令
要查看尚未暂存的文件更新了哪些部分,不加参数直接输入git diff:
git diff --staged——若要查看已暂存的将要添加到下次提交里的内容
git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。所以有时候你一下子暂 存了所有更新过的文件后,运行git diff后却什么也没有,就是这个原因。
10.提交更新
每次准备提交前,先用 git status 看下,是不是都已暂存起来了, 然后再运行提交命令 git commit:
11.跳过使用暂存区域
给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存 起来一并提交,从而跳过git add步骤:
git commit -a -m 'added new benchmarks'
12.移除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。 可以用git rm命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清 单中了。
rm PROJECTS.md git status 然后再运行git rm记录此次移除文件的操作: git rm PROJECTS.md git status
如果删除之前修改过并且已经放到暂存区域的话,则必须要用 强制删除选项 -f(译注:即 force 的首字母)
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录 中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当你忘记添加 .gitignore 文件,不小 心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。 为达到这一目 的,使用 --cached 选项:
git rm --cached README
git rm log/\*.log
注意到星号 * 之前的反斜杠 \, 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开。 此命令删除 log/ 目录下扩展名为 .log 的所有文件
git rm \*~
该命令为删除以 ~ 结尾的所有文件。
13.移动文件
git mv file_from file_to
git mv README.md README
git status
其实,运行git mv就相当于运行了下面三条命令:
$ mv README.md README $ git rm README.md $ git add README
14.查看提交历史
默认不用任何参数的话,git log会按提交时间列出所有的更新,最近的更新排在最上面
一个常用的选项是 -p,用来显示每次提交的内容差异。 你也可以加上 -2 来仅显示最近两次提交:
git log -p -2
如果你想看到每次提交的简略的统计信息,你可以使用 --stat 选项
git log --stat
另外一个常用的选项是 --pretty,这个选项可以指定使用不同于默认格式的方式展示提交历史。
这个选项有 一些内建的子选项供你使用。 比如用 oneline 将每个提交放在一行显示,查看的提交数很大时非常有用
git log --pretty=oneline
但最有意思的是 format,可以定制要显示的记录格式。
git log --pretty=format:"%h - %an, %ar : %s"
|
选项 说明 |
|
%H 提交对象(commit)的完整哈希字串 |
|
%h 提交对象的简短哈希字串 |
|
%T 树对象(tree)的完整哈希字串 |
|
%t 树对象的简短哈希字串 |
|
%P 父对象(parent)的完整哈希字串 |
|
%p 父对象的简短哈希字串 |
|
%an 作者(author)的名字 |
|
%ae 作者的电子邮件地址 |
|
%ad 作者修订日期(可以用 --date= 选项定制格式) |
|
%ar 作者修订日期,按多久以前的方式显示 |
|
%cn 提交者(committer)的名字 |
|
%ce 提交者的电子邮件地址 |
|
%cd 提交日期 |
|
%cr 提交日期,按多久以前的方式显示 |
|
%s 提交说明 |
当 oneline 或 format 与另一个 log 选项 --graph 结合使用时尤其有用
git log --pretty=format:"%h %s" --graph
--graph 显示 ASCII 图形表示的分支合并历史
15.限制输出长度
下面的命令列出所有最近两周内的提交:
git log --since=2.weeks
限制 git log 输出的选项
|
选项 说明 |
|
-(n) 仅显示最近的 n 条提交 |
|
--since, --after 仅显示指定时间之后的提交。 |
|
--until, --before 仅显示指定时间之前的提交。 |
|
--author 仅显示指定作者相关的提交。 |
|
--committer 仅显示指定提交者相关的提交。 |
|
--grep 仅显示含指定关键字的提交 |
|
-S 仅显示添加或移除了某个关键字的提交 |
git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
--before="2008-11-01" --no-merges -- t/
15.撤消操作
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选 项的提交命令尝试重新提交:
git commit --amend
这个命令会将暂存区中的文件提交,如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了 此命令),那么快照会保持不变,而你所修改的只是提交信息。
你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:
$ git commit -m 'initial commit' $ git add forgotten_file $ git commit --amend
最终你只会有一个提交 ,第二次提交将代替第一次提交的结果。
16.取消暂存的文件
例如,你已经修改了两个文件并且想要将它们作为两次独立的修改提交,但是却意外地输 入了 git add * 暂存了它们两个。 如何只取消暂存两个中的一个呢? git status 命令提示了你
$ git add * $ git status On branch master Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
git reset HEAD <file>... 来取消暂存
git reset HEAD CONTRIBUTING.md
不加选项地调用git reset并不危险,它只会修改暂存区域。
16.撤消对文件的修改
如果你并不想保留对 CONTRIBUTING.md 文件的修改怎么办?
幸运的是,git status也告诉了你 应该如何做。 在最后一个例子中,未暂存区域是这样:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working
directory)
modified: CONTRIBUTING.md
它非常清楚地告诉了你如何撤消之前所做的修改。 让我们来按照提示执行:
git checkout -- CONTRIBUTING.md
你需要知道git checkout -- [file]是一个危险的命令,这很重要。你对那个文件做的任何修改都会消失 - 你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要那个文件了,否则不要使用这个命令。
17.远程仓库的使用
1.查看远程仓库,可以运行 git remote 命令
git clone url
cd 目录名
git remote
git remote -v
如果你的远程仓库不止一个,该命令会将它们全部列出
2.添加远程仓库
git remote add <shortname> <url>添加一个新的远程Git仓库,同时指定一个你可以轻松引用的简 写:
git remote add pb url
现在你可以在命令行中使用字符串 pb 来代替整个 URL。 例如,如果你想拉取 Paul 的仓库中有但你没有的信 息,可以运行git fetch pb
3.从远程仓库中抓取与拉取
从远程仓库中获得数据,可以执行:
git fetch [remote-name]这个命令会访问远程仓库,从中拉取所有你还没有的数据.
必须注意git fetch命令会将 数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
可以使用git pull命 令来自动的抓取然后合并远程分支到当前分支。
运行git pull通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
4.推送到远程仓库
git push [remote-name] [branch- name]
git push origin master
5.查看远程仓库
git remote show [remote-name]
git remote show origin
6.远程仓库的移除与重命名
如果想要重命名引用的名字可以运行 git remote rename 去修改一个远程仓库的简写名。 例如,想要将 pb 重命名为paul,可以用git remote rename这样做
git remote rename pb paul
git remote
origin
paul
值得注意的是这同样也会修改你的远程分支名字。 那些过去引用 pb/master 的现在会引用 paul/master。
如果因为一些原因想要移除一个远程仓库 - 你已经从服务器上搬走了或不再想使用某一个特定的镜像了,又或者某一个贡献者不再贡献了-可以使用
git remote rm paul
git remote
origin
18.打标签
1.列出标签
在 Git 中列出已有的标签是非常简单直观的。 只需要输入 git tag
如果只对 1.8.5系列感兴趣,可以运行: git tag -l 'v1.8.5*'
2.创建标签
Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。
附注标签:
在 Git 中创建一个附注标签是很简单的。 最简单的方式是当你在运行 tag 命令时指定 -a 选项:
git tag -a v1.4 -m 'my version 1.4'
-m 选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息,Git 会运行编辑器要求你输 入信息。
通过使用git show命令可以看到标签信息与对应的提交信息:
git show v1.4
轻量标签:创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字:
git tag v1.4-lw
git tag
这时,如果在标签上运行 git show,你不会看到额外的标签信息。 命令只会显示出提交信息
git show v1.4-lw
后期打标签:
你也可以对过去的提交打标签。 假设提交历史是这样的:
git log --pretty=oneline
现在,假设在 v1.2 时你忘记给项目打标签,也就是在 “updated rakefile” 提交。 你可以在之后补上标签。 要 在那个提交上打标签,你需要在命令的末尾指定提交的校验和(或部分校验和):
git tag -a v1.2 commit-id(9fceb02 )
可以看到你已经在那次提交上打上标签了:
git tag
git show v1.2
共享标签:git push origin [tagname]
$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
本文介绍了Git,一种分布式版本控制系统,包括其三种版本控制系统类型:本地版本控制系统、集中化版本控制系统和分布式版本控制系统(如Git)。重点讲述了Git的优势,如直接记录快照、所有操作本地执行和数据完整性保障。还详细讲解了Git的工作流程,如三种文件状态(已提交、已修改、已暂存),以及Git仓库、工作目录和暂存区域的概念。此外,还涵盖了Git的安装、配置、常用命令及远程仓库的使用,包括克隆、推送和拉取。最后提到了Git的标签功能,用于对特定提交打标签以便后续引用。
1137

被折叠的 条评论
为什么被折叠?



