如何工作
版本控制系统
版本控制系统有两类:集中式与分布式。 分布式版本系统的代表是 Git,而集中式版本系统的代表是 SVN(Subversion)。
集中式和分布式的区别在于:集中式只有中心服务器有一份代码,而分布式则是每个人的电脑上都有一份代码。这样就会存在安全问题,当中心服务器挂掉的时候,使用集中式版本控制系统的团队就没法工作了。而且集中式版本管理系统依赖中心服务器,所以必须联网才能操作。而 Git 没网也能进行创建项目,修改代码等操作,有网后再 push 到远程的服务端即可。
Git 的基本工作流

如上图所示,是 Git 的基本工作流。一个 Git 项目可以看成以下 3 部分:
- Working Directory(工作目录):将会在该工作目录下完成所有的操作,如新建,编辑,删除和组织文件。
- Staging Area(暂存区域):将在其中列出对工作目录所做的更改。
- Repository(仓库):在其中 Git 将这些更改永久存储为项目的不同版本。
一个基本的 Git 工作流包括:编辑工作目录中的文件,将文件添加到临时区域以及将更改保存到 Git 仓库。
git init
初始化命令。该命令会初始化设置 Git 跟踪项目所做更改所需的所有工具。
git status
查询状态命令。可以在更改后使用该命令来查看当前的状态。
例如,我修改了 git_practice
本地仓库的 README.txt 中的内容。然后使用 git status
来查询当前的状态。如下所示,当前的状态是 modified
。

git diff
由于跟踪了文件,我们可以检查工作目录和暂存区域之间的差异。这时可以使用 git diff filename
这个命令。在将该文件 add
到暂存区域前使用。

git add
为了让 Git 开始跟踪 README.txt 文件,需要将文件添加到暂存区域。
可以使用 git add filename
这个命令来将文件添加到暂存区。

也可以一次性添加很多的文件:
git add scene-1.txt scene-2.txt scene-3.txt
git commit
git commit
是我们 Git 工作流程的最后一步。该命令用于永久存储来自仓库的暂存区域的更改。
但是,提交还需要一些代码,如选项 -m 后跟消息。如下例子所示:
git commit -m "First commit"
提交消息的标准约定:
- Must be in quotation marks 必须使用引号
- Written in the present tense 使用现在时态
- Should be brief (50 characters or less) when using -m 信息必须简短,少等于 50 个字符

git log
通常使用 Git 的时候,需要回顾一个项目的早期版本。提交按时间顺序存储在存储库中,所以可以通过 git log
命令查看。
在输出中,需要注意: 一串 40 个字符的代码,称为 SHA,用于唯一标识提交,以橙色文字显示。 之后还包含提交作者 ,提交的日期和时间以及提交消息。
git push
如果需要将本地代码更新至 GitHub 上,可以使用 git push
命令。

git pull
将远程仓库更新至本地仓库可以使用 git pull
命令。

关于 git push
和 git pull
,更详细可以查看:阮一峰的博客 - Git远程操作详解
如何回溯
HEAD commit
在 Git 中,当前正在进行的提交称为 HEAD
提交。在许多情况下,最近的提交都是 HEAD
提交。查看 HEAD
提交可以使用git show HEAD
命令。
git checkout
当你不小心修改了源文件中的一些东西,这时候还没有执行 git add
操作,然后又不知道怎么执行 undo 的操作,可以使用这个命令:
git checkout HEAD filename
比如,我将自己 git_practice
这个 repo 的 README.txt
文件进行了一些修改。这时,可以先使用 git diff
来查看修改的内容:

然后使用上面那个新命令 git checkout HEAD README.txt
,最后回去查看 README.txt
文件,发现修改的内容被还原了:

git reset I
当你不小心修改了源文件中的一些东西,并且已经执行了 git add
操作,然后又不知道怎么执行 undo 的操作,可以使用这个命令:
git checkout HEAD filename
比如,我将 README.txt
的 Let's play Git!
这条语句删除,并执行 add 操作。
这时,可以使用 git reset HEAD README.txt
命令。此命令将暂存区域中的文件重置为与 HEAD 提交相同。但它不会还原工作目录中的文件更改,只是将它们从暂存区域中删除。
git reset II
创建项目就像在森林里徒步旅行。有时你走错了路,发现自己迷路了。 就像在徒步旅行中回溯你的步骤一样,Git 也可以让你在转弯前回到部位。这时候可以使用 git reset commit_SHA
命令。
此命令通过使用先前提交的 SHA 的前 7 个字符来工作。例如,如果先前提交的 SHA 为 5d692065cf51a2f50ea8e7b19b5a7ae512f633ba
,那么可以这样用:
git reset 5d69206
为了更好的理解这个 reset 的操作,可以看下面这幅图,其中每个圆圈代表一个提交。

- 在 reset 之前:
- HEAD 是最近的提交
- 在 reset 之后:
- HEAD 进入你之前做出的选择
- 灰色的提交不再是你项目的一部分了
- 这时候已经重绕了该项目的历史
遇到的一些问题
- 超过最大上传限制:
解决方案:Working with large files
参考
[1]. codecademy - Learn Git
[2]. CS-Notes - git
网友评论