Git 是一个分布式版本管理系统,即每个终端都有一套完整的项目代码(包括历史文件)。为了使用 Git,先要安装 Git。可以在 Command Line 或者 Terminal 中输入git
命令检查是否已经安装。
先要创建一个文件夹来保存项目代码。例如我使用如下目录:
/Users/renfei/Sites/project
命令行中cd
到这个目录,然后执行git init
命令来初始化:
bogon:~ renfei$ cd /Users/renfei/Sites/project
bogon:project renfei$ git init
Initialized empty Git repository in /Users/renfei/Sites/project/.git/
使用git remote add
命令:
bogon:buaa-weixin renfei$ git remote add proj https://[email protected]/developers/proj.git
上面的 proj 是一个本地别名,可以起得短一些,以便以后使用。后面的地址则是远程仓库得地址。添加之后,可以使用git remote
命令查看当前已有的远程仓库。
使用 git fetch
命令。
bogon:project renfei$ git fetch proj
remote: Counting objects: 39, done.
remote: Compressing objects: 100% (34/34), done.
remote: Total 39 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (39/39), done.
From https://bitbucket.org/renfeisong/project
* [new branch] develop -> proj/develop
* [new branch] master -> proj/master
会看到得到了服务器上的文件,以及两个分支,develop 和 master。这里得到得分支数目取决于远程仓库的内容。虽然得到了这些东西,但是现在这些文件还没有出现在你的工作目录中。
这是因为,我们需要利用git checkout
命令「检出」(实际就是把工作目录切换到某个分支),才可以看到对应分支下的那些文件。
使用 checkout
命令。
bogon:project renfei$ git checkout develop
Branch develop set up to track remote branch develop from proj.
Switched to a new branch 'develop'
例子中我们切换到了 develop 分支,其中对应的文件就都出现了(如果有的话)。
分支是 Git 的一个很重要的功能,因此有必要解释一下。如果把随着时间的推移,代码的变化想象成前进的路线,那么分支就是从路线上的某一点衍生出来的一条支线,在这条支线上的开发不会对原先路线的代码造成任何影响。例如,现在我们有一个 master 分支和一个 develop 分支,master 分支发布稳定版本的应用,而 develop 分支则进行日常开发。一旦达到某个进度节点,develop 分支上的代码足够稳定可以发布,就把 develop 分支合并(merge)到 master 分支,同时继续 develop 分支的开发。
再如,develop 分支开发的过程中出现了某个 bug,一个开发人员想解决这个 bug,那么为了不影响其他人的工作,他可以从 develop 分支再创建一个新的分支 hotfix,然后在这个分支下修改,完成后把它合并回 develop 分支,并删除 hotfix 分支(它的历史使命已经完成)。
可以看出,每个分支都有一套代码。每个开发人员本地都保存了全部分支的全部代码(这些代码连同其他信息被 git 有序地组织在了工作目录下 .git 目录中,这个目录应当是隐藏的),当通过checkout branch_name
切换分支时,工作目录下可见的文件也会被切换成当前分支下的文件。而其他分支的文件也并没有丢失,所以非常方便,你可以根据需要切换分支进行不同的工作。
在工作目录中创建的新文件处于 untracked 状态,即没有被 git 跟踪。新文件不会自动被 git 跟踪,因为许多临时文件、日志文件不需要保存到仓库中。如果要往仓库中添加文件,使用 git add
命令。
bogon:project renfei$ git add *
上述做法添加所有文件。如果包含文件夹,则会递归地添加里面的文件。也可以添加单独的文件或者在文件名中使用通配符。
要查看当前状态(哪些文件 untracked,哪些文件处于其他状态等)可以使用 git status
命令。
执行 git add
后,新添加的文件状态(可通过git status
查看)变为 change to be committed,或者称为 staged,暂存。意思就是,只要把它 commit 上去就可以了。
如果修改了某个已跟踪的文件,那么这个文件会变为 modified,not staged,未暂存。此时必须再次 git add
这个文件使它变成 staged 状态,才能够被 commit 上去。
当有文件状态为暂存的(staged)时,就可以执行 git commit
命令。这个命令会提交暂存的文件。git 要求为每次提交添加一个说明,因此一般使用一个-m
选项来添加说明。例如:
bogon:project renfei$ git commit -m "background admin site (backend) added"
[develop 7d17136] background admin site (backend) added
16 files changed, 10372 insertions(+)
create mode 100644 bootstrap/v2/css/bootstrap-responsive.css
create mode 100644 bootstrap/v2/css/bootstrap-responsive.min.css
create mode 100644 bootstrap/v2/css/bootstrap.css
create mode 100644 bootstrap/v2/css/bootstrap.min.css
create mode 100644 bootstrap/v2/img/glyphicons-halflings-white.png
create mode 100644 bootstrap/v2/img/glyphicons-halflings.png
create mode 100644 bootstrap/v2/js/bootstrap.js
create mode 100644 bootstrap/v2/js/bootstrap.min.js
create mode 100644 define.php
create mode 100644 index.php
create mode 100644 jquery/jquery-1.10.2.min.js
create mode 100644 login.php
create mode 100644 logout.php
create mode 100644 pref.php
create mode 100644 signup.php
create mode 100644 util.php
这个操作完成后,代码就被提交到了本地仓库。每次进行 commit 后都会对整个项目做一个快照,以后可以随时回滚到某个快照中。
如果希望省略 add 过程而直接提交所有跟踪的文件,可以给 commit
命令加上-a
选项。如下:
bogon:project renfei$ git commit -a -m "background admin site (backend) added"
commit
仅仅把更改提交到了本地仓库。如果想推送到远程仓库,需要使用 git push
命令。
bogon:project renfei$ git push proj develop
Counting objects: 25, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (22/22), done.
Writing objects: 100% (24/24), 122.16 KiB | 0 bytes/s, done.
Total 24 (delta 1), reused 0 (delta 0)
To https://[email protected]/renfeisong/project.git
d4eeb86..7d17136 develop -> develop
其中 proj
是之前设定的代号,而 develop
表示推送本地仓库的 develop
分支。
此时,可以随时使用 git pull
命令来从远程仓库拉取更新。
bogon:project renfei$ git pull
Already up-to-date.
如果没有更新,就会显示 Already up-to-date
.
Git 还有很多很多功能,比如从仓库移除文件、重命名、比较等。可以参考 Pro Git 这本书,是基于 CC 协议发布的。地址:http://git-scm.com/book/zh