1.获取仓库
有两种取得Git项目仓库的方法:
第一种是在现有项目或目录下导入所有文件到Git中;
第二种是从一个服务器克隆一个现有的Git仓库。
1.1 在现有项目中初始化仓库
如果你打算使用Git来对夏安有的项目进行管理,你只需要进入该项目目录并输入:
$ git init
该命令将创建一个名为.git
的子目录,这个字目录含有你初始化的Git仓库中所有的必须文件,这些文件是Git仓库的骨干。但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。
如果你是在一个已经存在文件的文件夹(而不是空文件夹)中初始化Git仓库来进行版本控制的话,你应该开始跟踪这些文件并提交。你可通过git add
命令来实现对指定文件的跟踪,然后执行git commit
提交:
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'
1.2 科隆现有的仓库
如果你想获得一份已经存在了的Git仓库的拷贝,比如说,你想为某个开源项目贡献一份力,这时就要用到git clone
命令。Git克隆的是该Git仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。当你执行git clone
命令的时候,默认配置下远程Git仓库中的每一个文件的每一个版本都将被拉取下来。事实上,如果你的服务器的磁盘坏掉了,你通常可以使用任何一个克隆下来的用户端来重建服务器上的仓库。
克隆仓库的命令格式是git clone [url]
。比如,要克隆Git的链接库libgit2,可以用下面的命令:
$ git clone https://github.com/libgit2/libgit2
这会在当前目录下床看一个名为“libgit2”的目录,并在这个目录下初始化一个.git
文件夹,从远程仓库拉取下所有数据放入.git
文件夹,然后从中读取最新版本的文件的拷贝。如果你进入到这个新建的gitlib2
文件夹,你会发现所有的项目文件已经在里面了,准备就绪等待后续的开发和使用。如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以使用如下命令:
$ git clone https://github.com/libgit2/libgit2 mylibgit
这将执行与上一个命令相同的作用,不过在本地创建的仓库名字变为mylibgit
。
Git支持多种数据传输协议。上面的例子使用的是https://
协议,不过你也可以使用git://
协议或者食用SSH传输协议,比如user@server:path/to/repo.git
。
2. 记录每次更新到仓库
现在我们手上有了一个真实项目的Git仓库,并从这个仓库中取出了序哦呦文件的工作拷贝。接下来,对这些文件做些修改,在完成了一个阶段的目标之后,调本次更新到仓库。
请记住,你工作目录下的每一个文件都不外乎两种状态:已跟踪或未跟踪。已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。工作目录中除已跟踪文件以外的所有其它文件都属于为跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
编辑过某些文件之后,由于自上次提交后你对他们做了修改,Git将它们标记为修改文件。我们逐步将这些修改过的文件放入暂存区,然后提交所哦呦暂存了的修改,如此反复。所以使用Git时文件的生命周期如下:
2.1 检查当前文件状态
要查看那些文件处于什么状态,可以用git status
命令。如果在克隆仓库后立即使用此命令,会看到类似这样的输出:
$ git status
On branch master
nothing to commit, working directory clean
这说明你现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过。 此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪状态的新文件,否则 Git 会在这里列出来。 最后,该命令还显示了当前所在分支,并告诉你这个分支同远程服务器上对应的分支没有偏离。 现在,分支名是 “master”,这是默认的分支名。
现在,让我们在项目下创建一个新的 README 文件。 如果之前并不存在这个文件,使用 git status 命令,你将看到一个新的未跟踪文件:
$ echo 'My Project' > README
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
在状态报告中可以看到新建的 README 文件出现在Untracked files
下面。 未跟踪的文件意味着 Git 在之前的快照(提交)中没有这些文件;Git 不会自动将之纳入跟踪范围,除非你明明白白地告诉它“我需要跟踪该文件”, 这样的处理让你不必担心将生成的二进制文件或其它不想被跟踪的文件包含进来。 不过现在的例子中,我们确实想要跟踪管理 README 这个文件。
2.2 跟踪新文件
使用命令git add
开始跟踪一个文件。 所以,要跟踪 README 文件,运行:
$ git add README
此时再运行git status
命令,会看到 README 文件已被跟踪,并处于暂存状态:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
只要在Changes to be committed
这行下面的,就说明是已暂存状态。 如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中。 你可能会想起之前我们使用git init
后就运行了git add (files)
命令,开始跟踪当前目录下的文件。git add
命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
2.3 暂存已修改文件
现在我们来修改一个已被跟踪的文件。 如果你修改了一个名为 CONTRIBUTING.md 的已被跟踪的文件,然后运行 git status 命令,会看到下面内容:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
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
文件CONTRIBUTING.md
出现在Changes not staged for commit
这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。 要暂存这次更新,需要运行git add
命令。 这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。 现在让我们运行git add
将"CONTRIBUTING.md"放到暂存区,然后再看看git status
的输出:
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
现在两个文件都已暂存,下次提交时就会一并记录到仓库。 假设此时,你想要在CONTRIBUTING.md
里再加条注释,重新编辑存盘后,准备好提交。 不过且慢,再运行git status
看看:
$ vim CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
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
现在CONTRIBUTING.md
文件同时出现在暂存区和非暂存区。 这怎么可能呢? 好吧,实际上 Git 只不过暂存了你运行git add
命令时的版本, 如果你现在提交,CONTRIBUTING.md
的版本是你最后一次运行git add
命令时的那个版本,而不是你运行git commit
时,在工作目录中的当前版本。 所以,运行了git add
之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来:
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
2.4 状态简览
git status
命令的输出十分详细,但其用语有些繁琐。 如果你使用git status -s
命令或git status --short
命令,你将得到一种更为紧凑的格式输出。 运行git status -s
,状态报告输出如下:
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt